Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 249852|回复: 0

【原创】菜鸟学习Modelsim 之 遇到的问题及解决方法

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-4 16:30:13 | 显示全部楼层 |阅读模式

     

     

            将学习和使用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,否则如果不确定初始状态,而只给输入的话,会没有输出。

    16.

    解决方法:查看错误段代码:

     

    可以发现,此处出现了两个i1,一处是在实例引用的时候的实例名为i1,还有一处是端口名i1.因此可以知道实例名不可以取的和端口名一样,将实例名改为其他名字。

    17.监视语句应该放哪儿?

    解决方法:如果想对整个程序进行监视,则监视语句应单独写在一个initial模块中。

     18.仿真时如果想快速的知道哪些信号在何时发生了变化,而不是用光标一个一个在波形上定位(比较慢),那就妙用监视语句monitor.

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-4 05:59 , Processed in 0.074575 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表