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的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

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 */

10 `timescale 1ns/100ps
11 
12 moduleCounter (
13 inputCLK,
14 inputRST_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 <=#54'h0;
24 else
25 cnt <=#5cnt +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

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 */

10 `timescale 1ns/100ps
11 
12 moduleCounter_tb;
13 
14 regclk;
15 regrst_n;
16 wire[3:0] cnt;
17 
18 parameterPERIOD =20; 
19 
20 Counter counter (
21 .CLK(clk),
22 .RST_N(rst_n),
23 .CNT(cnt)
24 );
25 
26 initialbegin
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與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

Step 2:
Add Existing File

將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

5 #simulate
6 vsim Counter_tb

8 #probe signals
9 add wave *
10 
11 #300ns
12 run300ns

复制代码

最後前仿結果。

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

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

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的開發。

See Also
(原創) 如何使用ModelSim-Altera作電路模擬? (SOC) (Quartus II) (ModelSim)
(原創) 如何解決在Quartus II無法使用ModelSim-Altera模擬的問題? (SOC) (Quartus II) (ModelSim)
(原創) 如何做functional simulation? (SOC) (Quartus II) (ModelSim) 
(原創) 如何使用ModelSim對Megafunction或LPM作仿真? (SOC) (MegaCore) (ModelSim)

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

如何使用ModelSim作前仿真與後仿真? (真oo无双前辈)相关推荐

  1. (筆記) 如何使用ModelSim作前仿真與後仿真? (SOC) (Quartus II) (ModelSim)

    Abstract 本文介紹使用ModelSim做前仿真,並搭配Quartus II與ModelSim作後仿真. Introduction 使用環境:Quartus II 8.1 + ModelSim- ...

  2. Quartus II与 ModelSim功能仿真与后仿真扫盲(转)

    时间:2007-04-20   作者:yangyh80@21cn.com 本文主要描述了如何在QUARTUS II 中输入程序文件,生成网表及标准延时文件,然后通过MODELSIM 进行功能仿真与后仿 ...

  3. FPGA仿真--前仿真和后仿真

    初学者学习FPGA,必定会被它的各种仿真弄的晕头转向.比如,前仿真.后仿真.功能仿真.时序仿真.行为级仿真.RTL级仿真.综合后仿真.门级仿真.布局布线后仿真等. Quartus和Modelsim软件 ...

  4. Modelsim联合Matlab进行FPGA图像处理仿真与测试的学习总结(以RGB转Ycbcr转Gray为例)

    文章目录 一.Modelsim联合Matlab进行FPGA图像仿真的步骤 二.具体实现方法 2.1 新建一个Modelsim项目并编写测试代码 2.2 新建v文件来编写待测试代码 2.3 建成项目后, ...

  5. (129)FPGA面试题-FPGA前仿真与后仿真的区别?

    1.1 FPGA面试题-FPGA前仿真与后仿真的区别? 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-FPGA前仿真与后仿真的区别?: 5)结束语. 1 ...

  6. VIVADO 中的几种仿真选项以及功能仿真、前仿真、后仿真、时序仿真

    run behavioral simulation run post-synthesis simulation run post-synthesis timing simulation run pos ...

  7. 前仿真和后仿真的区别,按键消抖设计思想、PLL使用、ODDR2的原语使用 --2020/10/29工作总结

    2020/10/29工作总结 前仿真和后仿真的区别 前仿真 综合后仿真 后仿真 synthesize和implement.generate bitstream 参考链接 按键消抖设计思想 PLL使用 ...

  8. 脚本化Questasim/Modelsim自动仿真——脱离联合仿真

    目录 引言 脚本仿真步骤分析 完整的脚本代码 保姆级使用教程 扩展 引言 之前对于工程一直采用的是vivado+questasim联合仿真的模式,对于大型工程来说这个是合适的,因为需要调用一些ip库和 ...

  9. FPGA之IP核的使用、搞懂功能仿真和时序仿真

    因为我也是初学者,我把自己学习中的一个过程给写下来,希望对他人能有一点帮助.相信很多人一开始和我一样对功能仿真和时序仿真(后仿真)都模模糊糊,其实功能仿真是为了验证你的代码是否正确,而时序仿真则是添加 ...

最新文章

  1. 2018年十大云宕机事故盘点:主流无一幸免!
  2. generator自动生成mybatis配置和类信息
  3. postgresql数据库的备份与恢复
  4. 用友互联网战略的变与不变
  5. Git常见错误(附解决办法)
  6. 亲和属性和链路管理组的TE隧道路径控制原理
  7. maskrcnn还可以加网络吗_桃子加蜂蜜可以榨汁吗?桃子和蜂蜜可以一起吃吗?原来可以这样吃...
  8. 第一篇:Dapper快速学习
  9. 字典树 ZOJ1109 HDU1251 PKU1204 HDU1075
  10. Python 全栈开发十 socket网络编程
  11. 用算法“脱掉”女性衣服,这款AI应用被迫下架后再被全网封杀
  12. java socket返回_java中用Socket向ServerSocket发送信息,ServerSocket用接收到的Socket返回一条信息,但是返回时报错......
  13. ajax音乐网站,AJAX在线音乐网站(5)测试
  14. Asp.net防止盗链
  15. C# 中,利用 Conditional 定义条件方法
  16. 什么是starup?
  17. 为什么QQ空间远离我们?
  18. php编程模块英文缩写_PHP版国家代码、缩写查询函数代码
  19. java学习第一天笔记
  20. 单商户商城系统功能拆解40—分销应用—分销设置

热门文章

  1. x264的一些参数设置对编码效率的影响
  2. elasticsearch 集群在线水平扩容收缩
  3. Linux学习之获取帮助
  4. 【原创视频教程】学生信息管理系统1--登陆
  5. MYSQL 的 MASTER到MASTER的主主循环同步
  6. 冰刃——IceSword
  7. Dom操作xml的常用方法
  8. 安全证书导入到java中的cacerts证书库
  9. ODOO权限管理,在两个方面设置权限
  10. 【笔记】mysql入门语句8条