在 Verilog 中生成 For 循环中实例化模块
Instantiate Modules in Generate For Loop in Verilog
我正在尝试使用 generate
块在 Verilog 中实例化一些模块,因为我将实例化数量可变的模块。
genvar i;
generate
for (i=1; i<=10; i=i+1) begin
status whatever_status (
.clk(clk),
.reset_n(reset_n),
.a(a[i]),
.b(b[i]),
.out(out[i])
);
end
endgenerate
a
& b
被声明为父模块的输入数组,out
被声明为连线数组。
我在这里做错了什么?这在 Verilog 中是不允许的吗? Quartus 告诉我:
Error (10644): Verilog HDL error at driver.v(63): this block requires a name
第63行就是上面的for循环。感谢您的帮助!
为您的区块命名:
for (i=1; i<=10; i=i+1) begin: my_status
您可以将标签标识符应用于开头后带有冒号的 begin
-end
块(例如:begin : label
- end
。这一直是可选的生成块的功能,尽管强烈推荐。Quartus 不应该给出错误。
这是一个满足 Quartus 的简单修复——添加一个你想要的任何名称的标签:
genvar i;
generate
for (i=1; i<=10; i=i+1) begin : generate_block_identifier // <-- example block name
status whatever_status (
.clk(clk),
.reset_n(reset_n),
.a(a[i]),
.b(b[i]),
.out(out[i])
);
end
endgenerate
我知道这并不能直接回答问题,但您也可以在这种形式中声明多个模块,而无需使用 generate
块,例如 10 个实例:
status whatever_status[9:0] (
.clk(clk),
.reset_n(reset_n),
.a(a),
.b(b),
.out(out)
);
这等效于上面的 generate
块,假设传递的 a
、b
和 out
被声明为 [9:0]
。只要它们是模块中声明方式的整数倍,这种语法就可以工作;它们将在每个实例中均匀分布,否则合成将引发错误。
例如,如果 a
、b
和 out
被声明为 [19:0]
,那么每 2 位将被传递给每个实例,并假定它们在模块 status
.
中声明为 [1:0]
我正在尝试使用 generate
块在 Verilog 中实例化一些模块,因为我将实例化数量可变的模块。
genvar i;
generate
for (i=1; i<=10; i=i+1) begin
status whatever_status (
.clk(clk),
.reset_n(reset_n),
.a(a[i]),
.b(b[i]),
.out(out[i])
);
end
endgenerate
a
& b
被声明为父模块的输入数组,out
被声明为连线数组。
我在这里做错了什么?这在 Verilog 中是不允许的吗? Quartus 告诉我:
Error (10644): Verilog HDL error at driver.v(63): this block requires a name
第63行就是上面的for循环。感谢您的帮助!
为您的区块命名:
for (i=1; i<=10; i=i+1) begin: my_status
您可以将标签标识符应用于开头后带有冒号的 begin
-end
块(例如:begin : label
- end
。这一直是可选的生成块的功能,尽管强烈推荐。Quartus 不应该给出错误。
这是一个满足 Quartus 的简单修复——添加一个你想要的任何名称的标签:
genvar i;
generate
for (i=1; i<=10; i=i+1) begin : generate_block_identifier // <-- example block name
status whatever_status (
.clk(clk),
.reset_n(reset_n),
.a(a[i]),
.b(b[i]),
.out(out[i])
);
end
endgenerate
我知道这并不能直接回答问题,但您也可以在这种形式中声明多个模块,而无需使用 generate
块,例如 10 个实例:
status whatever_status[9:0] (
.clk(clk),
.reset_n(reset_n),
.a(a),
.b(b),
.out(out)
);
这等效于上面的 generate
块,假设传递的 a
、b
和 out
被声明为 [9:0]
。只要它们是模块中声明方式的整数倍,这种语法就可以工作;它们将在每个实例中均匀分布,否则合成将引发错误。
例如,如果 a
、b
和 out
被声明为 [19:0]
,那么每 2 位将被传递给每个实例,并假定它们在模块 status
.
[1:0]