|
在网上查找了一些资料来学习,看来看去觉得一篇讲modelsim三种仿真方式的不错,就按着步骤一步步做了,结果可想而知,问题是一个接一个啊,摸索了两天还是有点收获的,且记下。
第一点:操控modelsim的基本方式
1.用户图形界面接口(GUI),在界面也接受命令行输入。(适合菜鸟)
2.DO文件,应该是用TCL脚步语言写的。(升级学习)
第二点:关于在modelsim添加altera仿真库的问题
在网上看到很多关于这方面的资料,但都是比较老的,然后我发现他们想要添加的库基本已经添加在新版 modelsim里面了,不知道是不是不用自己手动添加仿真库了,仿真的时候只要指定下就行,我在做流水灯小程序仿真的时候指定原有库没有问题,也许其他程序利用到别的库就需要自己制作添加了。10.30号听别人说之所以不用添加库是因为我使用的版本是 modelsim altera edition,里面自带altera仿真库。
第三点:关于三种仿真(仿真步骤操作很多资料,不提)
首先为自己扫盲一下。
modelsim分SE,PE,LE,XE(xilinx版本),AE(altera版本),集成在设计厂商的都是其OEM版本;仿真分为功能仿真(前仿真,RTL级),门级仿真(综合之后),时序仿真(布局布线之后),后两者也叫后仿真。进行功能仿真需要的文件:HDL文件(.v),testbench文件(.v),仿真时候指定预编译库,一般选择220model_ver;进行门级仿真需要的文件:testbench文件(.v),quartus ii产生的网表文件(.vo Verilog Output File),指定预编译库,一般就选相关的器件,如cycloneii_ver;进行时序仿真需要的文件:testbench文件(.v),quartus ii产生的网表文件(.vo),需要指定延时.sdo文件的路径,如其中led_inst是testbench里面例化顶层文件的例化名。 指定预编译库,一般就选相关的器件,如cycloneii_ver,这里需要注意的一点就是延时文件需要复制到Modelsim建立的project的根目录下,原因不详,不然就molesim仿真装载发生错误。
下面贴上三种仿真后的wave图。
此为功能仿真图,可以看出完全没有延时输出,时钟沿也是同步的。
此为门级仿真,可以看出延时输出,但时钟沿同步
此为时序仿真,可以看出延时输出,且时钟已经不同步了。 第四点:quartus ii的相关设置
首先设置modelsim的路径,如
接着assignment--settings设置如下
settings设置为on则只会产生.vo文件,off则除了有.vo文件还有.sdo文件(标准延时输出文件,标准延时文件SDF格式standard delay file)等,进行不同仿真时最好重新设置然后全编译下,因为如果在门级仿真文件夹里面有.sdo文件好像会发生问题,modelsim中装载仿真错误。注:比较新的quartue ii版本不再内置simulator工具,意思说不能使用内置仿真器进行仿真(Future versions of the quartus ii software will not support the quartus ii simulator Altera recommends using the modesim software for simulating designs ),当然也就不能从内部产生.sdo文件(以前版本进行全编译后会产生延时文件供simulator使用)
最好不要勾选run gate_level simulation automatically after compilation的选项,或者使用EDA RTL simmulation/EDA gate level simmulatiao菜单,使用modelsim 进行仿真,相对在Quartus 中直接调用modelsim,至少有三个好处: 1.速度快。仿真必然会不停的修改设计,每次修改设计后在quartus ii中需要重新综合后才能调用modelsim;时间花费更多,它还要等布局布线完成了才能调用。这样每次等待是件很痛苦的事。而直接在modelsim里面仿真,修改后只要重新编译即可仿真,速度要快的多。不过这样有一个坏处,那就是设计不一定是可综合的。但只要我们编程时时刻遵循可综合设计规则,培养良 好的编程风格,这个缺点影响可减到最低。 2.调试方便。在Quartus 中调用modelsim 仿真只能看到输入输出信号,而对 于设计的中间信号/变量,特别是ip 核的内部信号/变量无法观测。而在modelsim中直接仿真可以观测设计中出现的任何信号/变量无和 ip核内的任何信号/变量,这样我们设计的数据流向就可以很清楚的表示出来,还可以检测不同编程方式的处理效果,极大的方便了调试。 3.修改参数方便。在modelsim 中仿真ip 核时需要将该ip 核的行为描述文件加入到工程中去。修改该行为描述文件中ip 核的参数可以方便的更改ip 核特性。
第五点:关于modelsim仿真中出现红线或者蓝线的问题
刚开始出现了一片惨红的状况额,在QQ群咨询完,大概有以下原因会引起这种情况:1.RTL级中存在一些不可综合的代码,综合的时候被综合掉了,信号显示不出来;2.时序仿真的时钟设置不对,即testbench里面设置的时候得跟RTL级描述的相适应,在这里顺便说下modelsim里面的run XXX 时间只是单步仿真时候的长短,与这种情况无关;3.testbench中没有给一些信号赋予初始值;4.所谓的最白痴错误,testbench中不小心将信号描述成两个变量,就像RST_n与RST_N,本人就是这么白痴额。
以上只是本人遇到的一些问题与看法,也许与大家的有较大的出入,仅供参考。
补:产生Testbench从QuartusII中产生Testbench,有两种方法:
(1)从波形文件导出,方法如下:
打开波形仿真文件即.vwf文件,编辑输入信息,点击Flie—>Export,直接导出即可。
(2)也可以利用QuartusII产生Testbench模板,Processing>Start>Start Testbench TemplateWriter,再自行输入测试信息。
3、Assignment>Settings>EDA Tools Setting>Simulation,配置NativeLink,点击Test Benches,点击New,进入Test Bench Setting的页面,Test bench name 填asyn_fifo,此处可以随意填写,Top level module in test bench: asyn_fifo_vlg_tst,Design instance name in test bench这里填入asyn_fifo_tb.v中例化模块的名字,最后在最下面加入你的asyn_fifo_tb.v文件,点击OK即可。
注意:QuartusII中testbench文件的后缀是.vt,这个的模板可以通过Start->Start Test Bench Template Writer实现,产生的模板文件只是包含了端口映射,端口声明等,具体的功能还是需要设计者自己编写。
4、运行仿真。Tools>Run EDA Simulation Tool
其中,RTL Simulation是寄存器传输级仿真,它是理想化的仿真,不包含任何延时信息,通常用作功能检验,也称作前仿真或功能仿真;
Gate-Level Simulation是门级仿真,通常也称为后仿真或时序仿真,它包含逻辑电路、布局布线等延时信息,是对真实电路情况的仿真。要仿真门级仿真,需要在Fitter之后进行。
//////////////////////////////////////////////////////////////////////
今天在用Modelsim做一个后仿真的时候,发现PLL的没有输出,在设定不同的测试时钟频率的时候,出现一下三种情况:
(1)当输入时钟周期小于在例化PLL时选择的输入时钟周期时,在运行仿真时,会出现以下警告信息:
Warning : Input clock freq. is under VCO range. Cyclone III PLL may lose lock
(2)当输入时钟周期大于在例化PLL时选择的输入时钟周期时,在运行仿真时,会出现以下警告信息:
Warning : Input clock freq. is over VCO range. Cyclone III PLL may lose lock
这上面这两种情况下,PLL都不会正常工作。如果出现上面第一种情况,可以将输入测试时钟的周期设置大一些。如果出现第二种情况,可以将输入测试时钟的周期设置小一些。
(3)当输入时钟周期等于在例化PLL时选择的输入时钟周期时,在运行仿真时,会出现以下信息:
Note : Cyclone III PLL locked to incoming clock
这有这种情况下PLL才能正常工作
根据以上这三种情况,我判断应该是在编译后生成的.vo文件中,包含了PLL的设置信息,如PLL的输入频率。但是我也发现比较困惑的一点就是输入测试时钟的频率和例化PLL时设置的输入时钟频率也不一定非要相等,PLL才能工作。不知道这是什么原因。
但是也并不是只要将测试时钟的频率设定为与PLL的输入时钟完全相同时就一定可以正常工作,例如我例化的PLL的输入时钟频率为400MHz(从器件手册上看,Cyclone III 的PLL输入是支持这么高的频率的),在测试时我把输入测试时钟的频率设置为2.5ns,但是PLL没有输出。当我改为5ns的时候就有输出了。
另外,在进行前仿真是,也发现了同样的问题,即如果PLL的输入时钟频率不合适那么PLL将不能够工作,只不过在PLL不能正常工作的时候,Modelsim没有任何提醒,只有在正常工作时,才出现Note : Cyclone III PLL locked to incoming clock。并且设置测试时钟的频率也不一定非要与PLL的输出时钟频率相同才能正常工作。
不知道测试时钟的频率应该在一个什么范围内,PLL才能正常工作。希望更清楚的朋友多多指教!