不知道有沒有人像我一樣,長久以來將verilog中的有符號數(shù)視為不敢觸碰的禁區(qū)。不過俗話說啊解決恐懼的最好辦法就是直面恐懼,又有俗話說要想工其事必先利其器,還有俗話說磨刀不誤砍柴工,也有俗話說The only thing we have to fear is fear itself,所以今天咱們就嘗試對verilog中數(shù)據(jù)的符號屬性(有符號數(shù)和無符號數(shù))探究根源。
本文的驗證環(huán)境基于VCS通過auto_testbench生成,相關(guān)的vcs命令行細(xì)節(jié)請在auto_testbench工程目錄下查詢。
先說明一個大前提,有符號數(shù)即補碼表示,無符號數(shù)即原碼表示或者說必然是整數(shù)的補碼表示,因此有符號數(shù)和無符號數(shù)均可以認(rèn)為是數(shù)值的補碼。
為了省流,還是先甩結(jié)論。有符號數(shù)和無符號數(shù)的最本質(zhì)區(qū)別就是:符號位的識別和高位拓展。除此之外,另一個區(qū)別就是從人的角度如何如何讀這個數(shù),或者說$display(%d)打印時打印的值是什么(而從機器的角度它壓根就不區(qū)分signed和unsigned)。也就是說,如果不涉及到位寬拓展的事,有符號數(shù)和無符號數(shù)在verilog運算中可以說毫無差別。
所以先給出兩個結(jié)論,verilog中數(shù)據(jù)的符號屬性會影響兩件事:
1.符號位的識別和位寬拓展,有符號數(shù)最高位被識別為符號位,高位拓展時拓展符號位,無符號數(shù)高位拓展0;
2.數(shù)據(jù)的實際值(人的角度如何如何讀這個數(shù));
顯然,這個這個結(jié)論和固有的認(rèn)知出入有點大,不急咱們先看一個實驗。下面的代碼是一段不涉及到位寬拓展的運算,t0_va0為有符號數(shù)-1,也就是16'hffff:
仿真的結(jié)果如下:
可以看到所有的結(jié)果都是一致的。而如果將va0信號改成無符號數(shù):
其仿真結(jié)果也是一致的:
而一旦涉及到運算結(jié)果位寬拓展結(jié)果就有所差別了,比如將結(jié)果的位寬都改成18bit:
看到的波形就是這樣:
這個事就有些神奇了,所以后面就是說明下這里面的區(qū)別,或者說在完成運算后工具是如何識別這個數(shù)的符號性以決定位寬拓展的結(jié)果的。在開始之前必須明確下一個有符號數(shù)(補碼),'h1fffe和'hfffe對于機器是沒有區(qū)別的,都是-2。
仿真工具在對一個運算結(jié)果進行位寬拓展時,會先識別這個數(shù)的符號屬性,那么具體是怎么識別的呢?
1.有符號數(shù)和有符號數(shù)運算,結(jié)果為有符號數(shù);
2.有符號數(shù)和無符號數(shù)運算,結(jié)果為無符號數(shù);
3.無符號數(shù)和無符號數(shù)運算,結(jié)果為無符號數(shù);
4.運算結(jié)果外又通過$signed和$unsigned定向指定時,最終的符號屬性遵照指定結(jié)果;
5.等號左側(cè)信號聲明中的signed/unsigned不影響右側(cè)運算結(jié)果的符號數(shù)屬性;
好,咱們一個一個看。
有符號數(shù)和有符號數(shù)運算,結(jié)果為有符號數(shù)。
很顯然,兩個有符號數(shù)進行操作結(jié)果是有符號數(shù),位寬拓展時拓展符號位。同時這個波形還說明了等號左側(cè)信號聲明中的signed/unsigned不影響右側(cè)運算結(jié)果的符號數(shù)屬性。
有符號數(shù)和無符號數(shù)運算,結(jié)果為無符號數(shù)。

無符號數(shù)和無符號數(shù)運算,結(jié)果為無符號數(shù)。這個不說了,顯而易見的事情。
運算結(jié)果外又通過$signed和$unsigned定向指定時,最終的符號屬性遵照指定結(jié)果。

好了現(xiàn)在我們再把前文的結(jié)論翻出來,verilog中的符號屬性會影響兩件事情:
1.符號位的識別和位寬拓展,有符號數(shù)最高位被識別為符號位,高位拓展時拓展符號位,無符號數(shù)高位拓展0;
2.數(shù)據(jù)的實際值(人的角度如何如何讀這個數(shù));
再看這個測試就很好解釋了:
再來補充一個,大家看看結(jié)果應(yīng)該是啥:
顯然結(jié)果應(yīng)該是18'h3fffe,因為左側(cè)的運算結(jié)果是有符號數(shù)的16'hfffe,拓展成18bit時拓展符號位1:
仿真的結(jié)果為:
-
Verilog
+關(guān)注
關(guān)注
29文章
1366瀏覽量
112139 -
運算
+關(guān)注
關(guān)注
0文章
132瀏覽量
26180 -
符號
+關(guān)注
關(guān)注
0文章
55瀏覽量
4558
原文標(biāo)題:【芯片設(shè)計】verilog中有符號數(shù)和無符號數(shù)的本質(zhì)探究
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
關(guān)于verilog中的無符號數(shù)和有符號數(shù)
請問AFE5801 AD轉(zhuǎn)換后數(shù)字信號是用有符號數(shù)還是無符號數(shù)表示的?
采集的數(shù)據(jù)轉(zhuǎn)換成有符號數(shù)的問題
有符號數(shù),無符號數(shù),浮點數(shù)探討
關(guān)于無符號數(shù)和有符號數(shù)的困惑
請問AFE5801 AD轉(zhuǎn)換后數(shù)字信號是用有符號數(shù)還是無符號數(shù)表示?
雙狀態(tài)無符號/有符號數(shù)據(jù)類型
FPGA有符號數(shù)乘法操作指南

詳細(xì)分析Verilog編寫程序測試無符號數(shù)和有符號數(shù)的乘法

C語言中無符號數(shù)和有符號數(shù)的左移和右移

FPGA中的有符號數(shù)乘法說明

評論