如何使用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
一個很簡單的counter,從0數到15重複數。由於要使用ModelSim作前仿,所以在reg做了delay,不過這在Quartus II作合成時會自動忽略, 因為delay並非可合成的Verilog。
一般寫給FPGA的RTL,都不會去設定timescale,不過由於要用ModelSim作前仿,所以要加上timescale。
Counter_tb.v / Verilog
一個很典型的testbench,唯一要注意的是第28行。
之所以一開始要將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
最後前仿結果。
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