不知道有沒(méi)有人像我一樣,長(zhǎng)久以來(lái)將verilog中的有符號(hào)數(shù)視為不敢觸碰的禁區(qū)。不過(guò)俗話說(shuō)啊解決恐懼的最好辦法就是直面恐懼,又有俗話說(shuō)要想工其事必先利其器,還有俗話說(shuō)磨刀不誤砍柴工,也有俗話說(shuō)The only thing we have to fear is fear itself,所以今天咱們就嘗試對(duì)verilog中數(shù)據(jù)的符號(hào)屬性(有符號(hào)數(shù)和無(wú)符號(hào)數(shù))探究根源。
本文的驗(yàn)證環(huán)境基于VCS通過(guò)auto_testbench生成,相關(guān)的vcs命令行細(xì)節(jié)請(qǐng)?jiān)赼uto_testbench工程目錄下查詢。
先說(shuō)明一個(gè)大前提,有符號(hào)數(shù)即補(bǔ)碼表示,無(wú)符號(hào)數(shù)即原碼表示或者說(shuō)必然是整數(shù)的補(bǔ)碼表示,因此有符號(hào)數(shù)和無(wú)符號(hào)數(shù)均可以認(rèn)為是數(shù)值的補(bǔ)碼。
為了省流,還是先甩結(jié)論。有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的最本質(zhì)區(qū)別就是:符號(hào)位的識(shí)別和高位拓展。除此之外,另一個(gè)區(qū)別就是從人的角度如何如何讀這個(gè)數(shù),或者說(shuō)$display(%d)打印時(shí)打印的值是什么(而從機(jī)器的角度它壓根就不區(qū)分signed和unsigned)。也就是說(shuō),如果不涉及到位寬拓展的事,有符號(hào)數(shù)和無(wú)符號(hào)數(shù)在verilog運(yùn)算中可以說(shuō)毫無(wú)差別。
所以先給出兩個(gè)結(jié)論,verilog中數(shù)據(jù)的符號(hào)屬性會(huì)影響兩件事:
1.符號(hào)位的識(shí)別和位寬拓展,有符號(hào)數(shù)最高位被識(shí)別為符號(hào)位,高位拓展時(shí)拓展符號(hào)位,無(wú)符號(hào)數(shù)高位拓展0;
2.數(shù)據(jù)的實(shí)際值(人的角度如何如何讀這個(gè)數(shù));
顯然,這個(gè)這個(gè)結(jié)論和固有的認(rèn)知出入有點(diǎn)大,不急咱們先看一個(gè)實(shí)驗(yàn)。下面的代碼是一段不涉及到位寬拓展的運(yùn)算,t0_va0為有符號(hào)數(shù)-1,也就是16'hffff:
仿真的結(jié)果如下:
可以看到所有的結(jié)果都是一致的。而如果將va0信號(hào)改成無(wú)符號(hào)數(shù):
其仿真結(jié)果也是一致的:
而一旦涉及到運(yùn)算結(jié)果位寬拓展結(jié)果就有所差別了,比如將結(jié)果的位寬都改成18bit:
看到的波形就是這樣:
這個(gè)事就有些神奇了,所以后面就是說(shuō)明下這里面的區(qū)別,或者說(shuō)在完成運(yùn)算后工具是如何識(shí)別這個(gè)數(shù)的符號(hào)性以決定位寬拓展的結(jié)果的。在開(kāi)始之前必須明確下一個(gè)有符號(hào)數(shù)(補(bǔ)碼),'h1fffe和'hfffe對(duì)于機(jī)器是沒(méi)有區(qū)別的,都是-2。
仿真工具在對(duì)一個(gè)運(yùn)算結(jié)果進(jìn)行位寬拓展時(shí),會(huì)先識(shí)別這個(gè)數(shù)的符號(hào)屬性,那么具體是怎么識(shí)別的呢?
1.有符號(hào)數(shù)和有符號(hào)數(shù)運(yùn)算,結(jié)果為有符號(hào)數(shù);
2.有符號(hào)數(shù)和無(wú)符號(hào)數(shù)運(yùn)算,結(jié)果為無(wú)符號(hào)數(shù);
3.無(wú)符號(hào)數(shù)和無(wú)符號(hào)數(shù)運(yùn)算,結(jié)果為無(wú)符號(hào)數(shù);
4.運(yùn)算結(jié)果外又通過(guò)$signed和$unsigned定向指定時(shí),最終的符號(hào)屬性遵照指定結(jié)果;
5.等號(hào)左側(cè)信號(hào)聲明中的signed/unsigned不影響右側(cè)運(yùn)算結(jié)果的符號(hào)數(shù)屬性;
好,咱們一個(gè)一個(gè)看。
有符號(hào)數(shù)和有符號(hào)數(shù)運(yùn)算,結(jié)果為有符號(hào)數(shù)。
很顯然,兩個(gè)有符號(hào)數(shù)進(jìn)行操作結(jié)果是有符號(hào)數(shù),位寬拓展時(shí)拓展符號(hào)位。同時(shí)這個(gè)波形還說(shuō)明了等號(hào)左側(cè)信號(hào)聲明中的signed/unsigned不影響右側(cè)運(yùn)算結(jié)果的符號(hào)數(shù)屬性。
有符號(hào)數(shù)和無(wú)符號(hào)數(shù)運(yùn)算,結(jié)果為無(wú)符號(hào)數(shù)。
無(wú)符號(hào)數(shù)和無(wú)符號(hào)數(shù)運(yùn)算,結(jié)果為無(wú)符號(hào)數(shù)。這個(gè)不說(shuō)了,顯而易見(jiàn)的事情。
運(yùn)算結(jié)果外又通過(guò)$signed和$unsigned定向指定時(shí),最終的符號(hào)屬性遵照指定結(jié)果。
好了現(xiàn)在我們?cè)侔亚拔牡慕Y(jié)論翻出來(lái),verilog中的符號(hào)屬性會(huì)影響兩件事情:
1.符號(hào)位的識(shí)別和位寬拓展,有符號(hào)數(shù)最高位被識(shí)別為符號(hào)位,高位拓展時(shí)拓展符號(hào)位,無(wú)符號(hào)數(shù)高位拓展0;
2.數(shù)據(jù)的實(shí)際值(人的角度如何如何讀這個(gè)數(shù));
再看這個(gè)測(cè)試就很好解釋了:
再來(lái)補(bǔ)充一個(gè),大家看看結(jié)果應(yīng)該是啥:
顯然結(jié)果應(yīng)該是18'h3fffe,因?yàn)樽髠?cè)的運(yùn)算結(jié)果是有符號(hào)數(shù)的16'hfffe,拓展成18bit時(shí)拓展符號(hào)位1:
最后呢再看一組額外的實(shí)驗(yàn),感興趣的可以分析一下結(jié)果:
仿真的結(jié)果為:
-
Verilog
+關(guān)注
關(guān)注
28文章
1333瀏覽量
109713 -
運(yùn)算
+關(guān)注
關(guān)注
0文章
127瀏覽量
25738 -
符號(hào)
+關(guān)注
關(guān)注
0文章
55瀏覽量
4283
原文標(biāo)題:【芯片設(shè)計(jì)】verilog中有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的本質(zhì)探究
文章出處:【微信號(hào):FPGA開(kāi)源工坊,微信公眾號(hào):FPGA開(kāi)源工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論