1、在verilog中有時會用signed修飾符來修飾定義的數(shù)據(jù),運算的時候也會用$signed()任務(wù)來強制轉(zhuǎn)換數(shù)據(jù),那么signed的修飾是為什么呢,是為了區(qū)分有符號數(shù)和無符號數(shù)的加法和乘法嗎?其實不是的,因為有符號數(shù)和無符號數(shù)據(jù)的加法強結(jié)果和乘法器結(jié)構(gòu)是一樣的,signed的真正作用是決定如何對操作數(shù)擴位的問題。
2、verilog中的加法和乘法操作前,會先對操作數(shù)據(jù)擴位成結(jié)果相同的位寬,然后進行加法或者乘法處理。比如a/b都為4位數(shù)據(jù),c為5位數(shù)據(jù),c = a + b,這個運算的時候會先把a和b擴位成5位,然后按照無符號加法進行相加。a/b沒有被signed修飾的時候會按照無符號數(shù)的擴位方式進行擴位,即高位補0,加法的結(jié)果當(dāng)然也是a、b為無符號數(shù)相加的結(jié)果。
3、如果想把a、b作為有符號數(shù)來相加,那么就得在a/b數(shù)據(jù)定義的時候用signed修改,或者在計算的時候用$signed()來修飾,這樣在c = a + b,這個運算開始的擴位就會按照有符號數(shù)的方式進行擴位,在高位補符號位,加法得出的結(jié)果就是a、b視為有符號數(shù)的結(jié)果。當(dāng)然c要視為有符號數(shù)據(jù)。
$signed()函數(shù)
返回有符號的值,值得注意的是verilog中的負(fù)數(shù)其實是{1’b1,pos_num},而并非高級語言中的補碼。使用中最好通過增加$signed{1’b符號,正數(shù)}來實現(xiàn)轉(zhuǎn)換以避免錯誤。
此外在對signed wire 或signed reg 賦值時,右側(cè)的所有變量最好全部加上$signed函數(shù)轉(zhuǎn)換,以防止遺漏,造成數(shù)據(jù)錯誤
signed變量移位操作時最好使用<<<和>>>,防止對符號位進行操作,導(dǎo)致數(shù)據(jù)出錯
-
Verilog
+關(guān)注
關(guān)注
28文章
1364瀏覽量
111461
原文標(biāo)題:Verilog 中signed和$signed()的用法
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
ADS7883的GND不連接能讀出數(shù)據(jù),連接后讀取的數(shù)據(jù)全為0,為什么?
Verilog 電路仿真常見問題 Verilog 在芯片設(shè)計中的應(yīng)用
Verilog 與 ASIC 設(shè)計的關(guān)系 Verilog 代碼優(yōu)化技巧
Verilog 測試平臺設(shè)計方法 Verilog FPGA開發(fā)指南
Verilog與VHDL的比較 Verilog HDL編程技巧
Verilog硬件描述語言參考手冊
Linux lsof命令的基本用法

如何利用Verilog-A開發(fā)器件模型

Efinity編譯生成文件使用指導(dǎo)

評論