1ModelSim的使用与Testbench的编写.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1ModelSim的使用与Testbench的编写

ModelSim的使用与Testbench的编写 Quartus操作和语法后,需要对手头的工作进行仿真验证, Quartus 9.x自带的Vector Waveform已经淘汰掉了,必须用 ModelSim进行仿真。现在就开始一步步入手ModelSim,并通过与Quartus无缝衔接实现仿真。本文使用了ModelSim10.0c + QuartusII 10.0,其他版本基本雷同,请自行研究。 源程序如下: module add( mclk, rst_n, a_in, b_in, c_out ); input mclk, rst_n; input[7:0] a_in, b_in; output[8:0] c_out; reg[8:0] c_out; always@(posedge mclk, negedge rst_n) begin if(!rst_n) c_out = 9h0; else c_out = a_in + b_in; end endmodule 请建立工程,将源程序编译通过. 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,等等。文章链接: /papers/Technical_Text_Mistakes.pdf ? 我们可以通过Quartus自动生成一个Testbench的模板,选择Processing - Start - Start Test Bench Template Writer,等待完成后,在导航栏中打开刚才生成的Testbench,默认是保存在simulation\modelsim文件夹下的.vt格式文件。 ? 打开vt文件后可以看到Quartus已经为我们完成了一些基本工作,包括端口部分的代码和接口变量的声明,我们要做的就是在这个做好的模具里添加我们需要的测试代码。 一个最基本的Testbench包含三个部分,信号定义、模块接口和功能代码。 表示仿真的单位时间为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翻转一次m

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档