声明:本文复制与网上,非本人自己写,感觉内容不错,供大家分享学习
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 moduleCounter ( 13 input 14 input 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 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 moduleCounter_tb; 13 14 reg 15 reg 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 28 29 #5rst_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 #300ns 12 run300 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 |