1. for语句
1.1 always-for
从初始值开始,如果表达式为真就执行。代码有:
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
dout[i] <= 1'b0;
end
else begin
for(i = 0; i <= 4; i = i + 1)begin
dout[i+5] <= dout_tmp[i];
end
end
end
assign dout_pro[9:0] = {dout[9:5],5'b0};
for语句开始执行直到 i 大于9时才跳出循环。
在RTL中,很少使用for循环语句,主要原因是:for语句循环多少次,综合时就会将相同的电路复制多少次,且相互之间独立,互不复用,因此循环次数越多,占用面积资源越大,综合越慢。
2. generate 语句
2.1 generate 语法
- generate的循环变量用 genvar 做定义。
- generate语句中定义的for语句必须要有begin…end。
- 上述的begin后必须要有名称标签,用于作为generate循环的实例名称。
generate语句中可以包含的类型有:
- module
- UDP
- 连续赋值语句
- initial 和 always语句等
generate的基本结构如下:
genvar 循环变量名;
genrate
//循环语句
//条件语句
//分支语句
//嵌套generate语句
endgenerate
2.2 generate-for
代码参考链接:https://blog.csdn.net/shnhwdj1984/article/details/80849828
genvar i;
generate
for (i = 0; i < 3 ; i = i + 1) begin: aaa
always @(posedge clk) begin
temp[i] <= 1'b0;
end
end
endgenerate
引用时:aaa[0].temp、aaa[1].temp、aaa[2].temp。
2.3 generate-case
与generate-if语句相同,仅是将分支语句改成了case语句。
//case分支
generate
case(N)
1: ..
2: ..
default: ..
endgenerate
//if分支
generate
if ..
else ..
endgenerate
注意:generate-if语句中的条件只能是静态变量,如genvar,parameter等,原因是:静态变量可以保证电路结构不会因为条件不同而导致综合时电路结构发生变化。
3. 比较
1、for循环在always块内时,循环变量用integer定义;genrate-for循怀的循怀变量需用genvar定义。
2、使用场景:
- for
物理结构不变,一般用于在always模块内部使用for循环语句和if条件语句。 - genrate-for
适用于物理结构随参数变化的模块,如clk上升(下降)沿有效
循环/条件/分支语句中模块调用必须使用genrate-for语句。(for循环的begin:后一定要有循环名称)
3、实例数
- for循环在always块内部,所以只产生一个always实例。-
- generate-for循环内部产生了多个always实例。