考虑以下规范:
"interrupt must hold until interrupt ack is received"
这些断言是否相等且符合规范?
1-第一个断言(使用递归属性):
property intr_hold(intr, intrAck);
intrAck or (intr and (1'b1 |=> intr_hold(intr, intrAck)));
endproperty
assert property @(posedge clk) $rose(intr) |=> intr_hold(intr, intrAck);
2-秒断言(使用非递归属性):
assert property @(posedge clk) intr |=> intr or past(intrAck);
谢谢
答案 0 :(得分:0)
第一个属性不接受intr
和intrAck
都很低的周期。在这样的循环中,or
的第一部分失败,因此必须评估第二部分。这部分无法通过,因为and
的第一部分失败,因此连接失败。整个财产都失败了。
即使我们忽略了这样的循环,第一个断言也不能解决失败的情况。
让我们分析一下intr
信号变高时的示例。
intrAck
上的or
的第二部分开始匹配。 intr
传递,暗示的前导符合并触发下一周期的递归评估intrAck
传递,新属性尝试通过。之前计划的两个属性评估也会通过,因为intrAck
很高并且声明在第1周期和第2周期开始的属性评估也会通过。非递归表格很好。
从模拟效率的角度来看,即使以某种方式重写了递归形式以符合规范,也会更糟。这是因为有许多待定的属性评估。在第1周期开始的财产评估仍然是“活着”#34;直到第3周期开始的属性评估在第3周期之前仍然存在,因此在第2周期中,如果确定通过/失败需要第4个周期,则会有第3个未决评估。一旦启动了相同属性的新属性,一个工具可以通过忽略先前的评估来更有效地实现这一点(因为失败将无论如何得到信号),但是模拟器通常显示何时为了调试目的而开始完成的属性评估并且这得到更多如果" old"评估被抛弃,取而代之的是递归评估。