沒(méi)想到啊沒(méi)想到啊,有一天會(huì)被濃眉大眼的assign背刺!想當(dāng)年在always消失術(shù)里,在X態(tài)分析里,在xprop平替策略里,把a(bǔ)ssign捧的這么高,優(yōu)點(diǎn)說(shuō)了800多項(xiàng),然后今天一仿真出bug了?!
還有有符號(hào)數(shù)和無(wú)符號(hào)數(shù),我都吹出去了已經(jīng)大成大成了,這還能出錯(cuò)?!
萬(wàn)事皆有可能,于是就出現(xiàn)了這個(gè)事。
事情的根源簡(jiǎn)化完就是下面這個(gè)語(yǔ)法,當(dāng)sel為0時(shí)輸出i_a高位補(bǔ)零的右移結(jié)果(相當(dāng)于視i_a為無(wú)符號(hào)數(shù)),sel為1時(shí)輸出i_a高位補(bǔ)符號(hào)位的輸出結(jié)果相當(dāng)于視i_a為有符號(hào)數(shù)):
//test
wire [31:0]i_a = 32'hff00_0000;
wire sel = 1'b1;
wire [31:0]en0 = (sel == 1'b0) ? i_a > >> 8 :
$signed(i_a) > >> 8;
wire [31:0]en1_mid = $signed(i_a) > >> 8;
wire [31:0]en1 = (sel == 1'b0) ? i_a > >> 8 : en1_mid;
好,大家先看著這en0和en1的值。
en0和en1的值分別是啥呢?
en0 = 32'h00ff_0000;
en1 = 32'hffff_0000;
問(wèn)題出在哪呢?前面咱們總結(jié)過(guò):有符號(hào)數(shù)和無(wú)符號(hào)數(shù)運(yùn)算,結(jié)果為無(wú)符號(hào)數(shù)。這句話不太嚴(yán)謹(jǐn),應(yīng)該完善為:有符號(hào)數(shù)和無(wú)符號(hào)數(shù)運(yùn)算,所有的運(yùn)算數(shù)會(huì)被視為無(wú)符號(hào)數(shù),結(jié)果為無(wú)符號(hào)數(shù)。
因?yàn)閑n0運(yùn)算公式中,有符號(hào)數(shù)和無(wú)符號(hào)數(shù)混合運(yùn)算了,有符號(hào)數(shù)和無(wú)符號(hào)數(shù)混合時(shí)會(huì)自動(dòng)將所有的變量視為無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算,而這個(gè)混合運(yùn)算很難發(fā)現(xiàn):
wire [31:0]en0 = (sel == 1'b0) ? i_a > >> 8 : $signed(i_a) > >> 8;
對(duì),i_a >>> 8是個(gè)無(wú)符號(hào)數(shù)的運(yùn)算!/(ㄒoㄒ)/~~所以帶著signed(i_a) >>> 8也變成了無(wú)符號(hào)數(shù)的運(yùn)算。所以說(shuō)如果把signed(i_a) >>> 8單提出來(lái)先算好,再參與選擇邏輯就是預(yù)期的結(jié)果了。
那么最后一個(gè)小問(wèn)題,選擇邏輯參與不參與這個(gè)有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的爭(zhēng)端呢?不參與,比如代碼改成這樣:
wire [31:0]en0 = (sel == 1'b0) ? $signed(i_a > >> 8) : $signed(i_a) > >> 8;
我把前面的運(yùn)算結(jié)果通過(guò)$signed擴(kuò)了一下,然后再仿真:
這說(shuō)明了兩個(gè)問(wèn)題:
1.選擇邏輯沒(méi)有參與到有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的判定中;
2.判定時(shí)signed(i_a) >>> 8,看的是同一級(jí)別的其他運(yùn)算項(xiàng)的符號(hào)屬性,比如此時(shí)他看的是signed(...);
再改一下就又回去了:
wire [31:0]en0 = (sel == 1'b0) ? $signed(i_a > >> 8) + 1'b1 : $signed(i_a) > >> 8;
-
仿真器
+關(guān)注
關(guān)注
14文章
1037瀏覽量
85394
發(fā)布評(píng)論請(qǐng)先 登錄
ALLEGRO畫(huà)銅皮時(shí)可否自動(dòng)ASSIGN NET
wire 和 assign的 區(qū)別 ---求助
資料下載:HDL中的unsigned與signed
HDL語(yǔ)言中的unsigned與signed的主要區(qū)別是什么
什么是DLP背投?和液晶背投有何區(qū)別?
背投電視,背投電視工作原理是什么?
舌診圖像點(diǎn)刺和瘀點(diǎn)的識(shí)別與提取

背投電視歷史_背投電視的應(yīng)用領(lǐng)域
“背刺專業(yè)游戲手機(jī)”iQOO Neo5開(kāi)始首次發(fā)售
miniLED芯片刺晶工藝對(duì)錫膏需要什么條件?

assign語(yǔ)句和always語(yǔ)句的用法
Verilog中signed和$signed()的用法

評(píng)論