博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FPGA学习手记(四)ModelSim入门及Testbench编写——合理利用仿真才是王道
阅读量:5081 次
发布时间:2019-06-13

本文共 3212 字,大约阅读时间需要 10 分钟。

现在就开始一步步入手modelsim,并通过与quartus无缝衔接实现仿真。本文使用了modelsim10.0c + quartusii 10.0,其他版本基本雷同,请自行研究。

看不清图的点开看大图!

1.设置第三方eda工具

在tools -> options中设置modelsim的安装路径,注意要设置到win32文件夹(64位软件对应的就是win64)。

建立一个工程(依然以加法器为例)。在assignments -> settings中设置仿真工具为modelsim。这样quartus就能无缝调用modelsim了。

当然也可以在建立工程的时候就设置仿真工具。

2.编写testbench

说到testbench,你可以叫它testbench,或者testbenches,但不是test bench。说起来,就连quartus也没注意这个问题,至于原因嘛参见common mistakes in technical texts一文。文章中还列举了些别的错误用语,包括flip-flop不能写成flipflop,等等。文章链接:

http://www.sunburst-design.com/papers/technical_text_mistakes.pdf

我们可以通过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_n = 0;

#100 rst_n = 1;

end

initial开头的这个过程在testbench中只执行一次,#100表示延时了100个时间单位,我们之前已经通过timescale进行了设置,这里延时了100ns。这就有点类似于c语言了,代码通过延时被顺序执行,rst_n在0时刻为低电平(也就是逻辑0),100ns后变成高电平,从而形成了一个上电复位。

其次是时钟,使用always模块来完成:

initial

begin

mclk = 0;

end

always

begin

#10 mclk = ~mclk;

end

always模块中的代码会不断重复执行,利用这个特点,每10ns翻转一次mclk,只是这样还不行,还要给mclk一个初值,就是上面的initial语句。如此便可以生成一个周期为20ns,频率50mhz的方波信号,作为本例的系统时钟。

当然,这个时钟也可以通过initial模块实现。只需添加一个while(1),即死循环。

initial

begin

mclk = 0;

while(1)

#10 mclk = ~mclk;

end

testbench中的很多操作都是不可综合的,同时它的风格也可

 

此文来自: 马开东博客 转载请注明出处 网址:

以比较随意。

 

设置完时钟和复位,就需要设置输入信号:

initial

begin

a_in = 1;

b_in = 3;

#200 a_in = 2;

b_in = 0;

#200 a_in = 3;

b_in = 3;

end

注意这里a_in = 1和b_in = 3是同时发生的,也就是并行的,之后延时200ns,a_in = 2同时b_in = 0,如前面所说,想要实现顺序操作,就需要使用延时,如果两个语句间没有延时,就表示同时执行。还有一点,这个initial语句块和负责复位的initial语句块也是并行的,并且都是从0时刻开始。也就是说,0时刻后经过100ns rst_n复位,再经过100ns(从0时刻起),a_in = 2被执行。

至此,测试程序也完成了,让我们开始仿真吧

3.设置quartus并调用仿真工具

运行仿真之前,还要设置一下。在simulation选项卡中配置仿真选项,可以配置仿真语言、仿真时间的格式以及输出目录。选中mpile test bench,点击test benches打开test benches对话框。

点击new新建一个test benchsetting,填入testbench模块的名称(这里是add_vlg_tst),酌情设置仿真运行的时间(这里设为800ns,只是进入modelsim后仿真自动执行的时间,不设或随意设置也行),并将刚才编写的testbench添加进来。

一路ok后,选择tools -> run eda simulation tools,有两个选项,rtl simulation是rtl行为级仿真,只验证功能是否正确,与在哪个芯片上运行无关,仿真前至少需要执行一次analysis&synthesis;gate level simulation是门级仿真,涉及到具体的芯片,并且仿真前需要编译工程,在门级仿真中modelsim会将布局布线后的门级延时体现在波形中,在测试一个具体的工程模块时,应当先进行rtl仿真,之后还要进行门级仿真。

4.modelsim工具的基本操作

运行rtl simulation进入modelsim界面。在这里介绍几个比较重要的部分。

在view菜单中,可以显示和隐藏各种工具窗口。其中structure窗口显示了测试模块和待测模块的结构:

点击不同的模块,在objects窗口中可以查看选中模块中的信号,因为除了端口(port)以外,还有很多内部信号默认是不显示波形的,通过将需要的信号拖到wave窗口中,就能够显示。

工具栏中的  部分是用来控制仿真运行的,左侧红框中的是复位,在里设置要执行的时间,点击右侧红框中的按钮就可以执行了。其他的请自行摸索或参看help文件。

如果面对一大堆0101感觉很晕,可以在信号列表里选中信号,右键选择要显示的数据格式。

而wave窗口的左下角有几个小按钮,是用来设置游标的,通过添加游标,可以测量相应的时间,也可以在这里配置时间刻度的格式。

在wav

转载于:https://www.cnblogs.com/lifan3a/articles/5527687.html

你可能感兴趣的文章
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>
yii 1.x 添加 rules 验证url数组
查看>>
html+css 布局篇
查看>>
SQL优化
查看>>
用C语言操纵Mysql
查看>>
轻松学MVC4.0–6 MVC的执行流程
查看>>
redis集群如何清理前缀相同的key
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
获取元素
查看>>
proxy写监听方法,实现响应式
查看>>
第一阶段冲刺06
查看>>
十个免费的 Web 压力测试工具
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>
一天一道算法题--5.30---递归
查看>>
JS取得绝对路径
查看>>
排球积分程序(三)——模型类的设计
查看>>