Verdi查看force信号的四种方法

问题由来

一次仿真中发现信号的变化跟预期不一致,分析之下感觉不合逻辑,因此怀疑是有某个地方有force的动作,那么如何check是否有force呢?
因此做了一个小实验来检查是否有force动作,简单代码如下:
小demo代码

解决办法

  1. 最直接的办法,就是在波形中不合理的时刻,双击该信号的跳变沿,可以直接在工程中显示出该信号跳变的驱动位置
    在这里插入图片描述
    如果因为驱动的位置较多,可以进一步点击Verdi下方Message窗口,可以显示出所有驱动该信号的位置,看下有没有force的动作
    注:这里显示的每行信号都可以双击跳转到工程中相应的位置
    在这里插入图片描述
  2. 仿真时添加参数+fsdb+force重新仿真一遍,如果有force动作,那么波形中会有显示
    注:是仿真阶段,不是编译阶段
    示例如下:
    在这里插入图片描述
    波形中效果如下:
    在这里插入图片描述
  3. 通过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文件,显示如下:
    在这里插入图片描述
  1. 使用Verdi自带的APP:
    使用方法如下:
    在这里插入图片描述
    在当前目录下(打开verdi的那级目录)查找生成的文件
    在这里插入图片描述
    注1:如果没有找到文件,那么可以在生成时候,看下生成目录
    在这里插入图片描述
    注2:Verdi的APP很多都非常实用,后续详细讲解,感兴趣的话也可以逐个点击玩儿一下,生命的意义在于探索嘛

结语

  • 方法1和方法2,在只是debug某个信号是否被force的情况下,比较直接和高效;
  • 方法3和方法4,在查找工程中都有哪些信号被force的时,比较实用。我们项目中有项checklist就是检查环境中是否有不当的force操作,就是采用方法4来实现的
    最后留个小悬念吧:为什么检查环境中是否有不当操作时,为什么我们不用方法3呢?相信你如果把上述方法尝试了一遍之后,心中自有分晓。