笔记) 如何使用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 / Verilog1 /* 2 (C) OOMusou 2008 ://oomusou blogs 3 4 Filename : Counter.v5 Compiler : Quartus II 8.1 / ModelSim-Altera 6.3g6 Description : simple counter7 Release : 01/30/2009 1.08 */9 10 `timescale 1ns/100ps11 12 module Counter (13 input CLK,14 input RST_N,15 output [3:0] CNT16 );17 18 reg [3:0] cnt;19 assign CNT = cnt;20 21 always@(posedge CLK, negedge RST_N) begin22 if (!RST_N) 23 cnt <= #5 4'h0;24 else25 cnt <= #5 cnt + 1'b1; 26 end27 28 endmodule一个很简单的counter,从0数到15重复数。
由于要使用ModelSim作前仿,所以在reg做了delay,不过这在Quartus II作合成时会自动忽略, 因为delay并非可合成的Verilog一般写给FPGA的RTL,都不会去设定timescale,不过由于要用ModelSim作前仿,所以要加上timescaleCounter_tb.v / Verilog 1 /* 2 (C) OOMusou 2008 ://oomusou blogs 3 4 Filename : Counter_tb.v5 Compiler : Quartus II 8.1 / ModelSim-Altera 6.3g6 Description : simple counter testbench7 Release : 01/30/2009 1.08 */9 10 `timescale 1ns/100ps11 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 T(cnt)24 );25 26 initial begin27 #0 clk = 1'b0;28 rst_n = 1'b0;29 #5 rst_n = 1'b1;30 end31 32 // 50MHz33 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 ProjectStep 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,按鼠标右键,选SimulateSimulate成功 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 MacroCounter_wave.do / ModelSim Macro 1 #compile2 vlog Counter.v3 vlog Counter_tb.v4 5 #simulate6 vsim Counter_tb7 8 #probe signals9 add wave *10 11 #300 ns12 run 300 ns最后前仿结果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 compilationFormat for output netlist:VerilogTime 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 完整程序代码下载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) Reference[1] EDA先锋工作室,Altera FPGA/CPLA设计(基础篇),人民电邮出版社。