Verilog 生成语句:条件端口连接

Verilog generate statement : conditional port connections

我声明了几个端口连接如下的模块:

mymodule m0 ( .a(myreg[0]), .b(myreg[3]), .c(2'd0), .d(oreg1));
mymodule m1 ( .a(myreg[1]), .b(myreg[0]), .c(2'd1), .d(oreg1));
mymodule m2 ( .a(myreg[2]), .b(myreg[1]), .c(2'd2), .d(oreg1));
mymodule m3 ( .a(myreg[3]), .b(myreg[2]), .c(2'd3), .d(oreg2));

我正在尝试使用生成语句,但不知道如何获得连接权限。

genvar i;
generate
for(i=0; i<3; i=i+1) begin : mymodules
    mymodule m (.a(myreg[i]), .b(???), .c(???), .d(???);
end
endgenerate

在我上面的示例中,端口 a 很简单,但我不确定如何处理其他端口。关于如何处理 b、c 和 d 的任何建议?谢谢!

对于序列 0,1,2,3 的端口连接,您需要生成以下序列 3,0,1,2。传递函数为 +3 模 4.

genvar i;
generate
for(i=0; i<=3; i=i+1) begin : mymodules
    mymodule m (.a(myreg[i]), .b(myreg[(i+3)%4]), .c(i[1:0]), .d(???));
end
endgenerate

另请注意,您希望循环 运行 for <4 or <=3 目前它只是 运行ning 从 0 到 2 (<3).并且您从实例化中遗漏了最后一个 )

对于 oregX d 输入,不确定是否遵循某种模式或简单的 if 语句是否有效。

genvar i;
generate
for(i=0; i<=3; i=i+1) begin : mymodules
   if (i<3) begin
    mymodule m (.a(myreg[i]), .b(myreg[(i+3)%4]), .c(i[1:0]), .d(oreg1));
   end
   else begin
     mymodule m (.a(myreg[i]), .b(myreg[(i+3)%4]), .c(i[1:0]), .d(oreg2));
   end
end
endgenerate

toolic 建议先创建一条线,然后一点一点地连接起来:

wire [3:0] d = {oreg2,{3{oreg1}}};
genvar i;
generate
for(i=0; i<=3; i=i+1) begin : mymodules
    mymodule m (.a(myreg[i]), .b(myreg[(i+3)%4]), .c(i[1:0]), .d(d[i]);
end
endgenerate