如何在systemverilog断言中使用整个运算符

时间:2015-06-08 00:35:56

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

这是一个规范:  如果信号32767被置位,那么它必须被置位,直到信号a被置位,然后它应该在下一个时钟边沿解除置位。  我正在阅读LRM的16.9.9(以及http://www.testbench.in/AS_06_SEQUENCES.html)和我理解的方式,上面提到的规范可以写成

b

然而,在启动后第二个时钟边沿立即失败,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:11)

您想要使用throughout运算符进行断言是正确的,但您编写的代码存在一些问题。让我们一块一块地看一下。

每当我写一个断言时,我都会注意我要检查的自然语言描述。在您的情况下,我们知道我们希望在a0转到1时触发。之后发生的一切都是我们要检查的行为,因此它应该位于蕴涵算子的右侧:

$rose(a) |-> ... something ...

您编写断言的方式,只有在throughout之后rose(a)序列也发生时才会触发检查。这会让你忽略不良行为。

谜题的下一部分是" a必须保持高位直到b被断言"。在这里,我们将使用整个运营商。序列"直到b被断言"表示为b [->1]。这相当于!b [*] ##1 b。因此,我们的序列应为a throughout b [->1]

throughout变高时,b序列将结束。此时,我们需要检查a在下一个周期变低:##1 !a。我在这里使用了逻辑否定因为我发现它比按位否定更清楚,但结果应该是相同的。

总而言之,整个财产应该是:

$rose(a) |-> (a throughout b [->1]) ##1 !a;

我在这里使用了重叠含义,因为当b变高时a可能已经很高,在这种情况下,我假设a应该立即变低在下一个周期。如果没有,你可以自己弄清楚细节。

您可以在EDAPlayground找到一个有效的例子。