Verdi查看force信号的四种方法
问题由来
一次仿真中发现信号的变化跟预期不一致,分析之下感觉不合逻辑,因此怀疑是有某个地方有force的动作,那么如何check是否有force呢?
因此做了一个小实验来检查是否有force动作,简单代码如下:
解决办法
- 最直接的办法,就是在波形中不合理的时刻,双击该信号的跳变沿,可以直接在工程中显示出该信号跳变的驱动位置
如果因为驱动的位置较多,可以进一步点击Verdi下方Message窗口,可以显示出所有驱动该信号的位置,看下有没有force的动作
注:这里显示的每行信号都可以双击跳转到工程中相应的位置
- 仿真时添加参数
+fsdb+force
重新仿真一遍,如果有force动作,那么波形中会有显示
注:是仿真阶段,不是编译阶段
示例如下:
波形中效果如下:
- 通过
fsdbreport
命令来打印环境中所有的force信息
fsdbreport ./work/wave.fsdb -find_forces -s "/tb/*" -of h -o force.log
命令中参数定义如下:
- -find_forces:即查找波形中force信息
- -s:制定查找的层次
- -of:指定结果中变量值得格式,
- 可选b/o/d/u/h分别表示二进制/八进制/十进制/无符号十进制/十六进制,默认为二进制
- -o:指定查找结果的输出文件,也可以不指定,默认为report.txt
注:fsdbreport还有很多作用和参数,后续再讲,也可以通过fsdbreport -help
查看详细信息
在当前目录下找到force.log文件,显示如下:
- 使用Verdi自带的APP:
使用方法如下:
在当前目录下(打开verdi的那级目录)查找生成的文件
注1:如果没有找到文件,那么可以在生成时候,看下生成目录
注2:Verdi的APP很多都非常实用,后续详细讲解,感兴趣的话也可以逐个点击玩儿一下,生命的意义在于探索嘛
结语
- 方法1和方法2,在只是debug某个信号是否被force的情况下,比较直接和高效;
- 方法3和方法4,在查找工程中都有哪些信号被force的时,比较实用。我们项目中有项checklist就是检查环境中是否有不当的force操作,就是采用方法4来实现的
最后留个小悬念吧:为什么检查环境中是否有不当操作时,为什么我们不用方法3呢?相信你如果把上述方法尝试了一遍之后,心中自有分晓。