1、在verilog中有時會用signed修飾符來修飾定義的數據,運算的時候也會用$signed()任務來強制轉換數據,那么signed的修飾是為什么呢,是為了區分有符號數和無符號數的加法和乘法嗎?其實不是的,因為有符號數和無符號數據的加法強結果和乘法器結構是一樣的,signed的真正作用是決定如何對操作數擴位的問題。
2、verilog中的加法和乘法操作前,會先對操作數據擴位成結果相同的位寬,然后進行加法或者乘法處理。比如a/b都為4位數據,c為5位數據,c = a + b,這個運算的時候會先把a和b擴位成5位,然后按照無符號加法進行相加。a/b沒有被signed修飾的時候會按照無符號數的擴位方式進行擴位,即高位補0,加法的結果當然也是a、b為無符號數相加的結果。
3、如果想把a、b作為有符號數來相加,那么就得在a/b數據定義的時候用signed修改,或者在計算的時候用$signed()來修飾,這樣在c = a + b,這個運算開始的擴位就會按照有符號數的方式進行擴位,在高位補符號位,加法得出的結果就是a、b視為有符號數的結果。當然c要視為有符號數據。



$signed()函數
返回有符號的值,值得注意的是verilog中的負數其實是{1’b1,pos_num},而并非高級語言中的補碼。使用中最好通過增加$signed{1’b符號,正數}來實現轉換以避免錯誤。
此外在對signed wire 或signed reg 賦值時,右側的所有變量最好全部加上$signed函數轉換,以防止遺漏,造成數據錯誤
signed變量移位操作時最好使用<<<和>>>,防止對符號位進行操作,導致數據出錯
-
Verilog
+關注
關注
30文章
1371瀏覽量
114218
原文標題:Verilog 中signed和$signed()的用法
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
通過2的冪次進行除法和取余數快捷方法優化
在verilog testbench中運行測試用例時,運行到make run_test出錯怎么解決?
定點數表示實數的方法以及定點數在硬件上的運算驗證
rt-thread studio怎么設置才能讓char變量是真正的有符號類型?
用TXT編輯器打開十六進制文件,如何知道校驗和值?
UIAbility組件基本用法說明
verilog模塊的調用、任務和函數
使用RT1060的mcuboot開源sdk示例擦除主插槽中的錯誤鏡像怎么解決?
FPGA Verilog HDL語法之編譯預處理
一文詳解Verilog HDL
淺談Verilog和VHDL的區別

Verilog中signed和$signed()的用法
評論