SystemVerilog断言中的空成功

科技   2024-12-13 16:48   美国  

除了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


由于strongsequence_expr)只需要一个匹配的sequence_expr,当且仅当属性strongfirst_matchsequence_expr))被计算为true时,strongsequence_expr)的属性才会被评估为true。


数字芯片实验室
前瞻性的眼光,和持之以恒的学习。
 最新文章