将学习和使用Modelsim过程中遇到的问题整理一下,并会不断更新ing...
本人使用的Modelsim版本为Modelsim SE-64 10.0c。
1.参照网上资料,用仿真命令 add wave/testdiv/ *为什么无法将信号加载进去?
解决方法:add wave * 命令就可以了。
2.使用vsim testdiv语句(仿真命令)没法显示所有的信号?
解决方法:可能是仿真的时候被优化了,在library窗口-->选择相应的模块名-->simulate without optimization,不优化的仿真,可以了。
3.利用modelsim联合quartus进行仿真的时候,用quartus打开modelsim报错:vsim is closed。
解决方法:因为modelsim在其他工程中打开了,关闭其他工程。
4.在Windows路径下创立工程目录,然后在Modelsim中在相应目录下创立工程文件后,work还是显示unavailable?
解决方法:不要在windows下创立工作路径,因为modelsim不会自动生成工作路径,只能在建立工程的时候创建工作路径,之后会提示没有该路径,是否创建该路径,点击是,还是不行,在library中删除原来的work,重建工程,重新编译,可以了。
5.Quartus产生testbech 测试文件,内部有eachvec变量时,仿真不成功。
解决方法:网上解答(当测试文件中有时钟信号,并且有@eachvec时,仿真时间很短,如果在它之前有在always过程块里规定时钟信号的翻转的话,这个时钟信号也不会翻转,那一行注释掉的话仿真才能得到一段很长的波形。但是当测试文件中没有时钟信号,去掉这一行,仿真就没有波形。推断eachvec是类似时钟信号一样的驱动信号)。我的解决方法:一般在没有clk的程序中,会保留eachvec ,有clk的程序中,屏蔽eachvec 。
6.在没有时钟信号,有eachvec 信号的测试程序仿真中,设定的信号值不会像预期设定那样变化,会有一些中间值跳变出来,这是为什么?
解决方法:一开始我还以为是eachvec的原因,后来发现原来是程序写错(第一次写测试文件,对一些语法还不是特别了解):
a <= 0;
b <= 1;
#200 a <= 1;
#200 b <= 0;
和
a <= 0;
b <= 1;
#200 a <= 1;b <= 0;
在intial引导的模块中,上面两段代码是有很大区别的,前面一段的意思是延时200ps后给a赋值1,再延时200ps后给b赋值0,相当于从一开始延时了400ps后给b赋值0,所以a,b一共会有三个状态:0,1-->1,1-->1,0。
而后面一段是过200ps后同时给a和b赋值1,0,所以a,b一共经历了两个状态0,1-->1,0。
7.若有一个信号是8位q[7:0],那么最终在波形图中如何查看四位q[7:4]四位q[3:0]的值。
解决方法:以前在Quartus II自带的仿真工具中,这个问题是很好解决的,只要分Group就行,后来查了相关资料,发现Modelsim虽然也有Group功能,但是只能分组,就是说将q[7:0]分为q[7:4]和q[3:0]后只能看到每一位的波形,而不能看到四位的波形。
后来我尝试更改测试文件testbench中的输出端口?无效。推测原因是因为测试文件中的输入输出端口都是在原始的Verilog 文件中定义好的,不能随意更改,测试文件主要是作输入激励用,自然不能更改输出端口了,于是在Quartus中仔细查看由原理图转换而来的Verilog代码,并更改了原始文件的输出端口,更改为两个输出端口q1,q2,为四位二进制,再最后将q[7:4]和q[3:0]赋值给q1和q2,重新生成testbench,调用modelsim仿真,就可以了。
8.在一个计数器的波形文件中,将q[3:0]信号格式改为十进制时,原本应该是8,9的值,结果显示-8,-7。
解决方法:查看了下面每一位的二进制数都是对的,把q[3:0]进制改成了十六进制,显示对了。
9.如何在modelsim中修改原设计文件。
解决方法:如果要在modelsim中修改原设计文件,在文档页面点击右键,取消Read Only,即可修改,修改后继续仿真。
10.如何在modelsim中查看任意信号波形。
解决方法:在主界面中点View->Debug Windows->Dataflow可以看到会出现dataflow窗口,在objects窗口中拖一个信号到该窗口中,你会发现在dataflow窗口中出现你刚才选中信号所在的模块,如果双击模块的某一引脚,会出现与该引脚相连的别的模块或者引线。
在dataflow窗口中点View->Show Wave,会在dataflow窗口中出现一个wave窗口,双击上面窗口中的某一模块,则在下面的wave窗口中出现与该模块相连的所有信号,如果已经执行过仿真,在wave窗口中还会出现对应的波形。
在波形窗口中拖动游标,上面模块的引脚信号的值也会随着游标当前位置的改变而改变。
11.如何保存波形文件。
解决方法:如果要保存波形窗口当前信号的分配,可以点File->Save->Format,在出现的对话框中设置保存路径及文件名,保存的格式为.do文件。如果是想导出自己创建的波形(在文章最后有详细的解释)可以选择File->Export Waveform在出现的对话框中选择EVCD File并进行相关设置即可,如果导入设计的波形选择File->Import ECVD即可。
12.modelsim 仿真后输出stx、 Hiz。
解决方法:仔细检查了电路,发现是有一个地方连错了才导致的,所以大家遇到这种情况最好先仔细的检查一下自己的电路图。
13.测试文件的激励波形写在哪?
解决方法:一开始我将各输入的初始化写在了intial模块中,而把测试激励的波形写在了always中(因为该波形是重复循环的,所以一开始就想到写在always中),怎么调都调不对。看了相关的资料,好好理解了一下intial和always的区别:intial和always模块都是同时并行执行的,区别在于intial模块只执行一次,而always模块则是重复不断运行。
intial是面向仿真的,是不可综合的,通常被用来描述测试模块的初始化、监视、波形生成等功能。在进行仿真时,一个intial模块从模拟0时刻开始仿真,且在仿真中只执行一次,在执行完一次后,该initial就被挂起,不再执行。
如果仿真中有两个initial模块,则同时从0时刻开始执行。
因此我将激励波形的生成写在了initial中,只不过使用了while语句,而且我有两个激励波形,为了由于延时的原因避免相互之间产生干扰,就用了两个intial模块,分别使用while,最终生成了预期的激励波形。所以总结如果是激励波形的生成还是写在intial中好。
14.如果提示错误:一些模块没有定义
解决方法:仔细检查Quartus里该模块是否已经定义,如果已经定义,那么就关闭Modelsim和Quartus,再重新打开重新编译即可。
15.时序逻辑电路如何给激励仿真
解决方法:时序逻辑电路当前输出不仅与当前输入有关,还和当前状态有关,因此在给激励的时候,首先需要确定一下初始状态,比如清零端清零,这样初始状态就为0,否则如果不确定初始状态,而只给输入的话,会没有输出。
解决方法:查看错误段代码:
可以发现,此处出现了两个i1,一处是在实例引用的时候的实例名为i1,还有一处是端口名i1.因此可以知道实例名不可以取的和端口名一样,将实例名改为其他名字。
17.监视语句应该放哪儿?
解决方法:如果想对整个程序进行监视,则监视语句应单独写在一个initial模块中。
18.仿真时如果想快速的知道哪些信号在何时发生了变化,而不是用光标一个一个在波形上定位(比较慢),那就妙用监视语句monitor.