让我们说有一个信号a
。当信号变高时,它必须至少在三个正时钟边沿保持高电平。
我们可以将该属性写为
property p;
@(posedge clk) $rose(a) -> a[*3];
endproperty
以下情况属性失败。
clk _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = |
a _ _ | = = = | _ _ | = = = = = = = = = = = = = = = = = = =
这不符合规范,其中a在中间处于低位,但在下一个posedge将被拉高,因此上述断言不会捕捉到这一点。
有人能说出是否有办法写断言来捕捉这个错误?
谢谢
答案 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");