在 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 块,假设传递的 about 被声明为 [9:0]。只要它们是模块中声明方式的整数倍,这种语法就可以工作;它们将在每个实例中均匀分布,否则合成将引发错误。

例如,如果 about 被声明为 [19:0],那么每 2 位将被传递给每个实例,并假定它们在模块 status.

中声明为 [1:0]