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

时间:2015-11-24 17:06:23

标签: 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

a&amp; b被声明为父模块的输入数组,out被声明为连线数组。

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

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

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

3 个答案:

答案 0 :(得分:10)

您可以在开始后使用冒号将标签标识符应用于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

答案 1 :(得分:3)

我知道这并没有直接回答这个问题,但你也可以在这个阵型中声明几个模块而不使用像这样的generate块:

status whatever_status[10:0] (
  .clk(clk),
  .reset_n(reset_n),
  .a(a),
  .b(b),
  .out(out)
);

这相当于上面的generate块,假设传递的about被声明为[10:0]。只要它们是模块中声明的整数倍,该语法就可以工作;它们将在每个实例之间均匀分布,否则合成将引发错误。

例如,如果about被声明为[21:0],则每2位将传递给每个实例,并假设它们已声明在[1:0]模块中为status

答案 2 :(得分:2)

给你的区块命名:

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