SystemVerilog 断言:一旦 A 被断言,A 将保持高电平直到 B 被取消断言,之后 A 最终将变为低电平
SystemVerilog Assertions: Once A is asserted, A remains high until B is de-asserted, and after that A will finally be low
我试着写了一个断言:
一旦 A 被断言,A 将保持高电平直到 B 被取消断言。之后,A 最终将被反断言。
我写的断言是:
my_assertion : assert property(
@(posedge clk) disable iff(reset)
$rose(A) |-> A throughout !B [->1] ## [0:$] !A)
else $display("Assertion failed")
A 被反断言时断言失败。伙计们,你能告诉我我在my_assertion中哪里做错了吗? “[0:$]”使用不正确吗?
##
的优先级高于throughout
;请参阅 IEEE1800-2012 § 16.9 序列操作 Table 16-1.
因此A throughout !B [->1] ## [0:$] !A
是样本aA throughout (!B [->1] ## [0:$] !A)
。这失败了,因为 A
需要在最后一个周期为高(throughout
的左侧)和低(throughout
的右侧),这将始终评估为 false。
我认为期望的行为是:(A throughout !B [->1]) ## [0:$] !A
我认为您的问题是由于运算符的优先级。当 A 无效时,这不会失败:
$rose(A) |-> (A throughout !B [->1]) ## [0:$] !A
而你写的是一样的:
$rose(A) |-> A throughout (!B [->1] ## [0:$] !A)
永远无法通过,因为A
不能同时为true和false。
我试着写了一个断言:
一旦 A 被断言,A 将保持高电平直到 B 被取消断言。之后,A 最终将被反断言。
我写的断言是:
my_assertion : assert property(
@(posedge clk) disable iff(reset)
$rose(A) |-> A throughout !B [->1] ## [0:$] !A)
else $display("Assertion failed")
A 被反断言时断言失败。伙计们,你能告诉我我在my_assertion中哪里做错了吗? “[0:$]”使用不正确吗?
##
的优先级高于throughout
;请参阅 IEEE1800-2012 § 16.9 序列操作 Table 16-1.
因此A throughout !B [->1] ## [0:$] !A
是样本aA throughout (!B [->1] ## [0:$] !A)
。这失败了,因为 A
需要在最后一个周期为高(throughout
的左侧)和低(throughout
的右侧),这将始终评估为 false。
我认为期望的行为是:(A throughout !B [->1]) ## [0:$] !A
我认为您的问题是由于运算符的优先级。当 A 无效时,这不会失败:
$rose(A) |-> (A throughout !B [->1]) ## [0:$] !A
而你写的是一样的:
$rose(A) |-> A throughout (!B [->1] ## [0:$] !A)
永远无法通过,因为A
不能同时为true和false。