Verilog中的if-else和case有两个重大缺点
- 不能传播不定态
- 会产生优先级的选择电路而非并行选择电路,从而不利于时序和面积
问题一:
Verilog的if-else和case不能传播不定态,以如下代码片段为例。
if(a)
out =in1;
else
out =in2;
假设a为X不定态,按照Verilog语法,将等效于a=0,从而输出值等于in2,而没有将不定态X传输出去,这种情况在仿真阶段会掩盖某些致命的bug
然而使用assign,如果a的值等于x,则out的值也会等于x,可以在仿真阶段暴露出bug。
assign out =a ? in1:in2;
问题二:
Verilog的if-else语句和case语句存在会被综合为优先级选择的电路。
if(sel1)
out = in1[3:0];
else if(sel2)
out = in2[3:0];
else if(sel3)
out = in3[3:0]
else
out =4;b0;
如果确实想生成一个有优先级选择的电路可以推荐使用assign语法等效编写成如下形式,以运行不定态x的传播
assign out = sel1 ? in1[3:0] :
sel2 ? in2[3:0] :
sel3 ? in3[3:0] :
4'b0;
如果想要生成并行选择的逻辑,推荐使用与 或逻辑实现
assign out =({4{sel1}} & in1[3:0]) | ({4{sel2}} & in2[3:0]) |({4{sel3}} & in3[3:0]) ;