Verilog中不同位寬的無符號數和有符號之間賦值的截斷和擴展問題
可以直接看結論。。。
長位寬賦值給短位寬的截斷問題
unsigned=unsigned
代碼如下
二進制結果如下:
按照無符號數解釋出來的十進制結果如下:
unsigned=signed
代碼如下:
二進制結果如下:
按照無符號數解釋出來的十進制結果如下:
signed=unsigned
代碼如下:
二進制結果如下:
按照有符號數2的補碼解釋出來的結果如下:
signed=signed
代碼如下:
二進制結果如下:
按照有符號數2的補碼解釋出來的結果如下:
結論
對於長位寬賦值給短位寬的情況,無論左操作數、右操作數是有符號數還是無符號數,都是直接截斷高位,而左操作數二進制所表示的實際十進制數據要看左操作數是無符號數還是有符號數,如果左操作數是無符號數,直接轉換成十進制即可,如果是有符號數,則看成2的補碼解釋成十進制數,這也是實際計算機系統中有符號數的表示方法。
短位寬賦值給長位寬的擴展問題
unsigned=unsigned
代碼如下:
二進制結果如下:
按照無符號數解釋出來的結果如下:
unsigned=signed
代碼如下:
二進制結果如下:
按照無符號數解釋出來的結果如下:
signed=unsigned
代碼如下:
二進制結果如下:
按照有符號數2的補碼解釋出來的結果如下:
signed=signed
代碼如下:
二進制結果如下:
按照有符號數2的補碼解釋出來的結果如下:
結論
對於短位寬賦值給長位寬的情況,需要對高位進行位擴展,具體是擴展1還是擴展0,記住:完全依據右操作數!,具體如下:
1)右操作數是無符號數,則無論左操作數是什麼類型,高位都擴展成0;
2)右操作數是有符號數,則要看右操作數的符號位,按照右操作數的符號位擴展,符號位是1就擴展1,是0就擴展0;
3)位擴展後的左操作按照是無符號數還是有符號數解釋成對應的十進制數值,如果是無符號數,則直接轉換成十進制數值,如果是有符號數,則看成2的補碼解釋成十進制數;
4)從上面4種情況看出,有符號數賦值成無符號數會出現數據錯誤的情況,因此要避免這種賦值,而其他情況都是可以保證數據正確的。
關於無符號和有符號運算的補充
運算和賦值是分開進行的,所以這兩個過程可以分開對待,關於賦值的方式上面已經說過,
而運算只要記住一條:
只有RHS中含有無符號數,就按照無符號數的方式運算!