我有以下属性:
property p;
@(posedge clk) a |=> b[=2] ##1 c;
endproperty
它告诉我们如果a
被断言,那么从下一个clk
开始,b
应该连续两次断言,然后c
随时断言在最后b
之后。
我的问题是,如果c
在第一个b
和第二个b
之间声明,该怎么办?断言是否应立即失败或继续?
一些参考书说它应该失败,但我对此表示怀疑。预期的行为是什么?
答案 0 :(得分:3)
[=
或非连续重复运算符与 goto repetition 类似,但表达式不必为真 c
之前的时钟周期为真。
让我们说a
被断言。 暗示条件 满足,并进一步评估断言。
此后,b
检查两次, c
是什么。对于两个非连续时钟边沿,b
被发现被置为后,此后 c
在1个时钟周期后被检查(由于{ {1}})。
如果##1
断言且取消声明 c
被检查 2次,那么切换是不考虑。在b
的 2次断言之后,c
被认为是。
按照快照应该给出一个明确的想法:
传递快照:
失败捕捉:
在这里,即使b
出现故障,断言也没有通过。
有关详细信息,请参阅A Practical Guide for SystemVerilog Assertions pdf。 Doulos tutorial也是一个很好的。
答案 1 :(得分:0)
简而言之,是的,它会过去。无论c被断言在哪里,在观察到两个" b" s之后,它将等到c == 1。因此,如果c从一开始就是1并且永远不会变为零,那么它也会过去。
另一个要点是这个断言实际上会失败。它会在c被断言时通过,但如果没有,它将继续运行直到测试结束!您将仅在模拟结束时看到故障。