首先,考虑x和z在verilog条件语句中的使用情况,然后我们再考虑在verilog中用x和z给其他reg/wire赋值的情况。
(一)首先,考虑x和z在verilog条件语句中的使用情况。
Verilogcase语句中,2'b1x和2’b0x造成的仿真器、综合器的mismatch,
举个例子:
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
官方说明:我们可以得到两点信息:
第一点:
Asimulatorevaluatesanunknown(x)orhighimpedance(z)asadistinctvaluedifferentfrom0or1;however,anxorzvaluebecomesa0or1duringsynthesis.
第二点:
DC工具会直接将verilog比较判断语句中的xorz直接理解为false。所以禁止在verilog比较判断语句中使用xorz。
参见如下代码,DC工具会理解if(A==1'bx)为false,因此DC会直接assigns1toregB并且报ELAB-310warning.
moduletest( inputA, outputregB ); always@(*)begin if(A==1'bx) B=0; else B=1; end endmodule
实际综合如下,果不其然,有意思哇!后面几个稍微复杂点的代码更有趣!
再补充z的使用:
结论:仿真工具可以理解x、z、0、1状态,但是综合工具遇到带x、z的比较判断条件时,直接理解该条件为false。
(二)然后我们再考虑在verilog中用x和z给其他reg/wire赋值的情况。
案例1:z赋值是没问题的,会综合出来三态门,参见如下代码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赋值是没问题的,会综合出来三态门,参见如下代码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综合工具实测如下代码综合效果:
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工具省略,也没有latch出现。
案例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工具省略,也没有latch出现。
案例3:注释掉default,非full_case,必然出现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工具省略,也没有latch出现,但是仍然建议不要使用x赋值,除非full_case情况下,不会执行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
审核编辑:汤梓红
-
仿真器
+关注
关注
14文章
1018浏览量
83739 -
Verilog
+关注
关注
28文章
1351浏览量
110091 -
HDL
+关注
关注
8文章
327浏览量
47382 -
代码
+关注
关注
30文章
4787浏览量
68591 -
综合器
+关注
关注
0文章
10浏览量
6454
原文标题:Verilog中,2'b1x和2’b0x造成的仿真器、综合器的mismatch!
文章出处:【微信号:全栈芯片工程师,微信公众号:全栈芯片工程师】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论