首先,考慮x和z在verilog條件語句中的使用情況,然后我們?cè)倏紤]在verilog中用x和z給其他reg/wire賦值的情況。
(一)首先,考慮x和z在verilog條件語句中的使用情況。
Verilogcase語句中,2'b1x和2’b0x造成的仿真器、綜合器的mismatch,
舉個(gè)例子:
match2'b1xto11or10
match2’b0xto01or00
HDLCompilertool
both2'b1xand2’b0xareevaluatedtofalse. Becauseofthesimulationandsynthesismismatches,theHDLCompilertoolissuesanELAB-310warning.
case(A) 2'b1x:...//Youwant2'b1xtomatch11and10but //HDLCompileralwaysevaluatesthiscomparisontofalse 2'b0x:...//youwant2'b0xtomatch00and01but //HDLCompileralwaysevaluatesthiscomparisontofalse default:... endcase
官方說明:我們可以得到兩點(diǎn)信息:
第一點(diǎn):
Asimulatorevaluatesanunknown(x)orhighimpedance(z)asadistinctvaluedifferentfrom0or1;however,anxorzvaluebecomesa0or1duringsynthesis.
第二點(diǎn):
DC工具會(huì)直接將verilog比較判斷語句中的xorz直接理解為false。所以禁止在verilog比較判斷語句中使用xorz。
參見如下代碼,DC工具會(huì)理解if(A==1'bx)為false,因此DC會(huì)直接assigns1toregB并且報(bào)ELAB-310warning.
moduletest( inputA, outputregB ); always@(*)begin if(A==1'bx) B=0; else B=1; end endmodule
實(shí)際綜合如下,果不其然,有意思哇!后面幾個(gè)稍微復(fù)雜點(diǎn)的代碼更有趣!
再補(bǔ)充z的使用:
結(jié)論:仿真工具可以理解x、z、0、1狀態(tài),但是綜合工具遇到帶x、z的比較判斷條件時(shí),直接理解該條件為false。
(二)然后我們?cè)倏紤]在verilog中用x和z給其他reg/wire賦值的情況。
案例1:z賦值是沒問題的,會(huì)綜合出來三態(tài)門,參見如下代碼1:
modulethree_state(ENABLE,IN1,OUT1); inputIN1,ENABLE; outputregOUT1; always@(ENABLEorIN1)begin if(ENABLE) OUT1=IN1; else OUT1=1'bz;//assignshigh-impedancestate end endmodule
Logicalbufferofasingleinputwithanactive-highoutputenable.Theoutputis3-statedwhentheenableislow.
真值表:
案例2:z賦值是沒問題的,會(huì)綜合出來三態(tài)門,參見如下代碼2:
modulex_state(IN1,OUT1); input[1:0]IN1; outputreg[1:0]OUT1; always@(*)begin case(IN1) 2'b00:OUT1=2'b00; 2'b01:OUT1=2'b01; 2'b10:OUT1=2'b10; default:OUT1=2'bzz;//assignshigh-impedancestate endcase end endmodule
再看X賦值是什么情況。
案例1:利用DC綜合工具實(shí)測(cè)如下代碼綜合效果:
modulex_state(IN1,OUT1); input[1:0]IN1; outputreg[1:0]OUT1; always@(*)begin case(IN1) 2'b00:OUT1=2'b01; 2'b11:OUT1=2'b00; default:OUT1=2'bxx; endcase end endmodule
可見,x賦值直接被DC工具省略,也沒有l(wèi)atch出現(xiàn)。
案例2:
modulex_state(IN1,OUT1); input[1:0]IN1; outputreg[1:0]OUT1; always@(*)begin case(IN1) 2'b00:OUT1=2'b00; 2'b01:OUT1=2'b01; 2'b10:OUT1=2'b10; default:OUT1=2'bxx;//assignshigh-impedancestate endcase end endmodule
可見,x賦值直接被DC工具省略,也沒有l(wèi)atch出現(xiàn)。
案例3:注釋掉default,非full_case,必然出現(xiàn)latch!
modulex_state(IN1,OUT1); input[1:0]IN1; outputreg[1:0]OUT1; always@(*)begin case(IN1) 2'b00:OUT1=2'b00; 2'b01:OUT1=2'b01; 2'b10:OUT1=2'b10; endcase end endmodule
因此,盡管x賦值直接被DC工具省略,也沒有l(wèi)atch出現(xiàn),但是仍然建議不要使用x賦值,除非full_case情況下,不會(huì)執(zhí)行default條件下的x賦值分支,寫x賦值可以用于仿真查看波形,如下代碼所示:
always@(*)begin case(pmu_state) //Duringpowerdownsequence,shiftingpatterntoactive //ISOLATE->RETAIN->PWRDOWN //andstayunchangeduringpowereddownstate `ARM_POWERING_DOWN,`ARM_POWERED_DOWN:begin nxt_isolate_n=1'b0; nxt_retain_n=ISOLATEn; nxt_pwrdown=~RETAINn; end //Duringpowerupsequence,shiftingpatterntoactive //PWRDOWN->RETAIN->ISOLATE `ARM_POWERING_UP,`ARM_POWERED_UP:begin nxt_pwrdown=1'b0; nxt_retain_n=~PWRDOWN; nxt_isolate_n=RETAINn; end //PropagateX default:begin nxt_isolate_n=1'bX; nxt_retain_n=1'bX; nxt_pwrdown=1'bX; end endcase end
審核編輯:湯梓紅
-
仿真器
+關(guān)注
關(guān)注
14文章
1014瀏覽量
83591 -
Verilog
+關(guān)注
關(guān)注
28文章
1343瀏覽量
109925 -
HDL
+關(guān)注
關(guān)注
8文章
326瀏覽量
47307 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68234 -
綜合器
+關(guān)注
關(guān)注
0文章
9瀏覽量
6436
原文標(biāo)題:Verilog中,2'b1x和2’b0x造成的仿真器、綜合器的mismatch?!
文章出處:【微信號(hào):全棧芯片工程師,微信公眾號(hào):全棧芯片工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論