SystemVerilog:暗示运营商与| - >

时间:2014-07-23 13:48:37

标签: system-verilog system-verilog-assertions implication

最近出现的问题是SystemVerilog中通常的蕴涵运算符(|->)和implies运算符之间的区别。不幸的是我还没找到一个明确的答案。但是,我收集了以下信息:

来自SystemVerilog LRM 1800-2012

  • §16.12.7 Implies和iff属性

      

    property_expr1 implies property_expr2
      当且仅当property_expr1求值为false或property_expr2求值为true时,此形式的属性求值为true。

  • §F.3.4.3.2派生的布尔运算符

      

    p1 implies p2 ≡ (not p1 or p2)

  • §F.3.4.3.4派生条件运算符

      

    (if(b) P) ≡ (b |-> P)

然而,LRM并没有真正指出实际差异是什么。我假设他们在错误的前因(成功与空洞的成功)的情况下评价不同,但我找不到任何这种假设的来源或证据。此外,我知道implies运算符与OneSpin等形式验证工具相结合非常常见。

有人可以帮帮我吗?

P.S。:在下面的书中似乎找到了这个问题的答案: SystemVerilog Assertions Handbook,3rd Edition 。但是对于我来说,仅仅为了得到这个问题的答案,155美元就有点太多了:)

2 个答案:

答案 0 :(得分:4)

我认为甚至有更显着的差异。假设我们有以下示例:

property p1;
  @ (posedge clk) 
  a ##1 b |-> c;
endproperty

property p2;
  @ (posedge clk) 
  a ##1 b implies c;
endproperty

assert property (p1);
assert property (p2);

两个蕴涵算子都有不同的证明行为。属性p1将通过a ##1 b的匹配触发,并在与c相同的时钟周期内查找匹配的b。但是,属性p2a ##1 b触发,并会在c的时钟周期内检查a的匹配项。这意味着属性将通过以下方案:

属性p1通过,p2失败: Property p1 passes and p2 fails 属性p2通过,p1失败: Property p2 passes and p1 fails

可以在SystemVerilog LRM中找到此行为的提示。定义的替换是:

(if(b) P) = (b |-> P)
p1 implies p2 = (not p1 or p2)

总而言之,如果使用implies运算符,则定义多周期运算变得更容易,因为前因和后果具有相同的评估起点。

答案 1 :(得分:1)

我试了一下,显然|->不允许属性(仅用于序列和布尔表达式)。这是我试过的:

  property a_and_b;
    @(posedge clk)
    a && b;
  endproperty

  property a_and_c;
    @(posedge clk)
    a && c;
  endproperty

使用|->的第一个表单无法编译:

// this doesn't compile
assert property(a_and_b |-> a_and_c);

使用implies的第二个表格确实编译:

// this does compile
assert property(a_and_b implies a_and_c);

语义方面,它与|->运算符一样。当a_and_b失败时,断言空洞地通过。如果a_and_b成功但b_and_c没有成功,则会发出失败。