首页 > 代码库 > 自己的verilog经验

自己的verilog经验

1.中间变量和输出变量都要用reg类型暂存一下,输出必须用reg寄存

2.对一个n‘b(n>=2)的寄存器赋值时可以直接在声明时:
 reg [n-1:0] register=0;
  在中间部分赋值时register[7:0]=0    是不对的,
  可以用   register[7:0]=8‘hff 来赋值。

3.在宏定义中的数如果在代码中用到它的运算,那么 宏定义的数值 必须是整数

4.always 的敏感信号列表中 不能有 两个 posedge
  如果有两个延触发就
 always @(posedge clk or negedge RST)
 if(!RST)
 复位
 else
 算法
5.总是忘记:时序电路用非阻塞赋值!
    assign 只能用阻塞


6.去抖
always@(posedge clk or posedgerst)
if(!rst)
  cnt<=‘b0;
else if (valid_en)
cnt <=‘b0;
else if(key_jitter)
    cnt<= cnt+1;
else cnt <= 0;

assign valid_en =cnt==n;//n的值由clk的周期决定.


7.在编写时钟树时,会用到buffer,buffer 的写法可以直接用 always@ (a)b<=a,但是若要禁止时,用1‘bz置成高阻。

8.慎用for语句!
 always @ (posedge clk) begin

      if(!rst_n) begin

             num = 0;

             end

      else begin

             for(i=0;i<13;i=i+1)begin          //用for循环进行计算

                    if(data[i]) num =num+1;end                    

             end
 在此使用阻塞赋值,在一个周期内即可完成for.
 如果使用非阻塞赋值,则一个周期只计算一次。


9. 同一个reg变量不能被多个always块驱动
 && 同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。

10. 锁存器
   综合系统推导出锁存器的规则是:
   (1)变量在条件语句(if或case语句)中被赋值。
   (2)变量未在条件语句的所有分支中都被赋值。
   (3)在always语句的多次调用之间需要保存变量值。
   必须同时满足以上3个条件,才会将变量推导成锁存器。在设计时应明确是否需要将某一个变量推导成锁存器,如果需要,就必 须按照上面3条规则来编写代码。否则就会

导致综合前后功能的不一致。

?11.分频的时候可以以某一位为1做条件,这样就可以同时分出多个时钟。

12.if()....
 

  if()....

   if ()
   else if()
的区别:当两个条件全为真时 前者两个都执行,后者只执行if中的语句。

自己的verilog经验