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

12

我正在尝试使用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

ab被声明为父模块的输入数组,而out被声明为一组导线。

我在这里做错了什么?是否在Verilog中不允许这样做?Quartus告诉我:

Error (10644): Verilog HDL error at driver.v(63): this block requires a name

第63行是上面的for循环。感谢任何帮助!


1
你能在“status”和当前模块中展示about的声明吗?看起来单个实例被创建了10次。 - sharvil111
3个回答

19

begin-end块后面加上冒号,可以为其应用标签标识符(例如:begin : label - end)。虽然这一特性一直是可选的生成块属性,但极力推荐使用。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

8
我知道这并没有直接回答这个问题,但是你也可以使用以下方式声明多个模块,而不需要使用generate块,例如对于10个实例:
status whatever_status[9:0] (
  .clk(clk),
  .reset_n(reset_n),
  .a(a),
  .b(b),
  .out(out)
);

这相当于假定传递的 about 声明为 [9:0],与上述 generate 代码块等效。只要它们在模块中的声明是整数倍,这种语法就可以工作;否则合成将会抛出一个错误。
例如,如果 about 声明为 [19:0],则每个实例将传递 2 个位,并假定它们在模块 status 中声明为 [1:0]

@simap 感谢您的编辑。我注意到问题中的 <= 10,但没有注意到初始化程序是 i = 1 而不是通常的 i = 0。这让我困惑了,写了一个关于11个实例的答案。 - Patrick Roberts

3
给你的区块命名:
for (i=1; i<=10; i=i+1) begin: my_status

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接