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

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
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加入

modelsim02

Step 3:
Compile All

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

modelsim03

編譯成功。

modelsim05

Step 4:
Simulate

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

modelsim06

Simulate成功。

modelsim07 

Step 5:
Add Signal to Wave

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

modelsim08

最後結果。

modelsim09

Step 6:
Run 300ns

modelsim10

最後前仿結果。

modelsim11

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

Step 1與Step 2與之前一樣。

Step 3:
Execute Macro

modelsim12

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


最後前仿結果。

modelsim11

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

modelsim13

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無法自己抓到,必須自己填。

modelsim14

modelsim15

Step 3:
編譯與模擬

Processing -> Start Compilation

modelsim16

完整程式碼下載
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設計(基礎篇),人民電郵出版社

0
0
(请您对文章做出评价)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值