除了formal verification外,在基于SV/UVM的随机验证中,也可以通过断言来检查所有模块,如仲裁、FIFO和其他自定义逻辑。
但断言的一个特征是空成功。(|->或|=>)的左侧是检查的条件,如果条件为true,右侧结果的值才有意义。如果左侧是false不成功,则默认认为该断言属性成功。这被称为“空成功”。
考虑以下情况:
我们有一个仲裁器,在接收到request以后N个周期后,可以断言grant。为了验证是否每个request都获得grant,我们将有以下属性:
property check();
@(posedge clk)
req |-> ##[0:$] gnt;
endproperty
但在这里,如果接收到请求之后,而我们从未从仲裁器那里获得grant,那么这种断言将在仿真结束时会空成功。
如果我们以某种方式使这种断言的空成功转化成fail,那么这将极大地有助于节省定位周期。
SystemVerilog LRM提供了一个“strong”运算符来通知断言失败。根据IEEE 1800-2017,第16.12.1节:
strong(sequence_expr) evaluates to true if, and only if, there is a nonempty match of the sequence_expr.
在这里,如果接收到请求,那么我们正在等待至少一个非空匹配的grant。如果我们看到请求,但从未看到grant,断言将失败。
property check();
@(posedge clk)
req |-> strong(##[0:$] gnt);
endproperty
由于strong(sequence_expr)只需要一个匹配的sequence_expr,当且仅当属性strong(first_match(sequence_expr))被计算为true时,strong(sequence_expr)的属性才会被评估为true。