如何使用generate语句重写这段代码?

时间:2016-07-06 05:18:18

标签: verilog system-verilog iverilog

我有一个看起来像这样的Verilog代码。

module top (
    .
    .
    input a_2;
    input a_1;
    input a_0;
);
    bottom I_bottom(
                    .
                    .
                   .a(a_2);
                   );
    bottom I_bottom_2(
                       .
                       .
                       .a(a_2);
                      );
    bottom I_bottom_1(
                       .
                       .
                       .a(a_1);
                     );
    bottom I_bottom_0(
                      .
                      .
                      .a(a_0)
                     );
endmodule

如何使用generate语句编写此代码? 请注意top中的输入已在top中修复。我无法将其更改为a[2:0]等数组。

2 个答案:

答案 0 :(得分:4)

创建向量以与各个端口线等同。然后使用generate并索引向量以获取每个信号。这同样适用于输入或输出。

您必须手动构建向量,但由于保留各个端口名称的原始要求,无法转换到某处。至少它只做了一次,并且做得很简洁。

module top (
    .
    .
    input a_2;
    input a_1;
    input a_0;
);

wire [4:0]vec_a = {a_4, a_3, a_2, a_1, a_0};
generate genvar i;
    for(i=0; i<5; i=i+1) begin
        bottom I_bottom(
                .
                .
               .a(vec_a[i]);
        );
    end
endgenerate

endmodule

答案 1 :(得分:0)

为了明确在评论中提出@toolic的建议,你可以写一个像这样的实例数组:

module top (
    input a_3,
    input a_2,
    input a_1,
    input a_0
);

    bottom I_bottom[3:0] (
                      .a({a_3,a_2,a_1,a_0})
                     );
endmodule

请注意,我已将您的实例I_bottom重命名为I_bottom[3],并将其与输入a_3相关联,而不是a_2。我不确定你是否打算打破那里的模式。

我意识到这不会回答问题,因为它没有使用generate语句。我想我更喜欢使用generate的解决方案。