for循环的用法

        Verilog for循环语句是在verilog中提供的一种非常有用的控制结构。它允许开发人员根据指定的条件执行代码块多次,从而大大提高了编程的效率。for循环语句可以用来实现以下基本功能:

                ①重复执行特定的语句或语句块;

                ②在满足特定条件时跳出循环;

                ③根据指定的步长迭代循环变量。

1.always-for用法

        注意点:

                ①always块的for循环的变量定义为integer类型;

                ②当always块为时序逻辑时,块内的第一行必须是异步复位。

        举例如下:

module test(
    output reg [8:0] sumx,
    input      [4:0] x
);

integer i;                //循环变量定义为integer

always@(*) begin
    sumx = 1 ;            //初始化     
    for(i=0; i<3; i=i+1)
        sumx = sumx + x ; //组合逻辑中输出赋值给自己,因有初始化不会产生latch
    end
endmodule

                仿真结果:令x=3,则sumx=10。

                综合结果:

  •                         for循环n次代表有n个相似的电路模块存在;
  •                         代码上的“循环反馈”结构在阻塞赋值时代表前后有关联且为组合逻辑;
  •                         综合结果既不是一个加法器循环三次(C语言),也不是三个并联的加法器(generate-for-endgenerate),而是三个加法器串联。

for循环的用法_第1张图片

2.(generate)-for-always/assign/module例化-(endgenerate)用法

        注意点:

                ①可以省略generate-endgenerate,但是综合后电路与省略前一样;

                ②always块的for循环的变量要定义为genvar型。

        举例:

reg [data_width-1:0] in3_reg [depth-1:0];

genvar k;
generate
    for(k=0;k

3.总结

        3.1.循环体

                always-for只会存在一个实例块,因为for循环在always的内部;适合迭代操作如结果累加等;

                generate-for-endgenerate会根据迭代的次数生成对应的多个实例块,且各自独立。

        3.2.必须使用generate-for-endgenerate的情况

                因为生成的是多个实例块,故适用于物理结构随循环变量参数变化的模块;

                在循环/条件分支的语句中需要调用module

        3.3.物理结构

                当两种方式的写法综合结果相同时,always-for的仿真速度更快。  

你可能感兴趣的:(#,Verilog,HDL,for循环)