断言以验证信号中的毛刺

时间:2015-02-08 04:39:14

标签: system-verilog assertions system-verilog-assertions

让我们说有一个信号a。当信号变高时,它必须至少在三个正时钟边沿保持高电平。

我们可以将该属性写为

property p;
@(posedge clk) $rose(a) -> a[*3];
endproperty

以下情况属性失败。

clk _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = |

a _ _ | = = = | _ _ | = = = = = = = = = = = = = = = = = = =

这不符合规范,其中a在中间处于低位,但在下一个posedge将被拉高,因此上述断言不会捕捉到这一点。

有人能说出是否有办法写断言来捕捉这个错误?

谢谢

2 个答案:

答案 0 :(得分:0)

你在这里混淆了什么。通过在信号a上写入时钟信号断言,您将验证它是具有特定行为的同步信号。

同步信号可能会在时钟边沿之间出现所有需要的毛刺,因为它们从未被采样过。这正是我们现在使用同步信号的原因,即在我们采样之前让信号有机会稳定到它的值。

如果您的信号a因某些原因不应该出现故障(我不是设计师,所以我不知道这会有什么用处),据我所知你会发现这个使用某种lint工具(例如Spyglass)对HDL代码进行结构分析。

答案 1 :(得分:0)

都铎是的,在大多数情况下,时钟边缘之间发生的事情并不重要。但是在CDC或异步设计中,我们必须验证设计是否无故障。 有一种由内而外的方式来做到这一点。 (我在http://www.verificationguild.com/modules.php?name=Forums&file=viewtopic&p=20045

找到了这个解决方案
property detect_glitch;
    time leading;                  // declare the last edge occurence variable
    @(glitch)                      // At every change of glitch signal
        //The following line saves the current time and check
        // the delay from the previous edge.
        (1, leading = $time) |=> (($time - leading) >= duration);
endproperty : detect_glitch

DETECT_GLITCH : assert property (detect_glitch)
else
    $display ("ERROR");