如何能从Quartus II中调用Modelsim进行仿真
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何从Quartus II中调用Modelsim进行仿真
--穆永强版本说明:Quartus II 11.0版本;ModelSim-Altera 6.6d版本。
一、设置第三方EDA工具
在Tools -> Options中设置ModelSim的安装路径,注意要设置到win32文件夹(64位软件对应的就是win64)。
在Assignments -> Settings中设置仿真工具为ModelSim。这样Quartus就能无缝调用ModelSim了。
二、编写Testbench
我们可以通过Quartus自动生成一个Testbench的模板,选择Processing -> Start -> Start Test Bench Template Writer,等待完成后打开刚才生成的
Testbench,默认是保存在simulation\modelsim文件夹下的.vt格式文件。
打开vt文件后可以看到Quartus已经为我们完成了一些基本工作,包括端口部分的代码和接口变量的声明,我们要做的就是在这个做好的模具里添加我们需要的测试代码。
一个最基本的Testbench包含三个部分,信号定义、模块接口和功能代码。
‘timescale 1ns/ 1ps表示仿真的单位时间为1ns,精度为1ps。想要进行仿真首先要规定时间单位,而且最好在Testbench里面统一规定时间单位,而不要在工程代码里定义,因为不同的模块如果时间单位不同可能会为仿真带来一些问题,而timescale本身对综合也就是实际电路没有影响。
其实Testbench本身可以看做一个模块或者设备(本例中的模块名为
add_vlg_tst),和你自己编写的模块进行通信。通过Testbench模块向待测模块输出信号作为激励,同时接收从待测模块输出的信号来查看结果。因此,在待测模块中的reg型信号在Testbench中就变成了wire,待测模块中的wire型信号在Testbench 中则对应为reg型。那么inout怎么办呢,inout型信号也要设成wire,同时要用一个reg型信号作为输出寄存器,同时设置一个三态门,由一个使能信号控制,如:assign inout_sig = out_en ? out_reg : 1’bz;
处理完接口和声明之后,需要自己设置一些激励信号,激励信号的容就是肯能会输
入到待测模块中的波形。下面我们就来写一个简单的测试程序。
【复位信号】
initial
begin
rst = 0;
#100 rst = 1;
end
initial开头的这个过程在Testbench中只执行一次,#100表示延时了100个时
间单位,我们之前已经通过timescale进行了设置,这里延时了100ns。这就有点类
似于C语言了,代码通过延时被顺序执行,rst在0时刻为低电平(也就是逻辑0),
100ns后变成高电平,从而形成了一个上电复位。
【时钟】
initial
begin
clk = 0;
while(1)
#10 clk = ~clk;
always模块中的代码会不断重复执行,利用这个特点,每10ns翻转一次clk,只是这样还不行,还要给clk一个初值,就是上面的initial语句。如此便可以生成一个周期为20ns,频率50MHz的方波信号,作为本例的系统时钟。
【输入信号】
initial
begin
a = 1;
b = 3;
#200 a = 2;
b = 0;
#200 a = 3;
b = 3;
end
注意这里a = 1和b = 3是同时发生的,也就是并行的,之后延时200ns,a = 2同时b = 0,如前面所说,想要实现顺序操作,就需要使用延时,如果两个语句间没有延时,就表示同时执行。还有一点,这个initial语句块和负责复位的initial语句块也是并行的,并且都是从0时刻开始。也就是说,0时刻后经过100ns rst_n复位,再经过100ns(从0时刻起),a = 2被执行。
至此,测试程序也完成了,让我们开始仿真吧
【输出信号】
initial
begin
$display($time,"clk=%d rst =%d led =%d", clk, rst, led);
例如:
`timescale 1ns/1ns //单位时间为1ns/精度为1ns module LED_FLOW;
reg CLOCK_50M;
reg RST_n;
wire [9:0] LED;
led led_inst
(
.clk_50M(CLOCK_50M),
.reset_n(RST_n),
.led(LED)
);
initial
begin
CLOCK_50M = 0;
while (1)
#10 CLOCK_50M = ~CLOCK_50M; end
initial
RST_n = 0;
while (1)
#10 RST_n = 1;
end
initial
begin
$display($time,"CLOCK_50M=%d RST_n=%d LED =%d", CLOCK_50M, RST_n, LED); end
endmodule
三、设置Quartus并调用仿真工具
运行仿真之前,还要设置一下。在Simulation选项卡中配置仿真选项,可以配置仿真语言、仿真时间的格式以及输出目录。选中mpile test bench,点击Test Benches 打开Test Benches对话框。