原创 如何使用ModelSim作前仿真与后仿真? (SOC) (Quartus II) (ModelSim

2009-7-15 13:50 3346 6 7 分类: FPGA/CPLD

Abstract
本文介紹使用ModelSim做前仿真,並搭配Quartus II與ModelSim作後仿真。


Introduction
使用環境:Quartus II 8.1 + ModelSim-Altera 6.3g


由於FPGA可重複編程,所以不少開發人員就不寫testbench,直接使用Quartus II的programmer燒進開發板看結果,或者使用Quartus II自帶的Waveform Editor進行仿真,這種方式雖然可行,但僅適用於小project,若project越寫越大,Quartus II光做fitter就很耗時間,一整天下來都在作Quartus II編譯。


比較建議的方式,還是學ASIC那招:『寫testbench先對每個module作前仿真,再對每個module作後仿真,最後再燒入FPGA測試。』


這種方式的優點是:


1.testbench比waveform editor可更靈活的描述電路規格。


2.testbench可使用Verilog的系統函數,如$display()、$fwrite()...等。


但要使用testbench作仿真,單獨Qaurtus II並無法做到,就得使用ModelSim了,這又牽涉到『前仿真』與『後仿真』。


所謂的『前仿真』,就是Quartus II的Functional Simulation,不考慮電路的門延遲與線延遲,重點在觀察電路在理想環境下的行為與設計構想是否一致[1]。由於沒經過fitter階段,所以模擬速度很快。前仿真結果正確,並不表示將來結果結果正確,但若前仿真結果不正確,則將來結果一定不正確


所謂的『後仿真』,就是Quartus II的Timing Simulation,考慮了電路的門延遲與線延遲,由於經過fitter階段,所以模擬結果最為精準。但fitter在Quartus II編譯需耗費很多時間,所以建議『前仿真』正確後,再考慮『後仿真』


值得注意的是:用 Quartus II 或 MAXPLUS II 作 Timering 仿真均为后仿真,在做频率较低的设计时一般不需要做后仿真,但如进行高速的电路设计,如系统时钟接近或大于 100MHz 就一定要对·每一个设计模块都进行后仿真处理。


使用Quartus II的waveform editor作前仿真與後仿真,我就不再多談,本文主要是談如何使用ModelSim-Altera作前仿與後仿。


1.使用GUI的方式在ModelSim-Altera作前仿真。


2.使用DO macro在ModelSim-Altera作前仿真。


3.使用Quartus II + ModelSim-Altera作後仿真。


Counter.v / Verilog


1 /* 
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3 
4 Filename    : Counter.v
5 Compiler    : Quartus II 8.1 / ModelSim-Altera 6.3g
6 Description : simple counter
7 Release     : 01/30/2009 1.0
8 */
9 
10 `timescale 1ns/100ps
11 
12 module Counter (
13   input        CLK,
14   input        RST_N,
15   output [3:0] CNT
16 );
17 
18 reg [3:0] cnt;
19 assign CNT = cnt;
20 
21 always@(posedge CLK, negedge RST_N) begin
22   if (!RST_N)
23     cnt <= #5 4'h0;
24   else
25     cnt <= #5 cnt + 1'b1; 
26 end
27 
28 endmodule


一個很簡單的counter,從0數到15重複數。由於要使用ModelSim作前仿,所以在reg做了delay,不過這在Quartus II作合成時會自動忽略, 因為delay並非可合成的Verilog。


一般寫給FPGA的RTL,都不會去設定timescale,不過由於要用ModelSim作前仿,所以要加上timescale。


Counter_tb.v / Verilog 


1 /* 
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3 
4 Filename    : Counter_tb.v
5 Compiler    : Quartus II 8.1 / ModelSim-Altera 6.3g
6 Description : simple counter testbench
7 Release     : 01/30/2009 1.0
8 */
9 
10 `timescale 1ns/100ps
11 
12 module Counter_tb;
13 
14 reg        clk;
15 reg        rst_n;
16 wire [3:0] cnt;
17 
18 parameter PERIOD = 20;
19 
20 Counter counter (
21   .CLK(clk),
22   .RST_N(rst_n),
23   .CNT(cnt)
24 );
25 
26 initial begin
27   #0 clk   = 1'b0;
28      rst_n = 1'b0;
29   #5 rst_n = 1'b1;
30 end
31 
32 // 50MHz
33 always #(PERIOD/2) clk = ~clk;
34 
35 endmodule


一個很典型的testbench,唯一要注意的是第28行。


   rst_n = 1'b0;
#5 rst_n = 1'b1;


之所以一開始要將rst_n為0,是因為ModelSim與Quartus II對reg初始值看法不一樣,Quartus II認為reg初始值為0,但ModelSim認為reg初始值為x,所以需要rst_n=1'b0將reg歸0,這樣用ModelSim前仿才會正確,但ModelSim後仿可以不這樣做,因為Quartus II會先做處理。


不過為了前仿與後仿都使用同一個testbench,建議加上rst_n = 1'b0設定reg初始值為0。


有了RTL與testbench之後,來看看如何使用ModelSim作前仿與後仿。


1.使用GUI的方式在ModelSim-Altera作前仿真
ModelSim提供了全GUI的方式,只要使用操作的方式,就能做前仿。


Step 1:
File -> New Project


modelsim00


Step 2:
Add Existing File


modelsim01


將Counter.v與Counter_tb.v加入


点击看大图


Step 3:
Compile All


選擇Counter.v或者Counter_tb.v,按滑鼠右鍵,選擇Compile->Compile All,編譯所有Verilog code。


点击看大图


編譯成功。


点击看大图


Step 4:
Simulate


在Library tab選擇Counter_tb,按滑鼠右鍵,選Simulate。


点击看大图


Simulate成功。


点击看大图 


Step 5:
Add Signal to Wave


將欲觀察的信號從Objects加入Wave,加入clk,rst_n與cnt。


点击看大图


最後結果。


点击看大图


Step 6:
Run 300ns


点击看大图


最後前仿結果。


点击看大图


2.使用DO macro在ModelSim-Altera作前仿真
ModelSim也提供macro的方式,以上所有的GUI操作,都可以使用TCL script描述。


Step 1與Step 2與之前一樣。


Step 3:
Execute Macro


点击看大图


Counter_wave.do / ModelSim Macro 


1 #compile
2 vlog Counter.v
3 vlog Counter_tb.v
4 
5 #simulate
6 vsim Counter_tb
7 
8 #probe signals
9 add wave *
10 
11 #300 ns
12 run 300 ns


最後前仿結果。


点击看大图


3.使用Quartus II + ModelSim-Altera作後仿真


Step 1:
設定Quartus II使用ModelSim-Altera作後仿真


(值得注意的是:要先做一些准备工作,打开Quartus II软件,选择菜单栏Tools->Options…,设置ModelSim的路径,例如我的是D:\Modeltech_6.1f\win32\modelsim.exe)


Assignments -> Settings -> Category :EDA Tool Settings -> Simulation:Tool name:ModelSim-Altera
選取Run gate-level simulation automatically after compilation
Format for output netlist:Verilog
Time scale:1 ns

点击看大图

Step 2:
設定testbench

在同一頁的NativeLink settings選擇Compile test bench,按下TestBenches..加入Counter_tb.v。比較詭異的是,Test bench name、Top level module in test bench與Design instance name in test bench無法自己抓到,必須自己填。

点击看大图

点击看大图

Step 3:
編譯與模擬

Processing -> Start Compilation

点击看大图

完整程式碼下載
Counter.7z

Conclusion
本文介紹了使用ModelSim作前仿真與後仿真,善用ModelSim,將可加快FPGA與SOPC的開發。


Reference
[1] EDA先鋒工作室,Altera FPGA/CPLA設計(基礎篇),人民電郵出版社

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-1-3 10:23

你好,麻烦问一下,你是在哪个版本linux系统下安装的,我在redhat enterprise linux 5下安装qt-devel-3.3.8-4.fc7.i386.rpm包时出现错误,是依赖性的错误,也没解决了。

用户124183 2009-7-11 11:30

写的很好!可惜图片看的好累(有的被缩小了,要点开才能看清),建议博主将文章做成PDF/Word版,再附在文章后面,可以供别人下载后阅读、收藏。^_^
相关推荐阅读
用户1656991 2009-10-19 19:54
FPGA/CPLD数字电路设计经验分享(转载)
 摘要:在数字电路的设计中,时序设计是一个系统性能的主要标志,在高层次设计方法中,对时序控制的抽象度也相应提高,因此在设计中较难把握,但在理解RTL电路时序模型的基础上,采用合理的设计方法在设计复杂数...
用户1656991 2009-10-09 22:08
去耦电容与旁路电容的区别
在布线时,模拟器件贺数字器件都需要这些类型的电容,都需要靠近其电源引脚处连接一个电容,此电容值通常为0.1uF。系统供电电源处需要另一类电容,通常此电容值为10uF。电容取值范围为推荐值的1/10至1...
用户1656991 2009-10-09 21:49
volatile的作用
volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:static int i="0";int main(void){...whil...
用户1656991 2009-10-09 20:31
C语言中sizeof()的用法
sizeof 一般形式为:sizeof(object),也可以sizeof var_char,不过大部分programer习惯用sizeof()。     对象可以是表达式或者数据类型名,当对象是表达...
用户1656991 2009-09-21 13:24
分析一段H264视频数据
分析一段H264视频数据 Posted on 2007-05-31 09:42 vcommon 阅读(1968) 评论(8)  编辑 收藏 引用   分析00 00 00 01 67 42 00 1E...
用户1656991 2009-09-21 13:24
图像、帧、片、NALU
图像、帧、片、NALU图像、帧、片、NALU 是学习 H.264 的人常常感到困惑的一些概念,我在这里对自己的理解做一些阐述,欢迎大家讨论:H.264 是一次概念的革新,它打破常规,完全没有 I 帧、...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条