1、在verilog中有時(shí)會(huì)用signed修飾符來修飾定義的數(shù)據(jù),運(yùn)算的時(shí)候也會(huì)用$signed()任務(wù)來強(qiáng)制轉(zhuǎn)換數(shù)據(jù),那么signed的修飾是為什么呢,是為了區(qū)分有符號(hào)數(shù)和無符號(hào)數(shù)的加法和乘法嗎?其實(shí)不是的,因?yàn)橛蟹?hào)數(shù)和無符號(hào)數(shù)據(jù)的加法強(qiáng)結(jié)果和乘法器結(jié)構(gòu)是一樣的,signed的真正作用是決定如何對(duì)操作數(shù)擴(kuò)位的問題。
2、verilog中的加法和乘法操作前,會(huì)先對(duì)操作數(shù)據(jù)擴(kuò)位成結(jié)果相同的位寬,然后進(jìn)行加法或者乘法處理。比如a/b都為4位數(shù)據(jù),c為5位數(shù)據(jù),c = a + b,這個(gè)運(yùn)算的時(shí)候會(huì)先把a(bǔ)和b擴(kuò)位成5位,然后按照無符號(hào)加法進(jìn)行相加。a/b沒有被signed修飾的時(shí)候會(huì)按照無符號(hào)數(shù)的擴(kuò)位方式進(jìn)行擴(kuò)位,即高位補(bǔ)0,加法的結(jié)果當(dāng)然也是a、b為無符號(hào)數(shù)相加的結(jié)果。
3、如果想把a(bǔ)、b作為有符號(hào)數(shù)來相加,那么就得在a/b數(shù)據(jù)定義的時(shí)候用signed修改,或者在計(jì)算的時(shí)候用$signed()來修飾,這樣在c = a + b,這個(gè)運(yùn)算開始的擴(kuò)位就會(huì)按照有符號(hào)數(shù)的方式進(jìn)行擴(kuò)位,在高位補(bǔ)符號(hào)位,加法得出的結(jié)果就是a、b視為有符號(hào)數(shù)的結(jié)果。當(dāng)然c要視為有符號(hào)數(shù)據(jù)。



$signed()函數(shù)
返回有符號(hào)的值,值得注意的是verilog中的負(fù)數(shù)其實(shí)是{1’b1,pos_num},而并非高級(jí)語言中的補(bǔ)碼。使用中最好通過增加$signed{1’b符號(hào),正數(shù)}來實(shí)現(xiàn)轉(zhuǎn)換以避免錯(cuò)誤。
此外在對(duì)signed wire 或signed reg 賦值時(shí),右側(cè)的所有變量最好全部加上$signed函數(shù)轉(zhuǎn)換,以防止遺漏,造成數(shù)據(jù)錯(cuò)誤
signed變量移位操作時(shí)最好使用<<<和>>>,防止對(duì)符號(hào)位進(jìn)行操作,導(dǎo)致數(shù)據(jù)出錯(cuò)
-
Verilog
+關(guān)注
關(guān)注
31文章
1374瀏覽量
114737
原文標(biāo)題:Verilog 中signed和$signed()的用法
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
昉·星光開發(fā)板氣壓與高度測(cè)量
使用 VisionFive 2 上的氣壓傳感器測(cè)量高度
Verilog HDL語法學(xué)習(xí)筆記
變頻器的特殊用法
AT32硬件除法器應(yīng)用指南
通過2的冪次進(jìn)行除法和取余數(shù)快捷方法優(yōu)化
C語言的printf基本用法介紹
在verilog testbench中運(yùn)行測(cè)試用例時(shí),運(yùn)行到make run_test出錯(cuò)怎么解決?
使用NucleiStudio生成tb仿真需要的.verilog文件
定點(diǎn)數(shù)表示實(shí)數(shù)的方法以及定點(diǎn)數(shù)在硬件上的運(yùn)算驗(yàn)證
rt-thread studio怎么設(shè)置才能讓char變量是真正的有符號(hào)類型?
【匯思博SEEK100開發(fā)板試用體驗(yàn)】3/第一次使用OpenHarmony
用TXT編輯器打開十六進(jìn)制文件,如何知道校驗(yàn)和值?
UIAbility組件基本用法說明
SVA斷言的用法教程
Verilog中signed和$signed()的用法
評(píng)論