Vivado 调用 Questa Sim 或 ModelSimsimulation 来解决一些自动化问题。
Vivado调用Questa Sim仿真的一些问题
首先说明一下,Modelsim和Questa Sim都可以和Vivado联合调试,比较相似。不过Questa Sim比Modelsim有更广泛的功能,对SystemVerilog有更完整的语法支持。本文以Questa Sim为例,说明Vivado调用第三方仿真软件查看波形时出现的一些问题。
1. 添加新观测信号需要重新模拟
当Vivado直接调用Modelsim/QuestaSim进行仿真时,波形文件中默认只会出现仿真顶层包含的信号。如果运行仿真一段时间后想查看其他模块的信号波形,需要重新仿真或者运行do XXX_m.smtshopping.cn即可。以图1所示工程为例,
图1 vivado示例项目
在这个项目中,我们调用Questa Sim进行模拟。可以看到顶层模块会自动运行100ns,如图2
图2 QuestaSim仿真波形
此时,如果我们想查看l_ethernet_0_pkt_gen_mon模块的波形,可以直接进入波形界面添加。结果如图3所示。
图3 QuestaSim仿真波形
从图3可以看出,当模块的信号被添加后,在已经运行的仿真时间内,没有新添加的信号的仿真结果。
2.修改逻辑代码后,需要再次调用模拟器
在代码调试过程中,修改了一些逻辑代码(不包括IP核)后,如果想查看修改后工程的仿真结果,需要关闭当前仿真器,然后从vivado中重新调用。原因是vivado生成XXX_compim.smtshopping.cn文件时,会自动在其末尾添加“quit -force”语句,并且更改后相应的代码文件,我们需要执行“do XXX_m.smtshopping.cn”命令来重新编码整个库。然而,当运行这个文件时,当前的模拟器将被强制退出。
解决方案
为了解决以上问题,让使用更加方便,本文使用TCL语言编写了一个更加方便的do文件,可以实现以下功能:
1.自动修改XXX_m.smtshopping.cn
自动修改XXX_m.smtshopping.cn,去掉最后的“quit -force”,生成新的m.smtshopping.cn文件。对应的源码如下:
setf文件名[glob*_m.smtshopping.cn] setcontent[打开$文件名+] 设置行0 而{![eof$内容]}{ 乌鸦 获取$内容行 曲目列表($行)$行 } 关闭$内容 setfilename2"编译.do"; setcontent[打开$文件名2w+] 对于{seti1}{$i<= $row} {incr i} {如果{![字符串匹配“quit -force”$list($i)]} { 放置$内容$列表($i) } }; 关闭$内容
2.使用“log -r /*”命令
该命令允许modelsim/Questa Sim在仿真时同时仿真所有信号,从而解决新添加的观测信号没有仿真结果的问题;
3.确保模拟器不退出
修改工程中的逻辑代码(不包括IP核)后,只需要运行do文件,就会自动编译并仿真,并使用修改后的m.smtshopping.cn文件保证仿真器不退出,其对应的源码如下:
设置文件名编译.do do$文件名 setfilename[glob*_m.smtshopping.cn] do$文件名 对数-r/* 强制重启 运行1毫秒
日常
在使用这个do文件之前,需要先通过vivado调用modelsim/questasim,然后将do文件复制到项目对应的beeve文件夹中。仍以图1所示的项目为例,修改代码内部的部分逻辑后,在QuestaSim的transcrip界面中输入命令do auto_update_m.smtshopping.cn即可自动重新编译并仿真。结果如图4所示(默认仿真时间设置为1ms)
图4 QuestaSim仿真波形
添加l_ethernet_0_pkt_gen_mon模块后,可以发现在仿真时间内也有仿真结果,如图5。
图5 QuestaSim仿真波形
完整源码
setfilename[glob*_m.smtshopping.cn] setcontent[打开$文件名+] 设置行0 而{![eof$内容]}{ 内嵌 获取$内容行 曲目列表($行)$行 } 关闭$内容 setfilename2"编译.do"; setcontent[打开$文件名2w+] for{seti1}{$i<=$row} {incr i} { if {![字符串匹配“quit -force”$list($i)]} { 放置$内容$列表($i) } }; 关闭$内容 设置文件名m.smtshopping.cn 执行$文件名 设置文件名 [glob *_m.smtshopping.cn] 执行$文件名 日志 -r /* 重新启动——强制 运行 1 毫秒
审核编辑:刘清