何时在系统Verilog断言中使用暗示和何时使用## delay

时间:2019-08-04 18:16:04

标签: system-verilog-assertions

我有断言的场景,其中首先a应该是高的,此b之后的1个周期应该是高,而c之后的1个周期应该是高,在此之后具有1个周期的延迟d应该是高 我对应该如何对这些断言进行编码感到困惑。我有三种选择,请帮助我,这是正确的解决方法

选项1:a | => b | => c | => d;

选项2:a | => b ## 1 c ## 1 d;

选项3:a ## 1 b | => c ## 1 d;

这些选项让我陷入困境。请向我介绍最佳解决方案以及原因

2 个答案:

答案 0 :(得分:0)

根据我的描述,最好的编码是               a | => b | => c ## 1 d 原因:所使用的运算符是非重叠蕴涵运算符,该运算符告诉先行条件是否为真,然后在下一个时钟滴答时进行结果评估。因为只有当a为高时b才必须为高,否则就不需要使用此运算符。因此,a的条件为c的情况就是b.so的隐含条件。 但在d的情况下,语句表示延迟,这意味着使用##指定时钟周期延迟数。

答案 1 :(得分:0)

选项2是唯一正确的选项(假设您希望在a高时触发该选项)。如果前提条件为假或后果条件为真,则表示为真。 选项1:a | => b | => c | => d; ->如果!a,则为true,如果## 1!b,则为true,如果## 1 b ## 1!c,则为true。只要前提为假,整个陈述就为真。

当b为假时,基本(b | => c)为true,这意味着Option1表示如果a为高且b在下一个周期为高,且c在下一个周期为高,则d必须为高在最后一个周期。那不是您所需要的。

尽管您的问题实际上是要求a然后b然后c然后d。这就需要这样:

a ##1 b ##1 c ##1 d