verdimodelsim联合仿真.docx
- 文档编号:10518740
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:29
- 大小:41.67KB
verdimodelsim联合仿真.docx
《verdimodelsim联合仿真.docx》由会员分享,可在线阅读,更多相关《verdimodelsim联合仿真.docx(29页珍藏版)》请在冰豆网上搜索。
verdimodelsim联合仿真
(筆記)如何使用Debussy與ModelSim做Co-Simulation?
(SOC)(Verilog)(VHDL)(Debussy)(ModelSim)
Abstract
本文介紹如何使用Debussy與ModelSim做Co-Simulation,並使用Verilog、VHDL以及Verilog搭配VHDL交叉一起simulation。
Introduction
使用環境:
Debussy5.4v9+ModelSimSE6.3e
我之前一直使用Debussy+NC-Verilog做simulation,Debussy(Verdi)可以說是HDL的SourceInsight,是trace與debug的神兵利器,NC-Verilog也是Verilogsimulator中速度最快的,可是最近因工作需要,拿到的一包code卻是用Verilog寫RTL,用VHDL寫testbench,所以必須2種語言一起做simulation,我在NC-Verilog一直無法成功讓兩種語言一起simulation。
ModelSim雖然支援Verilog+VHDLco-simulation,但用慣Debussy的我還是無法忘懷其方便的tracecode方式,所以若能讓ModelSim也能dump出Debussy所需要的fsdb檔案,這樣就太完美了。
接下來會分4個方式討論
1.RTL與testbench皆使用Verilog
2.RTL與testbench皆使用VHDL
3.RTL使用VHDL,testbench使用Verilog
4.RTL使用Verilog,testbench使用VHDL
1.RTL與testbench皆使用Verilog
Step1:
設定ModeSim使用VerilogPLI(因為testbench使用Verilog)
將C:
\Novas\Debussy\share\PLI\modelsim_pli\WINNT\novas.dll複製到C:
\Modeltech_6.3e\win32\下
修改C:
\Modeltech_6.3e\modelsim.ini,將Veriuser部分修改成如下所示:
;ListofdynamicallyloadedobjectsforVerilogPLIapplications
;Veriuser=veriuser.sl
;usebyverilog
Veriuser=novas.dll
;usebyvhdl
;Veriuser=novas_fli.dll
modelsim.ini是個readonly檔,要修改前記得修改其屬性才能存檔。
Step2:
RTL部分(以4bitcounter為例)
counter.v/Verilog
1/*
2(C)OOMusou2011
3
4Filename:
counter.v
5Simulator:
ModelSim6.3e,Debussy5.4v9
6Description:
ModelSimwithdebussy
7Release:
01/31/20101.0
8 */
9
10 modulecounter(
11clk,
12rst_n,
13cnt
14);
15
16 inputclk;
17 inputrst_n;
18 output[3:
0]cnt;
19
20 reg[3:
0]cnt;
21
22 always@(posedgeclk,negedgerst_n)begin
23if(~rst_n)
24cnt<=4'h0;
25 else
26cnt<=cnt+1'b1;
27 end
28
29 endmodule
Step3:
Testbench部分
counter_tb.v/Verilog
1/*
2(C)OOMusou2011
3
4Filename:
counter_tb.v
5Compiler:
ModelSim6.3e,Debussy5.4v9
6Description:
ModelSimwithdebussy
7Release:
01/31/20101.0
8 */
9
10 modulecounter_tb;
11
12 regclk;
13 regrst_n;
14 wire[3:
0]cnt;
15
16 //50MHz
17 always#(10)clk=~clk;
18
19 initialbegin
20#0;
21clk=1'b0;
22 rst_n=1'b0;
23
24#5;
25rst_n=1'b1;
26 #195;
27$finish;
28 end
29
30 initialbegin
31$fsdbDumpfile("counter.fsdb");
32$fsdbDumpvars(0,counter_tb);
33 end
34
35counteru_counter(
36.clk(clk),
37.rst_n(rst_n),
38.cnt(cnt)
39);
40
41 endmodule
19行
initialbegin
#0;
clk=1'b0;
rst_n=1'b0;
#5;
rst_n=1'b1;
#195;
$finish;
end
一搬來說,若在NC-Verilog做simulation,我們會在testbench內指定結束simulation的時間,不過在ModelSim裡,simulation時間是由ModelSimscript控制,在testbench內寫$finish並沒有用,所以會省略$finish時間入下。
initialbegin
#0;
clk=1'b0;
rst_n=1'b0;
#5;
rst_n=1'b1;
end
Step4:
ModelSimscript部分
vsim.do
vlibwork
vlogcounter.v
vlogcounter_tb.v
vsimcounter_tb
run200ns
q
其中
vlibwork
建立worklibrary。
vlogcounter.v
vlogcounter_tb.v
編譯RTL:
counter.v與testbench:
counter_tb.v,vlog為modelsim的Verilogcompiler。
vsimcounter_tb
以counter_tb為topmodule進行simulation。
run200ns
命令ModelSim執行200ns的simulation。
q
離開ModelSim
Step5:
執行ModelSim的批次檔
mod.bat
vsim-c-dosim.do
-c表示ModelSim將以consolemode執行,因為在Debussy+ModelSim時,只把ModelSim當成NC-Verilog使用,並沒有用到ModelSim的GUI模式。
-do表示執行ModelSimscript。
執行結果
D:
\0Clare\VerilogLab\ModelSim\counter_verilog>vsim-c-dosim.do
ReadingC:
/Modeltech_6.3e/tcl/vsim/pref.tcl
#6.3e
#dosim.do
#**Warning:
(vlib-34)Libraryalreadyexistsat"work".
#ModelTechnologyModelSimSEvlog6.3eCompiler2008.02Feb22008
#--Compilingmodulecounter
#
#Toplevelmodules:
#counter
#ModelTechnologyModelSimSEvlog6.3eCompiler2008.02Feb22008
#--Compilingmodulecounter_tb
#
#Toplevelmodules:
#counter_tb
#vsimcounter_tb
#**Note:
(vsim-3813)Designisbeingoptimizedduetomodulerecompilation...
#**Note:
(vsim-3865)DuetoPLIbeingpresent,fulldesignaccessisbeingspecified.
#LoadingC:
\Modeltech_6.3e\win32/novas.dll
#//ModelSimSE6.3eFeb22008
#//
#//Copyright1991-2008MentorGraphicsCorporation
#//AllRightsReserved.
#//
#//THISWORKCONTAINSTRADESECRETAND
#//PROPRIETARYINFORMATIONWHICHISTHEPROPERTY
#//OFMENTORGRAPHICSCORPORATIONORITSLICENSORS
#//ANDISSUBJECTTOLICENSETERMS.
#//
#Loadingwork.counter_tb(fast)
#Loadingwork.counter(fast)
#NovasFSDBDumperforModelSim,Release5.4v9(Win95/NT)05/04/2005
#Copyright(C)1996-2004byNovasSoftware,Inc.
#*Novas*CreateFSDBfile'counter.fsdb'
#*Novas*Startdumpingthescope(counter_tb),layer(0).
#*Novas*Endofdumping.
#**Note:
$finish:
counter_tb.v(27)
#Time:
200nsIteration:
0Instance:
/counter_tb
Step6:
執行Debussy批次檔部份
deb.bat
debussy-2001counter_tb.vcounter.v-ssfcounter.fsdb-sswrcounter.rc
-2001表示支援Verilog2001語法
-ssf載入Debussydumpfile
-sswr載入Debussysignalfile
執行結果
2.RTL與testbench皆使用VHDL
Step1:
設定ModelSim使用VHDLFLI(因為testbench使用VHDL)
將C:
\Novas\Debussy\share\PLI\modelsim_fli54\WINNT\novas_fli.dll複製到C:
\Modeltech_6.3e\win32\下
修改C:
\Modeltech_6.3e\modelsim.ini,將Veriuser部分修改成如下所示:
;ListofdynamicallyloadedobjectsforVerilogPLIapplications
;Veriuser=veriuser.sl
;usebyverilog
;Veriuser=novas.dll
;usebyvhdl
Veriuser=novas_fli.dll
modelsim.ini是個readonly檔,要修改前記得修改其屬性才能存檔。
複製C:
\Novas\Debussy\share\PLI\modelsim_fli54\WINNT\novas.vhd到自己的project底下
(為什麼Verilog不需要這個檔,而VHDL需要這個檔,稍後會解釋)
Step2:
RTL部分(以4bitcounter為例)
counter.vhd/VHDL
1--(C)OOMusou2011
2
3 --Filename:
counter.vhd
4 --Simulator:
ModelSim6.3e,Debussy5.4v9
5 --Description:
ModelSimwithdebussy
6 --Release:
02/05/20111.0
7
8 libraryIEEE;
9 useIEEE.std_logic_1164.all;
10 useIEEE.std_logic_unsigned.all;
11
12 entitycounteris
13port(clk:
instd_logic;
14rst_n:
instd_logic;
15cnt:
outstd_logic_vector(3downto0));
16 endentitycounter;
17
18 architecturearcofcounteris
19signalcnt_r:
std_logic_vector(3downto0);
20 begin
21process(clk,rst_n)
22begin
23if(rst_n='0')then
24cnt_r<="0000";
25elsifrising_edge(clk)then
26cnt_r<=cnt_r+1;
27endif;
28endprocess;
29
30cnt<=cnt_r;
31 endarc;
Step3:
Testbench部分
counter.vhd/VHDL
1--(C)OOMusou2011
2
3 --Filename:
counter_tb.vhd
4 --Simulator:
ModelSim6.3e,Debussy5.4v9
5 --Description:
ModelSimwithdebussy
6 --Release:
01/31/20101.0
7
8 libraryIEEE;
9 useIEEE.std_logic_1164.all;
10 useIEEE.std_logic_unsigned.all;
11 usework.pkg.all;
12
13entitycounter_tbis
14endentitycounter_tb;
15
16architecturearcofcounter_tbis
17componentcounter
18port(
19clk:
instd_logic;
20rst_n:
instd_logic;
21cnt:
outstd_logic_vector(3downto0)
22);
23endcomponent;
24
25signalclk:
std_logic:
='0';
26signalrst_n:
std_logic:
='0';
27signalcnt:
std_logic_vector(3downto0);
28
29begin
30process
31begin--50MHz
32clk_loop:
loop
33clk<='0';
34waitfor10ns;
35clk<='1';
36waitfor10ns;
37endloopclk_loop;
38endprocess;
39
40process
41begin
42waitfor5ns;
43rst_n<='1';
44endprocess;
45
46process
47begin
48fsdbDumpfile("counter.fsdb");
49fsdbDumpvars(0,"counter_tb");
50wait;
51endprocess;
52
53u_counter:
counter
54portmap(
55clk=>clk,
56rst_n=>rst_n,
57cnt=>cnt
58);
59endarc;
11行
usework.pkg.all;
這是因為novas.vhd與VHDLFLI的原因,稍後會解釋。
47行
process
begin
fsdbDumpfile("counter.fsdb");
fsdbDumpvars(0,"counter_tb");
wait;
endprocess;
一樣使用fsdbDumpfile()與fsdbDumpvars()兩個Debussy所提供的函數,不過在VHDLFLI並不需要如VerilogPLI一樣加上$。
wait也一定要加上,否則在ModelSim做simulation時會造成無窮回圈無法停止。
Step4:
ModelSimscript部分
vsim.do
vlibwork
vcomnovas.vhd
vcomcounter.vhd
vcomcounter_tb.vhd
vsimcounter_tb
run200ns
q
因為是VHDL,所以全部改用vcom編譯。
其中novas.vhd是從Debussy目錄複製過來的,為什麼需要編譯這個檔案呢?
VHDLFLI(ForeignLanguageInterface)與VerilogPLI(ProgrammingLanguageInterface)不同的地方在於,當你自己提供由C寫的function給simulator使用時,VerilogPLI會自己到所提供的dll去找是否有此function,但VHDLFLI需要自己去提供mapping的動作,告訴simulator哪一個function對應dll內那ㄧ個function,novas.vhd就是提供這個mapping的腳色。
若直接使用Debussy所提供的novas.vhd,在執行ModelSim會有以下錯誤訊息。
#**Warning:
(vsim-FLI-3159)Failedtofindforeignfunction'fliparseVariableInFile'inFLIobjectfile"C:
\Modeltech_6.3e\win32/./novas_fli.dll".
意思是novas.vhd定義的fliparseVariableInFile在novas_fli.dll找不到,致於為什麼會有此錯誤,我並不清楚。
將novas.vhd修改成如下所示:
novas.vhd/VHDL
1packagepkgis
2attributeforeign:
string;
3
4procedurefsdbDumpfile(file_name:
instring);
5attributeforeignoffsdbDumpfile:
procedureis"fliparseTraceInit./novas_fli.dll";
6
7procedurefsdbDumpvars(depth:
ininteger;
8region_name:
instring);
9attributeforeignoffsdbDumpvars:
procedureis"fliparsePartial./novas_fli.dll";
10end;
11
12packagebodypkgis
13procedurefsdbDumpfile(file_name:
instring)is
14begin
15assertfalsereport"ERROR:
foreignsubprogramnotcalled"severitynote;
16end;
17
18procedurefsdbDumpvars(depth:
ininteger;
19region_name:
instring)is
20begin
21assertfalsereport"ERROR:
foreignsubprogramnotcalled"severitynote;
22end;
23end;
24
25entitynovasisend;
26
27architecturenovas_archofnovasis
28attributeforeign:
string;
29attributeforeignofnovas_arch:
architectureis"fliparseCommandnovas_fli.dll";
30begin
31end;
32
也就是僅留下fsdbDumpfile()與fsdbDumpvars()兩個function,其他的都刪除。
根據我使用Debussy的經驗,只要留這兩個function就夠用了,其他Debussy的function我還真的沒用過。
在novas.vhd也看到了這些是定義在pkg這個package下,所以在counter_tb.vhd必須usework.pkg.all。
Step5:
執行ModelSim的批次檔
mod.bat
vsim
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- verdimodelsim 联合 仿真
![提示](https://static.bdocx.com/images/bang_tan.gif)