何时评估断言 "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) );
如果计数器的重置值 是 最大值,您不希望断言被禁用。
对于这段代码,我发现两个断言都失败了。似乎 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) );
如果计数器的重置值 是 最大值,您不希望断言被禁用。