Verilog很基础的case和if语句问题

这个语句说起来,估计很多人不以为然,verilog的case和if语句还有必要讲。

但是在实际工程中,经常出现case综合的结果会经常异常。

第一个问题,case的变量位数超级大,这个导致综合异常,case选择通道庞大,导致综合结果延时很大,经常出现部分变量导致延时不行。case(a[5:0]) 比case(a[7:0]),综合效果要好,特别时钟快的时候。

另外一个很多人在case语句的default,使用 if 限制语句,if(a>4),会导致出现问题,所以这个时候,往往不等于 != 比 <结果要好。

如果default的语句中的,if a

if语句问题,最多是锁存数据问题,如果使用 if a ||b ,带两个变量的结果,如果不写else语句,综合语句会不知道怎么做另外的结果。 if a||b ,res= c;else res =res。另外不要给if语句增加额外的条件判断。 需要分析所有的条件的 另外情况,不要让综合语句去猜测其他的情况。

很多人代码都会定义初始值,初始值是rst定义吗?不是的,在reg[15:0] a=15;这个声明的时候已经初始化15这个值。

verilog语法太灵活,但是必须保证,第一个case语句,任何条件都是常数值,不要给动态赋值的寄存器。if语句代码,要考虑所有条件满足和不满足的情况,代码都要写。

以上描述到这里。

分析代码会有什么问题。

第一个段

reg[7:0] a,b;

case(a)

1: a <= 2;

2: a <=3;

default:

if(a

a <= a +1;

endcase

第二个段

always @(*)

begin

if((d <10) && ( c<10))

e <= 10;

else if( d>10)

e <= e + 1'd1;

end

文章转载自:加班猫 的博客