声明:本文复制与网上,非本人自己写,感觉内容不错,供大家分享学习
Abstract Introduction 由於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
9 10 `timescale 1ns / 100ps 11 12 module Counter ( 13 input 14 input 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 24 else 25 26 end 27 28 endmodule
一般寫給FPGA的RTL,都不會去設定timescale,不過由於要用ModelSim作前仿,所以要加上timescale。 Counter_tb.v / Verilog
1
9 10 `timescale 1ns / 100ps 11 12 module Counter_tb; 13 14 reg 15 reg 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 28 29 # 5 rst_n = 1 ' b1; 30 end 31 32 // 50MHz 33 always #(PERIOD / 2 ) clk = ~ clk; 34 35 endmodule
# 5 rst_n = 1 ' b1;
不過為了前仿與後仿都使用同一個testbench,建議加上rst_n = 1'b0設定reg初始值為0。 有了RTL與testbench之後,來看看如何使用ModelSim作前仿與後仿。 1.使用GUI的方式在ModelSim-Altera作前仿真 Step 1: Step 2: 將Counter.v與Counter_tb.v加入 Step 3: 選擇Counter.v或者Counter_tb.v,按滑鼠右鍵,選擇Compile->Compile All,編譯所有Verilog code。 編譯成功。 Step 4: 在Library tab選擇Counter_tb,按滑鼠右鍵,選Simulate。 Simulate成功。 Step 5: 將欲觀察的信號從Objects加入Wave,加入clk,rst_n與cnt。 最後結果。 Step 6: 最後前仿結果。 2.使用DO macro在ModelSim-Altera作前仿真 Step 1與Step 2與之前一樣。 Step 3: 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: Assignments -> Settings -> Category :EDA Tool Settings -> Simulation:Tool name:ModelSim-Altera Step 2: 在同一頁的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 来自:http://blog.sina.com.cn/s/blog_76eef73b0100v3om.html |