1

我正在通过 Verilog 对芯片进行一些测试,但我遇到了一些问题,我有点摸不着头脑。我正在测试代码的覆盖率,以确保所有状态都发生在对所有参数等的随机测试中。

在评估以下类型的两个值时:

case(state_vector)

    STATE1:
        ...

    STATE2:
        if(!var1 && var2)
             state_vector = STATE1;
        else
             state_vector = STATE2;

    STATE3:
        ...

现在的问题是,在进行覆盖分析时,永远不会到达 else 语句之后的语句,这意味着 if 语句总是评估为真。

我最初假设 var1 和 var2 的值分别为 0 和 1。在完成我的报告之前仔细检查后,我注意到这个假设是不正确的,因为波形分析表明在整个模拟过程中 var1 始终为 1 而 var2 始终为 0。

现在我将测试以确保值改变我想要的方式,但我很好奇在 Verilog 中这是如何发生的。本质上,我正在陷入一种状态,因为 if 语句在无限小的时间单位内评估为真。

关于如何更好地评估这个问题的任何想法?我想在尝试检查当前状态的同时检查另一个函数是否没有更改我的 state_vector。

4

1 回答 1

2

快速而肮脏的方法是散布$display("%t %m got here",$time);有问题的代码,并确保开始端块有标签,例如:

begin : meaningful_label
  $display("%t %m got here",$time);
  ... code ...
  $display("%t %m got here too",$time);
end

如果调用了显示语句,则将state_vector其分配到其他地方。否则,某些东西会阻止代码令人兴奋。

进一步调试:

  • 不显示消息:
    • 将更多显示消息添加到更高级别。
  • 显示消息:
    • 一些波形查看器具有主动驱动器跟踪。如果您的查看器没有此功能,则在所有其他分配语句周围添加消息,并在条件应为真时观察时间戳。
于 2013-06-05T00:02:24.757 回答