相關(guān)閱讀
Verilog基礎(chǔ)https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482
? ? ? ? 信號(hào)爆x也許是所有IC人的噩夢(mèng),滿屏的紅色波形常讓人頭疼不已,但x信號(hào)的產(chǎn)生原因卻常常只有幾種,只要遵循一定的代碼規(guī)范,就可以避免產(chǎn)生信號(hào)中出現(xiàn)x的問(wèn)題。
? ? ? ? 最常見問(wèn)題就是使用了未初始化的reg型變量,因?yàn)閞eg型變量在被創(chuàng)建后使用默認(rèn)值x。如果在初始化變量之前在其他地方提前使用了,便有可能造成x態(tài)的傳播。為了避免,可以給所有時(shí)序邏輯中用到的reg型變量賦初值(不可綜合),但更為推薦的是為所有時(shí)序邏輯中使用到的reg型變量添加復(fù)位邏輯(可綜合)并確保復(fù)位,如下所示。對(duì)于組合邏輯中使用到的reg型變量,只需要確保始終有正確的驅(qū)動(dòng)即可。
reg a = 0;
reg b;
always@(posedge clk, negedge rst_n)begin
if(rst_n)
b <= 0;
else
b <= ***;
end
? ? ? ? 連續(xù)賦值語(yǔ)句也可能會(huì)導(dǎo)致x信號(hào)的產(chǎn)生,在連續(xù)賦值語(yǔ)句對(duì)wire型線網(wǎng)賦值時(shí),如果出現(xiàn)了多個(gè)驅(qū)動(dòng)源同時(shí)驅(qū)動(dòng)為不同的值,并且強(qiáng)度一致(除z外,因?yàn)閦看做沒有驅(qū)動(dòng))時(shí),會(huì)顯示為不定態(tài),直到多個(gè)驅(qū)動(dòng)不沖突,如下所示。
//一個(gè)很幼稚的例子
assign a = 1'b0;
assign a = 1'b1; //賦值沖突,所以a的值為x
//一個(gè)依舊很幼稚的例子
initial begin
b = 1'b0;
c = 1'b1;
end
assign a = b;
assign a = c; //同樣是賦值沖突,所以a的值為x
//一個(gè)復(fù)雜一點(diǎn)的例子
wire a;
reg b, c;
initial begin
b = 1'b0;
c = 1'b0;
#5 c = 1'b1;
#5 c = 1'b0;
#5 c = 1'b1;
#5 c = 1'b0;
end
assign a = b;
assign a = c; //因?yàn)橛袝r(shí)沖突,有時(shí)不沖突,所以a的值交替為0和x,最后為0
//一個(gè)迷惑一點(diǎn)的例子
wire a;
reg b, c;
initial begin
b = 1'b0;
c = 1'b0;
#25;
#5 c = 1'b1;
#5 c = 1'b0;
#5 c = 1'b1;
#5 c = 1'b0;
end
assign a = b;
assign #20 a = c; //因?yàn)檫B續(xù)賦值有延遲,而25ns后每次c改變的脈沖都小于20ns,所以沒有進(jìn)行賦值,最后的c值為0,因此a的值一直是0
? ? ? ? 有些運(yùn)算也可能會(huì)產(chǎn)生x信號(hào),下面簡(jiǎn)單介紹,但需要注意的是,他們大多只是x信號(hào)的傳播者,而不是x信號(hào)的制造者。
算數(shù)操作符+、-、*、/、%、**
? ? ? ? 對(duì)于算術(shù)運(yùn)算符,當(dāng)操作符的操作數(shù)中出現(xiàn)了x時(shí),無(wú)論原本結(jié)果是否可能全部或部分確認(rèn),結(jié)果全為x值。
a = 3'b001;
b = 3'bx01;
$display("result is %b",a+b);//結(jié)果為xxx
a = 3'bx01;
b = 3'b000;
$display("result is %b",a*b);//結(jié)果為xxx
比較運(yùn)算符<、<=、>、>=、===、!==、==、!=
? ? ? ? 對(duì)于<、<=、>、>=、==、!=,它們的比較結(jié)果是0或1,但是如果操作數(shù)中存在x,比較結(jié)果為x。
? ? ? ? 對(duì)于===、!==,它們嚴(yán)格比較兩個(gè)操作數(shù)中的x,因此結(jié)果只能為0或1。。
b = 3'b111;
c = 3'b0x1;
$display("result is %b",b<c);//結(jié)果為x
b = 3'b0x1;
c = 3'b0x1;
$display("result is %b",b===c);//結(jié)果為1
邏輯操作符&&、||、!
? ? ? ? 邏輯運(yùn)算符的運(yùn)算結(jié)果為0或1,但是如果操作數(shù)中存在x,結(jié)果為x。
b = 3'b0x1;
c = 3'b001;
$display("result is %b",b&&c);//結(jié)果為x
c = 3'b0x1;
$display("result is %b",!c);//結(jié)果為x
位運(yùn)算操作符&、|、^、~^、~
? ? ? ? 位運(yùn)算符按位對(duì)操作數(shù)進(jìn)行操作,注意對(duì)于這些運(yùn)算符,某位的x不會(huì)影響其他非x位的結(jié)果。且x與1為x,x與0為0,x或1為1,x或0為x。對(duì)于異或、同或和取反運(yùn)算,x位的結(jié)果是x。
b = 3'b0x1;
c = 3'bx11;
$display("result is %b",b&c);//結(jié)果為0x1
b = 3'b0x1;
c = 3'bx11;
$display("result is %b",b^c);//結(jié)果為xx0
規(guī)約運(yùn)算符&、|、^、~&、~&、~^
? ? ? ? 規(guī)約運(yùn)算符的運(yùn)算結(jié)果為0或1,對(duì)于&,如果操作數(shù)中存在0,結(jié)果為0(不管是否含有x),對(duì)于|,如果操作數(shù)中存在1,結(jié)果為1(不管是否含有x)。其他情況下,如果操作數(shù)中有x,結(jié)果為x。
b = 3'bx10;
$display("result is %b",|b);//結(jié)果為1
b = 3'bx10;
$display("result is %b",&b);//結(jié)果為0
b = 3'bx10;
$display("result is %b",^b);//結(jié)果為x
移位操作符<<、>>、<<<、>>>
? ? ? ??<<、>>為邏輯移位,即補(bǔ)0移位。而<<<、>>>為算數(shù)移位,對(duì)于有符號(hào)的操作數(shù),算數(shù)右移>>>時(shí)會(huì)在左邊補(bǔ)符號(hào)位(最高位),其他情況下,算數(shù)移位和邏輯移位效果一樣。
? ? ? ? 當(dāng)移位操作符的右操作數(shù)中有x時(shí),結(jié)果為x。
b = 3'b1x1;
$display("result is %b",b>>1'bx);//結(jié)果為xxx
b = 3'b1x1;
$display("result is %b",b<<1);//結(jié)果為x10
signed reg b;
b = 3'bx01;
$display("result is %b",b>>>1);//結(jié)果為xx0
條件運(yùn)算符?:
? ? ? ? 當(dāng)條件中因?yàn)橛衳無(wú)法確定是否為0時(shí),結(jié)果會(huì)含有x,但不一定全是x。對(duì)于這一點(diǎn),感興趣的可以看往期文章,有關(guān)于表達(dá)式位寬和符號(hào)拓展的討論。
b = 3'b0x;
$display("result is %b",b?2'sb1:2'sb0);//結(jié)果為xx
b = 3'b1x;
$display("result is %b",b?1'sb1:2'sb0);//結(jié)果為11(符號(hào)拓展)
b = 3'b0x;
$display("result is %b",b?2'b1:2'b0);//結(jié)果為0x(補(bǔ)零拓展)
連接運(yùn)算符{}
? ? ? ? 對(duì)于連接運(yùn)算符,某一位的x不會(huì)影響其他位。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-753387.html
$display("result is %b",{1'bx,3'b111});//結(jié)果為x111
向量的位選、域選
? ? ? ? ?當(dāng)位選超出界限時(shí),會(huì)返回x。當(dāng)域選超出界限時(shí),超出的部分會(huì)用x填充。當(dāng)數(shù)組索引超出界限時(shí),結(jié)果全為x。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-753387.html
b = 3'b111;
$display("result is %b",b[3]);//結(jié)果為x
b = 3'b111;
$display("result is %b",b[4:2]);//結(jié)果為xx1
reg [2:0] c [1:0]
c[0] = 3'b000;
c[1] = 3'b111;
$display("result is %b",c[2]]);//結(jié)果為xxx
到了這里,關(guān)于Verilog基礎(chǔ):仿真時(shí)x信號(hào)的產(chǎn)生和x信號(hào)對(duì)于各運(yùn)算符的特性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!