在Verilog中生成For循环中的模块实例化

Col*_*lin 4 verilog system-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
Run Code Online (Sandbox Code Playgroud)

a&b被声明为父模块的输入数组,out并被声明为连线数组.

我在这做错了什么?这是Verilog不允许的吗?Quartus告诉我:

Error (10644): Verilog HDL error at driver.v(63): this block requires a name
Run Code Online (Sandbox Code Playgroud)

第63行是上面的for循环.任何帮助表示赞赏!

Gre*_*reg 10

您可以在开始之后使用冒号将标签标识符应用于begin- endblock(例如: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
Run Code Online (Sandbox Code Playgroud)


Pat*_*rts 6

我知道这并不能直接回答这个问题,但是您也可以在这种形式中声明几个模块,而无需generate为 10 个实例使用这样的块:

status whatever_status[9:0] (
  .clk(clk),
  .reset_n(reset_n),
  .a(a),
  .b(b),
  .out(out)
);
Run Code Online (Sandbox Code Playgroud)

这等同于所述generate块上面的假设ab以及out被传递被声明为[9:0]。只要它们是它们在模块中声明的整数倍,这种语法就会起作用;它们将均匀分布在每个实例中,否则合成将引发错误。

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