ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Modelsim与Vivado联合仿真波形不显示的五种解决方法

Modelsim与Vivado联合仿真波形不显示的五种解决方法 1. 联合仿真环境搭建的核心逻辑与常见误区搞FPGA开发的朋友对Modelsim和Vivado这对组合肯定不陌生。Vivado自带的仿真器XSim跑小规模测试还行一旦设计里塞了几个IP核、或者需要跑长时间的后仿XSim的编译速度和调试体验就有点捉襟见肘了。Modelsim在波形查看、断点调试、信号追踪这些方面的成熟度确实高出一截所以很多人会选择用Modelsim来做Vivado工程的仿真验证。但这两个工具来自不同厂商联调时环境配置的坑特别多其中最让人抓狂的就是——编译明明通过了仿真也跑完了波形窗口里却空空如也一个信号都看不到。这个问题我前前后后帮同事排查过不下二十次每次原因都不太一样。有人是库映射没做对有人是优化选项把信号给“吃”了还有人折腾了半天发现是测试平台里根本没产生激励。这篇内容就把这些年在Modelsim和Vivado联合仿真中遇到的波形不显示问题做个系统梳理给出五种经过实测的解决方法。不管你是刚接触联合仿真的新手还是已经用过一段时间但偶尔还会踩坑的老手应该都能从中找到对应的排查思路。1.1 为什么选择Modelsim而不是XSim先说说为什么要在Vivado工程里外挂Modelsim。XSim作为Vivado的原生仿真器优势在于和工程的集成度高不需要额外配置编译库点一下就能跑。但它的短板也很明显编译大型设计时速度慢波形加载后操作卡顿对于复杂的调试场景支持不够灵活。Modelsim的编译效率明显更高波形窗口的响应速度快支持更多的调试功能比如信号强制赋值、动态断点、波形比较等。另一个现实原因是很多公司的验证流程已经固化了验证团队用Modelsim或者VCS设计团队用Vivado两边需要对接。这种情况下让设计工程师在Vivado里调用Modelsim做仿真比让验证团队重新搭一套Vivado环境要省事得多。所以联合仿真的需求是真实存在的不是没事找事。1.2 联合仿真的基本流程Vivado调用Modelsim做仿真核心流程分三步第一步是在Vivado里编译仿真库把Xilinx的IP核和原语编译成Modelsim能识别的库文件第二步是在Vivado里设置仿真目标为Modelsim指定Modelsim的安装路径和库文件路径第三步是启动仿真Vivado会自动生成一个DO脚本调用Modelsim执行编译、加载和运行。听起来不复杂但每一步都有坑。编译库的时候版本不匹配会导致编译失败设置路径的时候空格和斜杠方向不对会导致找不到文件DO脚本里的优化选项设置不当会导致信号被优化掉。波形不显示这个问题可能出现在任何一个环节。2. 波形不显示的五大原因与解决方法下面进入正题逐一分析波形不显示的五种典型情况。每种情况我都会说明现象、原因和具体的解决步骤你可以对照自己的实际情况来排查。2.1 仿真库映射错误导致信号无法加载这是最常见的原因之一。现象是Modelsim的Transcript窗口里能看到编译和加载的过程没有报错但波形窗口里就是没有信号。打开Objects窗口发现里面是空的或者只有几个顶层端口内部信号一个都看不到。根本原因在于Vivado编译的仿真库和Modelsim实际使用的库没有正确映射。Vivado在编译Xilinx IP核时会生成一系列库文件比如unisims_ver、simprims_ver、xilinx_vip等。如果Modelsim的modelsim.ini文件里没有正确配置这些库的路径或者Vivado生成的DO脚本里库映射语句有误Modelsim就找不到对应的模块定义导致信号无法正常加载。解决方法分三步。第一步检查Vivado的仿真库编译设置。在Vivado的Tools菜单下找到Compile Simulation Libraries确认编译的目标仿真器选的是Modelsim编译输出的路径不要有中文和空格。第二步检查Modelsim安装目录下的modelsim.ini文件确认里面包含了Vivado编译库的映射路径。可以用文本编辑器打开这个文件搜索unisims_ver看看后面的路径是否指向你实际编译库的位置。第三步如果modelsim.ini没问题检查Vivado生成的DO脚本。在仿真目录下找到simulate.do或者类似名称的文件用文本编辑器打开看看里面的vmap语句是否正确。有时候Vivado生成的路径会带有反斜杠或者多余的空格手动修正后重新运行仿真即可。注意修改modelsim.ini之前先备份一份这个文件是Modelsim的全局配置改错了会影响所有工程的仿真。2.2 信号被综合优化导致波形为空第二种情况是仿真跑完了Transcript窗口显示仿真正常结束但波形窗口里只有时钟和复位信号其他内部信号全部消失。这种情况通常发生在后仿或者对综合后的网表做仿真时。原因是Vivado在综合过程中对信号做了优化。综合器会把一些没有实际负载的信号、常量传播后的中间信号、以及被优化掉的逻辑直接从网表中移除。这些信号在仿真时自然就不存在了波形窗口里当然看不到。解决这个问题的核心思路是在综合阶段保留需要观察的信号。具体操作是在Vivado的Synthesis Settings里把-flatten_hierarchy选项设置为none这样可以保留设计的层次结构方便在波形里按层次查找信号。另外对于关键信号可以在RTL代码里加上(* keep true *)或者(* dont_touch true *)属性告诉综合器不要优化这些信号。如果已经综合完了不想重新跑也可以在Vivado的Tcl Console里执行set_property KEEP_HIERARCHY true [get_cells 信号名]来强制保留特定层次。不过这种方法只对当前工程有效重新综合后需要重新设置。还有一个容易被忽略的点是仿真时的优化选项。Modelsim在加载设计时默认会做一些优化比如把常量信号合并、把未使用的信号移除。可以在DO脚本里加上-novopt选项来关闭优化这样所有信号都会保留。不过-novopt会降低仿真速度只在调试阶段使用调试完成后去掉即可。2.3 测试平台未产生激励导致信号无变化第三种情况比较隐蔽波形窗口里能看到信号但所有信号都是一条直线没有任何跳变。这种情况通常是因为测试平台没有正确产生激励或者激励信号的初始值设置有问题。我遇到过好几次这样的情况测试平台里写了时钟生成逻辑但时钟信号的初始值是U未初始化导致整个设计处于未知状态所有信号都停留在U上。还有一种情况是复位信号没有正确释放设计一直处于复位状态内部逻辑不工作信号自然没有变化。排查这个问题的第一步是检查时钟和复位信号。在波形窗口里找到时钟信号看看它有没有在翻转。如果没有翻转检查测试平台里的时钟生成代码确认初始值和翻转周期设置正确。复位信号也是同理确认复位在仿真开始后经过一定时间被释放。第二步是检查激励信号的驱动。如果测试平台里通过initial块或者always块给输入信号赋值确认这些块的执行条件是否满足。有时候因为敏感列表写错了或者条件判断永远为假导致赋值语句根本没有执行。第三步是检查仿真时间。有些设计的激励产生需要等待一段时间如果仿真运行时间太短激励还没产生仿真就结束了。可以在DO脚本里把run命令的时间参数调大一些比如从run 1000ns改成run 100us看看信号有没有变化。实操心得在测试平台的开头加上$dumpfile和$dumpvars语句把关键信号的变化记录到VCD文件里。即使Modelsim的波形窗口有问题也可以用其他工具打开VCD文件查看信号变化快速定位是激励问题还是波形显示问题。2.4 DO脚本配置错误导致波形窗口未加载第四种情况是Modelsim启动了Transcript窗口也有输出但波形窗口根本没有弹出来或者弹出来了但是空的。这种情况通常是DO脚本的配置有问题。Vivado生成的DO脚本一般包含以下几个部分创建库、映射库、编译源文件、加载设计、添加波形、运行仿真。如果其中某一步出错后面的步骤就不会执行。比如编译源文件时报错了加载设计就会失败波形窗口自然不会有内容。排查方法是逐行检查DO脚本。在Modelsim的Transcript窗口里可以看到每一条命令的执行结果。如果某条命令前面有红色的错误提示那就是问题所在。常见的错误包括文件路径不对、库名拼写错误、编译选项不兼容等。另一个常见问题是波形添加命令没有生效。DO脚本里通常会有add wave命令来添加需要观察的信号。如果信号路径写错了或者信号在设计中不存在add wave命令会报错波形窗口里就不会显示对应的信号。可以在Transcript窗口里手动执行add wave命令看看能不能成功添加。如果手动添加成功但脚本里不行那就是脚本里的路径写法有问题。还有一种情况是波形窗口的显示设置问题。Modelsim的波形窗口有多个面板如果信号添加到了隐藏的面板里或者波形窗口的缩放比例不对看起来就像是没有信号。可以尝试在波形窗口里按Zoom Full按钮或者检查一下信号是否被添加到了正确的面板。2.5 版本兼容性问题导致仿真异常第五种情况是版本不匹配导致的。Vivado和Modelsim的版本更新都比较频繁不同版本之间的兼容性有时候会出问题。比如Vivado 2020.2编译的仿真库在Modelsim 2022.2里可能无法正常加载或者Vivado 2018.3生成的DO脚本在Modelsim 10.7里执行会报错。版本兼容性问题通常表现为编译库时没有报错但加载设计时提示找不到模块或者仿真能跑起来但波形窗口里的信号显示异常比如信号名乱码、信号值显示为红色线条等。解决方法是尽量使用官方推荐的版本组合。Xilinx的文档里会列出每个Vivado版本支持的Modelsim版本范围按照推荐组合来配置可以避免大部分兼容性问题。如果因为项目原因必须使用特定版本可以尝试以下方法第一用Vivado自带的编译库工具重新编译仿真库确保库文件和当前Vivado版本匹配第二在Modelsim的启动参数里加上-version检查版本信息确认实际使用的Modelsim版本和预期一致第三如果问题依然存在可以尝试用Vivado的XSim先跑一遍仿真确认设计本身没有问题然后再切换到Modelsim排查环境问题。注意Modelsim有多个版本分支比如Modelsim SE、Modelsim DE、QuestaSim等不同分支的兼容性表现不一样。Vivado对Modelsim SE的支持最好QuestaSim的功能更全但配置稍复杂。选择的时候根据项目需求和预算来定。3. 联合仿真环境配置的完整实操流程前面讲了波形不显示的五大原因和解决方法下面把联合仿真的完整配置流程梳理一遍。按照这个流程走可以避免大部分环境问题。3.1 编译Xilinx仿真库第一步是编译仿真库。打开Vivado在Tools菜单下选择Compile Simulation Libraries。在弹出的对话框里Simulator选ModelsimCompiled library location选择一个没有中文和空格的路径比如D:/Xilinx/sim_lib。Simulator executable path指向Modelsim的安装目录下的win64文件夹。编译过程可能需要十几分钟到半个小时取决于电脑性能和选择的器件系列。编译完成后在输出路径下会生成一系列文件夹每个文件夹对应一个库。同时Vivado会生成一个modelsim.ini文件里面包含了库的映射信息。编译完成后把这个modelsim.ini文件的内容合并到Modelsim安装目录下的modelsim.ini里。可以直接用文本编辑器打开两个文件把Vivado生成的那部分内容复制过去。注意不要覆盖原有的配置只添加新的库映射即可。3.2 配置Vivado工程仿真设置库编译好之后在Vivado工程里设置仿真目标。在Settings里找到Simulation选项卡Target simulator选ModelsimCompiled library location指向刚才编译库的路径Simulator executable path指向Modelsim的可执行文件。这里有一个细节需要注意Vivado的仿真设置里有Compilation和Elaboration两个选项。Compilation选项控制编译时的优化级别Elaboration选项控制加载设计时的优化级别。如果波形不显示可以把这两个选项都设置为Debug模式关闭优化。调试完成后可以改回默认值以提高仿真速度。另外在Simulation设置里还有一个xsim.simulate.runtime选项控制仿真运行的时间。默认值可能比较短如果测试平台的激励产生需要较长时间可以把这个值调大比如设置为all表示运行到测试平台结束。3.3 生成并修改DO脚本设置完成后在Vivado里点击Run Simulation选择Run Behavioral Simulation。Vivado会自动生成DO脚本并启动Modelsim。DO脚本的位置在工程目录下的.sim文件夹里文件名通常是simulate.do。打开这个DO脚本检查以下几个关键点第一库映射语句是否正确特别是unisims_ver和simprims_ver这两个库的路径第二编译源文件的顺序是否正确IP核的仿真文件应该在顶层文件之前编译第三add wave命令的信号路径是否正确可以用通配符*来添加所有信号确认波形窗口能正常显示后再改成具体信号。如果DO脚本里有-novopt选项确认它是否在正确的位置。-novopt应该加在vsim命令后面而不是vlog命令后面。加错位置会导致编译报错。3.4 启动仿真并验证波形DO脚本检查无误后在Modelsim里执行do simulate.do命令启动仿真。观察Transcript窗口的输出确认没有错误提示。仿真运行结束后波形窗口应该能看到信号的变化。如果波形窗口还是空的按照前面讲的五种情况逐一排查。先检查Objects窗口里有没有信号如果没有说明是库映射或优化问题如果有信号但波形是直线说明是激励问题如果波形窗口根本没弹出来说明是DO脚本配置问题。实操心得在DO脚本的最后加上wave zoom full命令让波形窗口自动缩放到全时间范围。这样可以避免因为缩放比例不对导致看起来没有波形。4. 常见问题速查与避坑技巧这一部分整理了一些高频问题和对应的解决方法方便快速查阅。4.1 常见问题速查表现象可能原因解决方法Objects窗口为空库映射错误检查modelsim.ini和DO脚本里的vmap语句只有顶层端口有信号综合优化设置keep_hierarchy或添加keep属性信号全是直线测试平台无激励检查时钟、复位和输入信号的驱动波形窗口未弹出DO脚本错误逐行检查Transcript窗口的错误提示信号名乱码版本不兼容使用官方推荐的版本组合仿真速度极慢优化选项关闭调试完成后去掉-novopt选项编译库时报错路径含中文或空格更换为纯英文无空格路径加载设计时找不到模块库文件缺失重新编译仿真库4.2 避坑技巧汇总第一个技巧是关于路径的。Vivado和Modelsim对路径中的空格和中文支持都不好工程路径、库路径、Modelsim安装路径都尽量用纯英文不要有空格。如果用户名是中文可以考虑在D盘根目录下建一个英文名的文件夹来放工程。第二个技巧是关于版本选择的。如果项目没有特殊要求尽量用Vivado和Modelsim的稳定版本组合。比如Vivado 2020.2配Modelsim 2020.4或者Vivado 2018.3配Modelsim 10.7。新版本虽然功能多但兼容性问题也相对多一些。第三个技巧是关于仿真库的。如果多个项目共用一套仿真库可以把库编译到一个公共路径下然后在每个工程的Modelsim设置里指向这个路径。这样可以节省编译时间也方便统一管理。但要注意不同Vivado版本编译的库不能混用需要按版本分开存放。第四个技巧是关于DO脚本的。Vivado生成的DO脚本每次重新仿真都会被覆盖所以如果手动修改了DO脚本要么在修改后备份一份要么把修改内容写到一个单独的Tcl文件里在DO脚本里用source命令调用。这样重新生成DO脚本后只需要重新添加source语句即可。第五个技巧是关于波形调试的。如果波形不显示的问题反复出现可以在测试平台里加上$dumpfile和$dumpvars语句把信号变化记录到VCD文件。用GTKWave或者DVE打开VCD文件可以绕过Modelsim的波形窗口直接查看信号。这个方法在排查环境问题时特别有用可以快速判断是设计问题还是工具配置问题。4.3 后仿真的特殊注意事项后仿真比前仿真更容易出现波形不显示的问题因为后仿真用的是综合后的网表信号名和RTL阶段不一样很多信号被优化掉了。做后仿真时需要注意以下几点第一后仿真的网表文件需要从Vivado里导出。在Implementation完成后用write_verilog命令导出网表注意加上-mode timesim选项这样导出的网表包含时序信息可以用于时序仿真。第二后仿真需要加载SDF文件。SDF文件包含了网表的时序信息在Modelsim里用vsim -sdf命令加载。如果SDF文件路径不对或者格式不匹配仿真会报错或者波形异常。第三后仿真时信号名会带有层次前缀比如/top/uut/signal_name。在add wave命令里需要用完整的层次路径不能用RTL阶段的短名。可以在Objects窗口里找到信号后右键选择Copy Full Path然后粘贴到DO脚本里。第四后仿真的仿真时间通常比前仿真长很多因为网表里的门级单元多仿真事件密集。如果仿真时间设置太短可能还没跑到有激励的阶段就结束了。建议把仿真时间设置得充裕一些或者用run -all命令运行到测试平台结束。5. 联合仿真的效率优化与扩展思路环境配置好之后还可以做一些优化来提高仿真效率。这一部分分享几个实用的技巧。5.1 增量编译与库复用Modelsim支持增量编译也就是说如果只修改了部分源文件重新编译时只编译修改过的文件没有改动的文件直接复用之前的编译结果。这个功能在大型设计中可以节省大量时间。要启用增量编译需要在Modelsim的编译选项里加上-incr参数。Vivado生成的DO脚本默认可能没有这个选项可以手动添加。另外编译库的路径要保持不变如果换了路径增量编译的缓存就失效了需要重新编译。对于多个项目共用仿真库的情况可以把库编译到一个公共路径下然后在每个工程的DO脚本里用vmap命令映射到这个公共路径。这样只需要编译一次库所有工程都能用。但要注意不同Vivado版本的库不能混用需要按版本分开存放。5.2 波形保存与离线分析Modelsim支持把波形保存为WLF文件方便离线分析。在仿真过程中可以用write wave命令把当前波形保存下来。下次打开Modelsim时用read wave命令加载WLF文件不需要重新跑仿真就能查看波形。这个功能在调试长时间仿真时特别有用。比如跑一个几毫秒的仿真需要几个小时如果每次都要重新跑一遍才能看波形效率太低了。可以在仿真跑完后保存WLF文件然后慢慢分析。如果发现需要观察其他信号再重新跑仿真并添加信号。另外Modelsim还支持把波形导出为VCD、FSDB等格式。VCD是通用格式可以用GTKWave等免费工具打开。FSDB是Verdi的格式需要用Verdi查看。导出命令是write wave -format vcd或者write wave -format fsdb。5.3 脚本自动化与批量仿真如果需要对多个测试用例做批量仿真可以写一个Tcl脚本来自动化整个过程。脚本里包含编译、加载、运行、保存波形、退出等命令然后循环调用不同的测试用例。一个典型的批量仿真脚本结构是这样的先编译所有源文件然后对每个测试用例执行加载设计、运行仿真、保存波形、退出当前仿真、加载下一个测试用例。这样可以一次性跑完所有用例不需要人工干预。在写批量仿真脚本时需要注意每个测试用例的仿真时间可能不同可以用run -all命令让仿真运行到测试平台结束而不是用固定的时间参数。另外每个测试用例的波形文件要保存到不同的路径避免覆盖。实操心得批量仿真时可以在脚本里加上日志输出把每个测试用例的编译结果、仿真结果、波形保存路径都记录到一个日志文件里。这样跑完之后可以快速查看哪些用例通过了哪些失败了方便定位问题。5.4 与其他仿真工具的协同虽然这篇内容主要讲Modelsim和Vivado的联合仿真但实际项目中可能还会用到其他仿真工具。比如验证团队可能用VCS和Verdi算法团队可能用MATLAB和Simulink。不同工具之间的协同也是一个值得关注的点。如果验证团队用VCS设计团队用Vivado和Modelsim两边需要对接时可以统一用VCD或者FSDB格式来交换波形数据。VCS可以导出FSDB格式Modelsim也可以导出FSDB格式两边用Verdi打开同一份波形文件就可以在同一个界面里对比分析。如果算法团队用Simulink需要把算法模型和RTL设计做联合仿真可以考虑用Vivado的System Generator或者HDL Coder来生成RTL代码然后在Modelsim里做仿真验证。这种跨工具的联合仿真配置更复杂但基本思路是一样的统一接口、统一数据格式、分阶段验证。6. 个人实操经验与建议最后分享一些个人在联合仿真中积累的经验。这些经验不一定适用于所有情况但可以作为参考。第一个经验是关于排查顺序的。遇到波形不显示的问题时不要一上来就怀疑是工具配置问题。先确认设计本身有没有问题用XSim跑一遍仿真如果XSim能正常显示波形说明设计没问题问题出在Modelsim的环境配置上。如果XSim也不显示波形那就是设计或者测试平台的问题跟Modelsim无关。第二个经验是关于版本管理的。如果项目周期比较长建议把Vivado和Modelsim的版本固定下来不要随意升级。升级工具版本可能会导致仿真库不兼容、DO脚本格式变化等问题需要重新配置环境。如果必须升级先在测试工程里验证一遍确认没问题后再升级正式工程。第三个经验是关于文档记录的。联合仿真的环境配置步骤比较多建议把每一步的操作和参数都记录下来形成一份配置文档。这样下次换电脑或者重装系统时可以按照文档快速恢复环境不用重新摸索。文档里要包含Vivado版本、Modelsim版本、仿真库路径、DO脚本模板、常见问题解决方法等内容。第四个经验是关于社区资源的。Modelsim和Vivado的联合仿真问题在各大技术社区都有讨论遇到问题时可以先搜索一下有没有类似案例。Xilinx的官方论坛、Modelsim的Support Center、以及各种FPGA技术群都是不错的资源。但要注意甄别信息的时效性不同版本的解决方法可能不一样。第五个经验是关于心态的。联合仿真的环境配置确实比较繁琐第一次配置可能需要花几个小时甚至几天时间。但配置好之后后续的仿真调试效率会高很多。所以前期投入时间是值得的不要因为一时的问题就放弃Modelsim回到XSim。多试几次多查资料问题总能解决。提示如果实在搞不定Modelsim的环境配置可以考虑用Vivado自带的XSim先顶着。XSim虽然体验差一些但至少不需要额外配置能跑通设计验证。等有时间了再慢慢折腾Modelsim的环境。联合仿真这个事说到底就是工具链的集成问题。Vivado和Modelsim各自都是成熟的工具但凑在一起就需要做一些适配工作。波形不显示只是其中一个表现背后可能涉及库映射、优化选项、脚本配置、版本兼容等多个方面。按照这篇内容里的方法逐一排查大部分问题都能解决。如果遇到了这篇内容没覆盖到的情况欢迎在评论区交流我看到了会尽量回复。
返回列表