數字硬件建模SystemVerilog-邏輯運算符
經過幾周的更新,SV核心部分用戶自定義類型和包內容已更新完畢,接下來就是RTL表達式和運算符。
邏輯運算符
邏輯運算符對其操作數求值,并返回一個值,該值指示求值結果是真還是假(true or false)。例如,運算a && b測試a和b是否都為真,如果兩個操作數都為真,則運算符返回真。否則,運算符返回false。
邏輯運算符返回值。SystemVerilog沒有內置的true或false布爾值。相反,邏輯運算符的返回使用邏輯值1’b1(一個一位寬的邏輯l)表示真,1’b0表示假。邏輯運算符還可以返回1’bx,指示仿真無法確定實際邏輯門的評估結果是否為真或假的模糊條件。
判斷一個表達式是真是假。要確定操作數是真是假,SystemVerilog使用以下規則:
- 如果所有位均為0,則操作數為假
- 如果所有位均為1,則操作數為真
- 如果所有位均為X或Z,且沒有位為1,則操作數未知X
表5-1列出了RTL綜合編譯器普遍支持的邏輯運算符。
表5-11:RTL建模的邏輯運算符
邏輯求反運算符通常被稱為“not運算符”,它是“not true”的縮寫。
邏輯運算符通過對每個操作數進行歸約OR來執行其運算,從而產生一個1位結果。然后對該結果進行求值,以確定其為真還是假。對于not運算符,1位的結果首先被反轉,然后求值為真或假。
表5-12和5-13顯示了這些邏輯運算符對幾個示例值的結果。
表5-12:邏輯AND and OR運算的示例結果
表5-13:邏輯求反運算的示例結果
邏輯求反運算符(!)和按位反轉運算符(~)之間的區別
練習題目《HDLBits: 在線學習 SystemVerilog(一)-Problem 2-6》Problem 4
應注意不要混淆邏輯求反運算符(!)以及按位反轉運算符(~)。求反運算符對其操作數執行真/假求值,并返回表示真、假或未知結果的1位值。按位反轉運算符對操作數的每一位(補碼)執行邏輯反轉,并返回與操作數相同位寬的值。
在某些操作中,這些操作的結果恰好相同,但在其他操作中,它們返回的值非常不同。當運算符與決策語句一起被錯誤使用時,這種差異可能導致錯誤代碼。考慮下面的例子:
前面代碼片段的最后兩行之所以不同,是因為這兩個運算符的工作方式不同——邏輯求反運算符(!)通過將兩位相加或相減,對2位選擇執行真/假計算,然后反轉1位結果,按位反轉運算符(~)只反轉2位選擇向量的每一位的值,并返回2位結果。if語句然后對2位向量進行真/假測試,該向量的計算結果為真,因為反轉后的值仍有一位設置為1。
最佳實踐指南5-1 |
---|
使用按位反轉運算符反轉值的位,不要使用按位反轉運算符對邏輯求反運算符求反。相反,使用邏輯求反運算符來否定真/假測試的結果。不要使用邏輯求反運算符反轉值。 |
最佳實踐指南5-2 |
---|
僅使用邏輯求反運算符求反來測試標量(1位)值,而不是 對向量執行真/假測試。 |
如果向量的任何位為1,邏輯運算將返回true,這可能會導致在測試特定位時出現設計錯誤。計算向量值時,使用等式或關系運算符測試可接受的值。
示例5-7說明了一個小型RTL模型,該模型使用邏輯NOT、邏輯AND和邏輯OR運算符。該設計是一個邏輯比較器,如果兩個數據值中的任何一個在可配置的值范圍內,則設置一個flag。
示例5-7:使用邏輯運算符:當值在某個范圍內時設置flag
圖5-7顯示了示例5-7中的RTL模型綜合結果
圖5-7:示例5-7的綜合結果:邏輯運算符(范圍內比較)
不可綜合的邏輯運算符
SV-2009增加了兩個額外的邏輯運算符,它們是蘊涵和等價運算符,在本文編寫時RTL綜合編譯器通常不支持這些運算符。表5-14列出了這兩個運算符的標記和描述。
表5-14:不可綜合邏輯運算符
-
操作
+關注
關注
0文章
43瀏覽量
18852 -
邏輯
+關注
關注
2文章
832瀏覽量
29446 -
運算符
+關注
關注
0文章
172瀏覽量
11062
發布評論請先 登錄
相關推薦
評論