何时评估断言 "disable iff" 值?

when are assertion "disable iff" values evaluated?

对于这段代码,我发现两个断言都失败了。似乎 disable iff (value) 的评估晚于表达式本身。谁能解释一下。

module tb();
reg clk = 1;
always #5 clk = !clk;
reg rst = 1;
always @ (posedge clk)
    rst <= 0;

initial #11ns $finish();

assert property (@ (posedge clk) disable iff (rst) 1 |-> 0);
assert property (@ (posedge clk) rst |-> 0);
endmodule

跟进,如何测试这个:

always_ff @ (posedge clk or posedge rst) begin
    if (rst) q <= 0;
    else q <= d;
end

其中 rst 根据延迟取消断言:

always_ff @ (posedge clk)
    rst <= rst_a;

似乎禁用 iff 将不再起作用。因为它第一次评估很晚。

disable iff (expr) 中的表达式是异步的,并且使用未抽样的值。 属性 作为观察区域的一部分进行评估,该区域位于 NBA 区域之后。

对于第一个断言,rst 在第一次尝试评估观察区域中时间 10 的 属性 时已经很低。所以 disable iff 不会阻止对 属性 求值的尝试,它总是失败。

对于第二个属性,rst的采样值在第一次尝试评估属性时仍然是1,所以它一定会失败也。

跟进,

我想您可能正在担心一个不切实际的案例。重置后前提条件为真的可能性有多大?如果它是真的,那么这个断言应该仍然有效。例如,假设您有一个带有断言的计数器,用于检查它在达到最大值时是否翻转

assert property (@ (posedge clk) disable iff (rst) (counter==maxval) |=> (counter ==0) );

如果计数器的重置值 最大值,您不希望断言被禁用。