#学习记录#
1 generate语句简述
generate语句通常用在RTL设计中,常用于编写许多结构相似但参数不同的赋值语句或者逻辑语句,方便参数化模块的生成。下面以一个格雷码转二进制编码的电路为例加以说明。
module gray2bin1(bin,gray);
parameter SIZE = 8;
output[SIZE-1:0]bin;
input [SIZE-1:0]gray;
assign bin[0] = ^gray[7:0];
assign bin[1] = ^gray[7:1];
assign bin[2] = ^gray[7:2];
assign bin[3] = ^gray[7:3];
assign bin[4] = ^gray[7:4];
assign bin[5] = ^gray[7:5];
assign bin[6] = ^gray[7:6];
assign bin[7] = ^gray[7:7];
endmodule
上述代码共有8条assign语句,可以用generate-for语句进行简化,如下:
module gray2bin1(bin,gray);
parameter SIZE = 8;
output[SIZE-1:0]bin;
input [SIZE-1:0]gray;
genvar i;
generate
for(i=0;i<=SIZE;i=i+1)begin:bit
assign bin[i]=^gray[SIZE-1:i];
end
endgenerate
endmodule
2 generate语句主要有3种结构
2.1 generate for循环语句
genvar i;
generate
for(i=0;i<=SIZE;i=i+1)
begin:名字
循环执行代码;
end
endgenerate
(1) generate for语句需要定义循环索引,关键字为genvar,索引名字任意。索引可放于generate外部或者是generate内部,当定义在generate外部时可以被多个generate使用,但可能引起冲突,最好一个generate对应一个索引。
(2) for循环结构括号内的变量只能是常量(genvar、parameter、lacalparam)。
(3) begin后边若不跟名字可能会报错,名字任意。
2.2 generate if条件分支语句
generate
if(condition1)begin:name
code1;
end
else if(condition2)begin:name
code2;
end
else begin:name
code;
end
endgenerate
(1) 不需要索引变量。
(2) condition中的参数必须是parameter或者是lacalparam类型。
2.3 generate case条件分支语句
generate
case condition1:begin:name
code1;
end
case condition2:begin:name
code2;
end
default:begin:name
code;
end
endcase
endgenerate
(1) 不需要索引变量。
(2) condition中的参数必须是parameter或者是lacalparam类型。
参考文献
[1] generate在verilog中的用法.xswznb.P10 generate在verilog中的用法_哔哩哔哩_bilibili
[2] Verilog语法之generate(for、if、case).C.V-Pupil.Verilog语法之generate (for、 if、 case)用法_generate if_C.V-Pupil的博客-CSDN博客