generate 语句可以动态地生成 Verilog 代码,常用于编写许多结构相同但参数不同的赋值语句或逻辑语句,方便参数化模块的生成。
generate 语句有些资料说是有三种用法,但我认为本质上就是两种用法。
- 对矢量中的多个位进行重复操作
- 根据参数定义来确定程序中是否应该包括某段 Verilog 代码
generate 语句有主要三种结构:
- generate - for 语句结构
- generate - if 语句结构
- generate - case 语句结构
其中generate - for 语句结构主要用来对矢量中的多个位进行重复操作。
generate - if 、generate - case主要根据参数定义来确定程序中是否应该包括某段 Verilog 代码。
generate - for
在使用前必须先声明一个 genvar 变量,用于 for 循环判断,一个 genvar 变量可用于多个generate 循环。但使用同一个 genvar 变量的 generate 语句不能相互嵌套。genvar 只有在建模时会出现,仿真时不会出现这个变量。
在 generate - for 循环结构中,可以对 generate 块命名,会创建一个generate块实例数组,如果未命名,有些仿真工具会出现警告。
以下为例子:
genvar i;
generate
for (i = 0; i < 15; i++)
begin: xorLoop
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
dout[i] <= 1'b0;
end
else begin
dout[i] <= din0[i] ^ din1[i];
end
end
endgenerate
genvar i;
generate
for (i = 0; i < 15; i++)
begin: xorLoop
xor u_xor(
.dout (dout[i]),
.din0 (din0[i]),
.din1 (din1[i])
);
end
endgenerate
这两个模块的功能是一样的,第一个栗子是对 always 块进行了循环,第二个栗子是对实例化模块进行了循环。xorLoop 是 generate 语句模块名,目的是通过它对循环语句进行层次化引用,所以在上面栗子中的 xorLoop 模块相对层次名为 xorLoop[0].u_xor, xorLoop[1].u_xor…等。
在仿真时,仿真器会将 generate 块代码展开,上面的代码就相当于
xorLoop u_xor0(.dout(dout[0]), .din0(din0[0]), .din1(din1[0]));
xorLoop u_xor1(.dout(dout[1]), .din0(din0[1]), .din1(din1[1]));
// ......
xorLoop u_xor15(.dout(dout[15]), .din0(din0[15]), .din1(din1[15]));
generate - if
generate -if 语句不需要 genvar,可以不对 generate 块进行命名,而且可以不写 begin / end。由于在一个 generate - if 语句中通过判断语句最多执行一个代码块,所以对各个代码块用相同名称命名是合法的,且有助于保持对代码的层次化引用。
需要注意的一点是,在 generate 块中的判断条件必须是常量!
parameter div = 8;
generate
if (div == 4) begin: u1
div4 u_div4(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
end
else if (div == 8) begin: u1
div8 u_div8(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
end
endgenerate
generate - case
generate - case 语句和 generate - if 语句都是条件判断,用法基本一致。
和 generate - if 语句一样,case 判断条件必须是常量。
parameter div = 8;
generate
case(div)
4: div4 u_div4(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
8: div8 u_div8(.clk(clk), .rst_n(rst_n), .prr(prr), .clkOut(clkOut));
endcase
endgenerate
References
Rose Island : https://blog.csdn.net/weixin_42150654/article/details/123132249