今天在讨论区答疑,发现有同学问到 Verilog for 循环的问题。我只知道 for 循环能在 always 和 initial 块中使用。陈奕帅助教提到了 for 也可以在 generate 中使用,查找了相关资料进行学习。
下面是一段 Verilog 程序
module generate_for(
input [31:0] a,
input b,
input c,
output [31:0] out
);
parameter d = 16;
genvar i;
generate
for (i = 0; i < d && i < 32; i = i + 1) begin: gen
assign out[i] = b;
end
endgenerate
generate
for (i = d; i < 32; i = i + 1) begin: gen2
assign out[i] = c;
end
endgenerate
endmodule
generate for 的主要作用是批量生成 verilog 代码块,但需要注意的是 generate for 循环中的变量除了 genvar 需要是常量。如果把 d 换成 a 就会报错。
我同时还学到了新的定义参数的方法:
module generate_for#(parameter d = 16)(
input [31:0] a,
input b,
input c,
output [31:0] out
);
这里定义的参数功能很强大。generate语句允许细化时间(Elaboration-time)的选取或者某些语句的重复。这些语句可以包括模块实例引用的语句、连续赋值语句、always 语句、initial 语句和门级实例引用语句等。细化时间是指仿真开始前的一个阶段,此时所有的设计模块已经被链接到一起,并完成层次的引用。这里的参数就可以作为 generate for 中的“变量”,在仿真开始前就已经确定,仿真时不会变,所以可以用于 generate 建模并生成模块。