modelsim仿真.docx
- 文档编号:6074168
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:15
- 大小:347.77KB
modelsim仿真.docx
《modelsim仿真.docx》由会员分享,可在线阅读,更多相关《modelsim仿真.docx(15页珍藏版)》请在冰豆网上搜索。
modelsim仿真
Abstract
本文介紹使用ModelSim做前仿真,並搭配QuartusII與ModelSim作後仿真。
Introduction
使用環境:
QuartusII8.1+ModelSim-Altera6.3g
由於FPGA可重複編程,所以不少開發人員就不寫testbench,直接使用QuartusII的programmer燒進開發板看結果,或者使用QuartusII自帶的WaveformEditor進行仿真,這種方式雖然可行,但僅適用於小project,若project越寫越大,QuartusII光做fitter就很耗時間,一整天下來都在作QuartusII編譯。
比較建議的方式,還是學ASIC那招:
『寫testbench先對每個module作前仿真,再對每個module作後仿真,最後再燒入FPGA測試。
』
這種方式的優點是:
1.testbench比waveformeditor可更靈活的描述電路規格。
2.testbench可使用Verilog的系統函數,如$display()、$fwrite()...等。
但要使用testbench作仿真,單獨QaurtusII並無法做到,就得使用ModelSim了,這又牽涉到『前仿真』與『後仿真』。
所謂的『前仿真』,就是QuartusII的FunctionalSimulation,不考慮電路的門延遲與線延遲,重點在觀察電路在理想環境下的行為與設計構想是否一致[1]。
由於沒經過fitter階段,所以模擬速度很快。
前仿真結果正確,並不表示將來結果結果正確,但若前仿真結果不正確,則將來結果一定不正確。
所謂的『後仿真』,就是QuartusII的TimingSimulation,考慮了電路的門延遲與線延遲,由於經過fitter階段,所以模擬結果最為精準。
但fitter在QuartusII編譯需耗費很多時間,所以建議『前仿真』正確後,再考慮『後仿真』。
使用QuartusII的waveformeditor作前仿真與後仿真,我就不再多談,本文主要是談如何使用ModelSim-Altera作前仿與後仿。
1.使用GUI的方式在ModelSim-Altera作前仿真。
2.使用DOmacro在ModelSim-Altera作前仿真。
3.使用QuartusII+ModelSim-Altera作後仿真。
Counter.v/Verilog
1 /*
2 (C)OOMusou2008
3
4 Filename :
Counter.v
5 Compiler :
QuartusII8.1/ModelSim-Altera6.3g
6 Description:
simplecounter
7 Release :
01/30/20091.0
8 */
9
10 `timescale1ns/100ps
11
12 moduleCounter(
13 input CLK,
14 input RST_N,
15 output[3:
0]CNT
16 );
17
18 reg[3:
0]cnt;
19 assignCNT=cnt;
20
21 always@(posedgeCLK,negedgeRST_N)begin
22 if(!
RST_N)
23 cnt<=#5 4'h0;
24 else
25 cnt<=#5cnt+ 1'b1;
26 end
27
28 endmodule
复制代码
一個很簡單的counter,從0數到15重複數。
由於要使用ModelSim作前仿,所以在reg做了delay,不過這在QuartusII作合成時會自動忽略,因為delay並非可合成的Verilog。
一般寫給FPGA的RTL,都不會去設定timescale,不過由於要用ModelSim作前仿,所以要加上timescale。
Counter_tb.v/Verilog
1 /*
2 (C)OOMusou2008
3
4 Filename :
Counter_tb.v
5 Compiler :
QuartusII8.1/ModelSim-Altera6.3g
6 Description:
simplecountertestbench
7 Release :
01/30/20091.0
8 */
9
10 `timescale1ns/100ps
11
12 moduleCounter_tb;
13
14 reg clk;
15 reg rst_n;
16 wire[3:
0]cnt;
17
18 parameterPERIOD= 20;
19
20 Countercounter(
21 .CLK(clk),
22 .RST_N(rst_n),
23 .CNT(cnt)
24 );
25
26 initial begin
27 #0clk = 1'b0;
28 rst_n= 1'b0;
29 #5rst_n= 1'b1;
30 end
31
32 //50MHz
33 always#(PERIOD/2)clk= ~clk;
34
35 endmodule
复制代码
一個很典型的testbench,唯一要注意的是第28行。
rst_n= 1'b0;
#5rst_n= 1'b1;
复制代码
之所以一開始要將rst_n為0,是因為ModelSim與QuartusII對reg初始值看法不一樣,QuartusII認為reg初始值為0,但ModelSim認為reg初始值為x,所以需要rst_n=1'b0將reg歸0,這樣用ModelSim前仿才會正確,但ModelSim後仿可以不這樣做,因為QuartusII會先做處理。
不過為了前仿與後仿都使用同一個testbench,建議加上rst_n=1'b0設定reg初始值為0。
有了RTL與testbench之後,來看看如何使用ModelSim作前仿與後仿。
1.使用GUI的方式在ModelSim-Altera作前仿真
ModelSim提供了全GUI的方式,只要使用操作的方式,就能做前仿。
Step1:
File->NewProject
Step2:
AddExistingFile
將Counter.v與Counter_tb.v加入
Step3:
CompileAll
選擇Counter.v或者Counter_tb.v,按滑鼠右鍵,選擇Compile->CompileAll,編譯所有Verilogcode。
編譯成功。
Step4:
Simulate
在Librarytab選擇Counter_tb,按滑鼠右鍵,選Simulate。
Simulate成功。
Step5:
AddSignaltoWave
將欲觀察的信號從Objects加入Wave,加入clk,rst_n與cnt。
最後結果。
Step6:
Run300ns
最後前仿結果。
2.使用DOmacro在ModelSim-Altera作前仿真
ModelSim也提供macro的方式,以上所有的GUI操作,都可以使用TCLscript描述。
Step1與Step2與之前一樣。
Step3:
ExecuteMacro
Counter_wave.do/ModelSimMacro
1 #compile
2 vlogCounter.v
3 vlogCounter_tb.v
4
5 #simulate
6 vsimCounter_tb
7
8 #probesignals
9 addwave*
10
11 #300ns
12 run 300ns
复制代码
最後前仿結果。
3.使用QuartusII+ModelSim-Altera作後仿真
Step1:
設定QuartusII使用ModelSim-Altera作後仿真
Assignments->Settings->Category:
EDAToolSettings->Simulation:
Toolname:
ModelSim-Altera
選取Rungate-levelsimulationautomaticallyaftercompilation
Formatforoutputnetlist:
Verilog
Timescale:
1ns
Step2:
設定testbench
在同一頁的NativeLinksettings選擇Compiletestbench,按下TestBenches..加入Counter_tb.v。
比較詭異的是,Testbenchname、Toplevelmoduleintestbench與Designinstancenameintestbench無法自己抓到,必須自己填。
Step3:
編譯與模擬
Processing->StartCompilation
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- modelsim 仿真