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),而是三个加法器串联。
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<depth;k=k+1) begin:generate_case
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
in3_reg[k] <= 0;
else
in3_reg[k] <= in3+k;
end
end
endgenerate
3.总结
3.1.循环体
always-for只会存在一个实例块,因为for循环在always的内部;适合迭代操作如结果累加等;
generate-for-endgenerate会根据迭代的次数生成对应的多个实例块,且各自独立。
3.2.必须使用generate-for-endgenerate的情况
因为生成的是多个实例块,故适用于物理结构随循环变量参数变化的模块;
在循环/条件分支的语句中需要调用module。
3.3.物理结构
当两种方式的写法综合结果相同时,always-for的仿真速度更快。