使用ModelSim作前仿真與後仿真

使用ModelSim作前仿真與後仿真
2010-05-30 10:56

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

這種方式的優點是:

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

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

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

使用Quartus II的waveform editor作前仿真與後仿真。這種方式雖然可行,但僅適用於小project,若project越寫越大,Quartus II光做fitter就很耗時間,一整天下來都在作Quartus II編譯。

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

----------------------------------------------------------------------

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

之所以一開始要將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。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章