我有一个看起来像这样的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]
等数组。
答案 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
的解决方案。