System verilog SystemVerilog断言:一旦A被断言,A将保持高位,直到B被反断言,然后A将最终处于低位

System verilog SystemVerilog断言:一旦A被断言,A将保持高位,直到B被反断言,然后A将最终处于低位,system-verilog,verification,system-verilog-assertions,System Verilog,Verification,System Verilog Assertions,我试图写一个断言: 一旦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被断言,A将保持高位,直到B被取消断言。在此之后,A将最终取消声明

我写的断言是:

my_assertion : assert property(
    @(posedge clk) disable iff(reset)
    $rose(A) |-> A throughout !B [->1] ## [0:$] !A) 
else $display("Assertion failed") 
在取消断言时,断言失败。伙计们,你们能告诉我我的断言哪里做错了吗?“[0:$]”是否未正确使用?

在整个过程中的优先级高于
;参见§16.9顺序操作表16-1

因此
A贯穿始终!B[->1]##[0:$]!A
是整个(!B[->1]#[0:$]!A)
中的样本A
A。这会失败,因为在上一个循环中,
A
必须为高(整个
的左侧)和低(整个
的右侧),这将始终被评估为false


我相信期望的行为是:
(A贯穿!B[->1])\!A

我认为您的问题是由于运算符优先级。当取消评估时,此操作不会失败:

$rose(A) |-> (A throughout !B [->1]) ## [0:$] !A
而您所写的内容与以下内容相同:

$rose(A) |-> A throughout (!B [->1] ## [0:$] !A)
它永远不会通过,因为
A
不能同时为真和假