-1

我有一个看起来像这样的 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].

4

2 回答 2

4

Create vector to equate with the individual port wires. Then use generate and index the vector to get at each signal. This works equally for inputs or outputs.

You do have to build the vector manually, but there is no escape from converting somewhere due to the original requirement to keep the individual port names. At least it is done only once, and done succinctly.

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
于 2016-07-06T05:57:27.497 回答
1

只是为了明确说明@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_bottomI_bottom[3]并将其连接到 input a_3,而不是a_2. 我不确定你是否打算打破那里的模式。


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

于 2016-07-08T21:54:13.420 回答