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
我声明了几个端口连接如下的模块:
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