[英]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失敗: 屬性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.