【问题标题】:Instantiate Modules in Generate For Loop in Verilog在 Verilog 的 Generate For 循环中实例化模块
【发布时间】:2015-11-24 17:06:23
【问题描述】:

我正在尝试使用 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 循环。任何帮助表示赞赏!

【问题讨论】:

  • 你能在status 和当前模块中显示a,b,out 声明吗?似乎单个实例被创建了 10 次。

标签: verilog system-verilog


【解决方案1】:

您可以将标签标识符应用于 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

【讨论】:

    【解决方案2】:

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

    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位将被传递给每个实例,并且假设它们在模块@中被声明为[1:0] 987654333@.

    【讨论】:

    • @simap 感谢您的编辑。我注意到问题中的&lt;= 10,但没有注意到初始化程序是i = 1,而不是i = 0(这是典型的)。这就是让我大吃一惊的原因,并写了一个关于 11 个实例的答案。
    【解决方案3】:

    给你的区块起个名字:

    for (i=1; i<=10; i=i+1) begin: my_status
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多