断言以验证信号中的毛刺

Assertion to verify a glitch in a signal

假设有信号a。当信号变高时,它必须至少保持三个正时钟边沿的高电平。

我们可以把属性写成

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

对于以下情况,属性 失败。

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

一个 _ _ | = = = | _ _ | ==================

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

谁能告诉我是否有任何方法可以编写断言来捕捉这个错误?

谢谢

你在这里混淆了东西。通过在信号 a 上编写时钟断言,您可以验证它是一个具有特定行为的同步信号。

同步信号可以在时钟边沿之间出现所有它们想要的毛刺,因为它们永远不会在那里被采样。这正是我们现在使用同步信号的原因,即让信号有机会在我们采样之前稳定到它的值。

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

Tudor 是的,在大多数情况下,时钟边沿之间发生什么并不重要。但在 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");