学海荡舟手机网
导航

主页 > 电子设备技术 > 电器电路基础 > > 详细内容

使用ModelSim作前仿真与后仿真

使用环境:

Qus II 8.1 + ModelSim-Ara 6.3g  
由于可重复编程,所以不少开发人员就不写testbench,直接使用Quartus IIprogrammer烧进开发板看结果,或者使用Quartus II自带的Waveform Editor进行仿真,这种方式虽然可行,但仅适用于小project,若project越写越大,Quartus II光做fitter就很耗时间,一整天下来都在作Quartus II编译。
比较建议的方式,还是学AS那招:“写testbench先对每个module作前仿真,再对每个module作后仿真,最后再烧入F测试。”
这种方式的优点是:
1.testbenchwaveform editor可更灵活的描述规格。
2.testbench可使用Verilog的系统函数,如$display()$fwrite()...等。
但要使用testbench作仿真,单独Qaurtus II并无法做到,就得使用ModelSim了,这又牵涉到“前仿真”与“后仿真”。
所谓的“前仿真”,就是Quartus IIFunctional Simulation,不考虑电路的门延迟与线延迟,重点在观察电路在理想环境下的行为与设计构想是否一致。由于没经过fitter阶段,所以仿真速度很快。前仿真结果正确,并不表示将来结果结果正确,但若前仿真结果不正确,则将来结果一定不正确
所谓的“后仿真”,就是Quartus IITiming Simulation,考虑了电路的门延迟与线延迟,由于经过fitter阶段,所以模拟结果最为精准。但fitterQuartus II编译需耗费很多时间,所以建议“前仿真”正确后,再考虑“后仿真”
使用Quartus IIwaveform editor作前仿真与后仿真,我就不再多谈,本文主要是谈如何使用ModelSim-Altera作前仿与后仿。
1.使用GUI的方式在ModelSim-Altera作前仿真。
2.使用DO macroModelSim-Altera作前仿真。
3.使用Quartus II + ModelSim-Altera作后仿真。
Counter.v / Verilog
  1 /* 
2 (C) OOMusou 2008 //oomusou.cnblogs.com
3 
4 Filename    : Counter.v
5 Compiler    : Quartus II 8.1 / ModelSim-Altera 6.3g
6 Description : simple counter
7 Release     : 01/30/2009 1.0
8 */
9 
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

一个很简单的counter,从0数到15重复数。由于要使用ModelSim作前仿,所以在reg做了delay,不过这在Quartus II作合成时会自动忽略,因为delay并非可合成的Verilog
一般写给GARTL,都不会去设定timescale,不过由于要用ModelSim作前仿,所以要加上timescale
Counter_tb.v / Verilog  1 /* 
2 (C) OOMusou 2008 //oomusou.cnblogs.com
3 
4 Filename    : Counter_tb.v
5 Compiler    : Quartus II 8.1 / ModelSim-Altera 6.3g
6 Description : simple counter testbench
7 Release     : 01/30/2009 1.0
8 */
9 
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 // 50M
33 always #(PERIOD/2) clk = ~clk;
34 
35 endmodule

一个很典型的testbench,唯一要注意的是第28行。    rst_n = 1'b0;
#5 rst_n = 1'b1;

之所以一开始要将rst_n0,是因为ModelSimQuartus IIreg初始值看法不一样,Quartus II认为reg初始值为0,但ModelSim认为reg初始值为x,所以需要rst_n=1'b0reg0,这样用ModelSim前仿才会正确,但ModelSim后仿可以不这样做,因为Quartus II会先做处理。
不过为了前仿与后仿都使用同一个testbench,建议加上rst_n = 1'b0设定reg初始值为0
有了RTLtestbench之后,来看看如何使用ModelSim作前仿与后仿。
1.使用GUI的方式在ModelSim-Altera作前仿真
ModelSim
提供了全GUI的方式,只要使用操作的方式,就能做前仿。
Step 1
File -> New Project
 
Step 2
Add Existing File
 
Counter.vCounter_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_ncnt
 
最后结果。
 
Step 6
Run 300ns
 
最后前仿结果。
    (

相关文章