Generate 语句基本概念
generate 语句可以动态地生成 Verilog 代码,常用于编写许多结构相同但参数不同的赋值语句或逻辑语句,方便参数化模块的生成。generate 语句主要有以下三种用途[1]:
- 对矢量中的多个位进行重复操作
- 重复操作多个模块的实例引用
- 根据参数定义来确定程序中是否应该包括某段 Verilog 代码
generate 语句有主要三种结构:
- generate - for 语句结构
- generate - if 语句结构
- generate - case 语句结构
接下来我们对三种语句结构各举一个栗子🌰
(顺便推荐一个 emoji 图标编码网站)
generate - for
在使用前必须先声明一个 genvar 变量,用于 for 循环判断,一个 genvar 变量可用于多个 generate 循环。但使用同一个 genvar 变量的 generate 语句不能相互嵌套。genvar 只有在建模时会出现,仿真时不会出现这个变量[2]。
在 generate - for 循环结构中,可以对 generate 块命名,会创建一个generate块实例数组,如果未命名,有些仿真工具会出现警告[2]。
举两个栗子
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…等[1]。
在仿真时,仿真器会将 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 语句中通过判断语句最多执行一个代码块,所以对各个代码块用相同名称命名是合法的,且有助于保持对代码的层次化引用[2]。
需要注意的一点是,在 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
Conclusion
才买了《乌克兰拖拉机简史》看了两章,这个国家就岌岌可危了。包括之前看的《失落的卫星:深入中亚大陆的旅程》,给我的感觉就是,这些国家的人想逃离,想尽一切办法逃离国家,逃离现状,为了逃离,他们可能选择迎合可能选择抵抗,而剩下的一些人已经木讷。除了骚乱和战争,这些国家像是被世界遗忘,像失落的卫星迷失了方向,卫星决定不了自己的方向,总是被周围更大的行星所左右。
References
[1] 夏宇闻. Verilog数字系统设计教程(第三版)[M]. 北京: 北京航空航天大学出版社, 2013: 68.
[2] 数字IC小站, Verilog中generate的使用[EB/OL], https://zhuanlan.zhihu.com/p/107047600, 2020-02-15.