(笔记) 如何使用ModelSim作前仿真与后仿真(SOC)(Quartus II)(ModelSim) 联系客服

发布时间 : 星期五 文章(笔记) 如何使用ModelSim作前仿真与后仿真(SOC)(Quartus II)(ModelSim)更新完毕开始阅读60d5006a25c52cc58bd6bea9

(笔记) 如何使用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 / Verilog

1 /*

2 (C) OOMusou 2008 http://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。

一般写给FPGA的RTL,都不会去设定timescale,不过由于要用ModelSim作前仿,所以要加上timescale。

Counter_tb.v / Verilog

1 /*

2 (C) OOMusou 2008 http://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 // 50MHz

33 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 Project