在入职之前曾自学了一段时间的Verilog,后来因为工作的缘故鲜有接触,就搁置下来了。后来因偶然的机会需要参与一个CPLD的小项目,又开始从零学起,有些讽刺的是,不知道如何入手工具的我又回到EDN上翻之前自己写的博文,才重新熟悉了Quartus的使用流程。现在得了些空闲,最重要的是有了些许想法,终于重新打起精神来料理一个博客。

重温了基本的Quartus操作和语法后,需要对手头的工作进行仿真验证,这时候抖去尘土才发现世界已变,Quartus 9.x自带的Vector Waveform已经淘汰掉了,所以又硬着头皮来学ModelSim。预备工作在上篇文章中介绍了,不再累述。

现在就开始一步步入手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窗口的左下角有几个小按钮,是用来设置游标的,通过添加游标,可以测量相应的时间,也可以在这里配置时间刻度的格式。

在Wave波形图中,使用滚轮和鼠标右键可以很方便的缩放或选择波形区域,下图就是这个全加器工程的波形图,在复位之后,c_out的值等于a_in与b_in的和,并在时钟上升沿输出。

ModelSim入门及Testbench编写——合理利用仿真才是王道相关推荐

  1. Testbench编写指南(3)模块化工程的仿真方法

    第3篇的题材是模块化工程的仿真方法.现在只要是功能比较完善.规模比较大的FPGA设计都会采用模块化设计的方法.本文介绍在模块化设计过程中编写testbench并仿真的方法,Vivado对此有很好的特性 ...

  2. 修改网站自动关闭时间timeout_Testbench仿真方法2:在Quartus下Testbench编写及脚本文件修改...

    之前文章已经说明了在Quartus使用Testbench仿真的流程,此文章主要关注Testbench文件的编写以及仿真脚本文件的修改. 新建工程编写一个简单的timer模块. module 按照qua ...

  3. Testbench编写指南(2)文件的读写操作

    Testbench编写指南是博主新开的一个系列,主要介绍在编写testbench时使用到的技巧,让编写者的水平不再仅仅停留在时钟信号.复位信号等简单信号的设置上,更好的完成对设计的仿真工作. 第2篇的 ...

  4. testbench编写流程的简单举例

    本文首发于公众号[木叶芯],版权所有,禁止转载. 如需转载,请在评论区留言或私信申请,经同意后可转载,否则属于侵权行为. 作者昵称:城外南风起 原文链接:testbench编写流程的简单举例 ---- ...

  5. TestBench编写_激励产生

    TestBench编写_激励产生 TestBench编写_激励产生 基本背景 读取函数介绍 a.$fopen函数使用 b.$fread函数使用 c.$fclose函数使用 实际使用 TestBench ...

  6. 【testbench】第1篇:testbench编写规则

    本文依据网络资料及工作经验整理而成,如有错误请留言. 文章为个人辛苦整理,付费内容,禁止私自转载. 文章专栏:<黑猫的FPGA知识合集> 1 概述 实现仿真需要自己增加testbench文 ...

  7. 视频教程-逆向工程:游戏安全入门教程-漏洞挖掘与利用

    逆向工程:游戏安全入门教程 杨闯(rkvir)天融信阿尔法实验室安全研究员.看雪漏洞分析小组成员,看雪讲师,MS08067小组成员.从事安全行业多年,擅长二进制安全领域的研究与工程化实现.有多年教育经 ...

  8. TensorFlowSharp入门使用C#编写TensorFlow人工智能应用

    TensorFlowSharp入门使用C#编写TensorFlow人工智能应用学习. TensorFlow简单介绍 TensorFlow 是谷歌的第二代机器学习系统,按照谷歌所说,在某些基准测试中,T ...

  9. 8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8。

    8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8. 程序: #include<reg51.h> #include<absacc.h> #def ...

最新文章

  1. linux的有趣命令,Linux有趣小命令之艺术字
  2. 防止表单重复提交的简单有效的策略
  3. (王道408考研操作系统)第一章计算机系统概述-第一节2:操作系统的发展史
  4. 几个提升Go业务开发效率的流行框架和开源库
  5. internetreadfile读取数据长度为0_Go发起HTTP2.0请求流程分析(后篇)——标头压缩
  6. 基于JAVA+SpringBoot+Mybatis+MYSQL的婚纱影楼摄影网站
  7. 九度OnlineJudge之1001:A+B for Matrices
  8. 【ArcGIS|空间分析】第七届全国大学生GIS技能大赛——上午
  9. 网络信息安全基本属性
  10. HTML5期末大作业:绿色特产商城网站设计——绿色特产商城购物网(11页) HTML+CSS+JavaScript 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
  11. 高一计算机基础知识ppt课件,高一信息技术课件
  12. 2019年个人所得税计算机模板,2019年最新个税计算Excel模版,人手一份!
  13. 用angular Material 做统计表格
  14. 【MySQL必知必会】第十四章 使用子查询
  15. python 录屏_《自拍教程70》Python adb一键录屏
  16. 西安交通大学915考研--编程题Java代码踩坑(2020年真题)
  17. 五子棋 day5-2
  18. Kotlin学习笔记(二)——函数操作符内置函数
  19. 第 35 届信息学奥林匹克竞赛(NOI 2018)二试赛题
  20. C语言程序设计---读书笔记汇总(整理中)

热门文章

  1. select_arg_from_python相关的测试程序
  2. boost::pfr::tuple_size_v相关的测试程序
  3. boost::mp11::mp_fold_q相关用法的测试程序
  4. boost::fusion::flatten用法的测试程序
  5. boost::describe模块实现打印功能的测试程序
  6. Boost:bind绑定boost::apply的测试程序
  7. DCMTK:创建和验证DICOM数字签名
  8. VTK:Remote之FrenetSerretFrameDemo
  9. OpenCV calcOpticalFlowPyrLK用法的实例(附完整代码)
  10. STL的array容器