Modelsim仿真方法 前仿真定义和后仿真的区别

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
如何使用ModelSim作前仿真与后仿真
下载积分:30
内容提示:如何使用ModelSim作前仿真与后仿真
文档格式:PDF|
浏览次数:298|
上传日期: 06:44:40|
文档星级:
全文阅读已结束,如果下载本文需要使用
 30 积分
下载此文档
该用户还上传了这些文档
如何使用ModelSim作前仿真与后仿真
官方公共微信&ModelSim入门及Testbench编写&&合理利用仿真才是王道
By Nightmare&
在入职之前曾自学了一段时间的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,等等。文章链接:
我们可以通过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&
处理完接口和声明之后,需要自己设置一些激励信号,激励信号的内容就是肯能会输入到待测模块中的波形。下面我们就来写一个简单的测试程序。
首先需要一个复位信号:
&& rst_n = 0;
&& #100 rst_n = 1;
initial开头的这个过程在Testbench中只执行一次,#100表示延时了100个时间单位,我们之前已经通过timescale进行了设置,这里延时了100ns。这就有点类似于C语言了,代码通过延时被顺序执行,rst_n在0时刻为低电平(也就是逻辑0),100ns后变成高电平,从而形成了一个上电复位。
其次是时钟,使用always模块来完成:
&& mclk = 0;
#10 mclk = ~
always模块中的代码会不断重复执行,利用这个特点,每10ns翻转一次mclk,只是这样还不行,还要给mclk一个初值,就是上面的initial语句。如此便可以生成一个周期为20ns,频率50MHz的方波信号,作为本例的系统时钟。
当然,这个时钟也可以通过initial模块实现。只需添加一个while(1),即死循环。
&& while(1)
#10 mclk = ~
Testbench中的很多操作都是不可综合的,同时它的风格也可以比较随意。
设置完时钟和复位,就需要设置输入信号:
&& a_in = 1;
&& b_in = 3;
&& #200 a_in = 2;
&& b_in = 0;
&& #200 a_in = 3;
&& b_in = 3;
注意这里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的和,并在时钟上升沿输出。
完整的工程文件(含Testbench)传上:
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号由于可重复编程,所以不少开发人员就不写testbench,直接使用Quartus II的programmer烧进开发板看结果,或者使用Quartus II自带的Waveform Editor进行仿真,这种方式虽然可行,但仅适用于小project,若project越写越大,Quartus II光做fitter就很耗时间,一整天下来都在作Quartus II编译。
比较建议的方式,还是学AS那招:&写testbench先对每个module作前仿真,再对每个module作后仿真,最后再烧入F测试。&
这种方式的优点是:
1.testbench比waveform editor可更灵活的描述规格。
2.testbench可使用Verilog的系统函数,如$display()、$fwrite()...等。
但要使用testbench作仿真,单独Qaurtus II并无法做到,就得使用ModelSim了,这又牵涉到&前仿真&与&后仿真&。
所谓的&前仿真&,就是Quartus II的Functional Simulation,不考虑电路的门延迟与线延迟,重点在观察电路在理想环境下的行为与设计构想是否一致。由于没经过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
2&(C) OOMusou 2008
4&Filename&&& : Counter.v
5&Compiler&&& : Quartus II 8.1 / ModelSim-Altera 6.3g
6&Description : simple counter
7&Release&&&& : 01/30/
10&`timescale 1ns/100ps
12&module Counter (
13&&input&&&&&&& CLK,
14&&input&&&&&&& RST_N,
15&&output [3:0] CNT
18&reg [3:0]
19&assign CNT =
21&always@(posedge CLK, negedge RST_N) begin
22&&if (!RST_N)
23&&&& cnt &= #5&4'h0;
25&&&& cnt &= #5 cnt +&1'b1;&
28&endmodule
一个很简单的counter,从0数到15重复数。由于要使用ModelSim作前仿,所以在reg做了delay,不过这在Quartus II作合成时会自动忽略,因为delay并非可合成的Verilog。
一般写给GA的RTL,都不会去设定timescale,不过由于要用ModelSim作前仿,所以要加上timescale。
Counter_tb.v / Verilog&
2&(C) OOMusou 2008
4&Filename&&& : Counter_tb.v
5&Compiler&&& : Quartus II 8.1 / ModelSim-Altera 6.3g
6&Description : simple counter testbench
7&Release&&&& : 01/30/
10&`timescale 1ns/100ps
12&module Counter_
14&reg&&&&&&&
15&reg&&&&&&& rst_n;
16&wire [3:0]
18&parameter PERIOD =&20;
20&Counter counter (
21&& .CLK(clk),
22&& .RST_N(rst_n),
23&& .CNT(cnt)
26&initial&begin
27&& #0 clk&& =&1'b0;
28&&&&& rst_n =&1'b0;
29&& #5 rst_n =&1'b1;
33&always #(PERIOD/2) clk =&~
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的方式,只要使用操作的方式,就能做前仿。
File -& New Project
Add Existing File
将Counter.v与Counter_tb.v加入
Compile All
选择Counter.v或者Counter_tb.v,按右键,选择Compile-&Compile All,编译所有Verilog code。
编译成功。
在Library tab选择Counter_tb,按鼠标右键,选Simulate。
Simulate成功。
Add Signal to Wave
将欲观察的信号从Objects加入Wave,加入clk,rst_n与cnt。
最后结果。
最后前仿结果。
&&&&&往下看有更多相关资料
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)

我要回帖

更多关于 前仿真和后仿真的区别 的文章

 

随机推荐