簡體   English   中英

SystemVerilog:暗示運算符與| - >

[英]SystemVerilog: implies operator vs. |->

最近出現的問題是通常的蘊涵算子( |-> )和SystemVerilog中的implies運算符之間的區別。 不幸的是我還沒找到一個明確的答案。 但是,我收集了以下信息:

SystemVerilog LRM 1800-2012

  • §16.12.7 隱含和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等形式驗證工具相結合非常常見。

任何人都可以幫我嗎?

PS:在下面的書中似乎有這個問題的答案: SystemVerilog Assertions Handbook,3rd Edition 但是155美元對我來說有點太多了,只是為了得到這個問題的答案:)

我認為甚至有更顯着的差異。 假設我們有以下示例:

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的匹配觸發,並將在與b相同的時鍾周期內查找匹配的c 然而,屬性p2通過觸發a ##1 b ,將檢查匹配的c的時鍾周期期間a 這意味着屬性將通過以下方案:

屬性p1通過,p2失敗: 屬性p1通過,p2失敗 屬性p2通過,p1失敗: 屬性p2通過,p1失敗

可以在SystemVerilog LRM中找到有關此行為的提示。 定義的替換是:

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

總而言之,如果使用含義運算符,則定義多周期運算變得更容易,因為先行和后果具有相同的評估起點。

我試了一下,顯然不允許|->屬性(僅用於序列和布爾表達式)。 這是我試過的:

  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通過。 如果a_and_b成功但b_and_c沒有,則發出失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM