加班猫

人于人区别,就是远见不一样。szfpga.com

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

0
阅读(11812)

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

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

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

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

   如果default的语句中的,if a<b 这种b是动态寄存器更是出问题。case语句综合的时候,记住在任何逗号,或者default,即使使用if语句,必须保证是个常数值,系统综合才能更好的优化。

   

    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 <b)

        a <= a +1;

endcase


第二个段

  always @(*)

  begin

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

      e <= 10;

     else if( d>10)

     e <= e + 1'd1;

   end