高效分配给打包类型的所有元素
Efficient assign to all elements of a packed type
考虑以下 Verilog 模块:
`timescale 1ns / 1ps
module gpio(inout [8:0]data);
reg dataOut[8:0];
reg dataDir[8:0];
assign data[1:0] = dataDir[0]==1 ? dataOut[0] : 1'bZ;
assign data[2:1] = dataDir[1]==1 ? dataOut[1] : 1'bZ;
assign data[3:2] = dataDir[2]==1 ? dataOut[2] : 1'bZ;
assign data[4:3] = dataDir[3]==1 ? dataOut[3] : 1'bZ;
assign data[5:4] = dataDir[4]==1 ? dataOut[4] : 1'bZ;
assign data[6:5] = dataDir[5]==1 ? dataOut[5] : 1'bZ;
assign data[7:6] = dataDir[6]==1 ? dataOut[6] : 1'bZ;
assign data[8:7] = dataDir[7]==1 ? dataOut[7] : 1'bZ;
endmodule
直觉表明 必须 是一种更好的方法。如果不出意外,我可能希望 GPIO 中的位数成为模块参数。
我尝试在 initial
块中使用 for
循环,但无法编译它。
您可以使用带有 for
循环的 generate
构造来代替 initial
块:
module gpio (inout [8:0] data);
reg dataOut [8:0];
reg dataDir [8:0];
genvar i;
generate
for (i=0; i<8; i=i+1) begin : drive_data
assign data[i+1:i] = dataDir[i]==1 ? dataOut[i] : 1'bZ;
end
endgenerate
endmodule
请参阅 IEEE 标准 1800-2017,第 27 节。生成构造。
您也可以使用 parameter
而不是 8。
考虑以下 Verilog 模块:
`timescale 1ns / 1ps
module gpio(inout [8:0]data);
reg dataOut[8:0];
reg dataDir[8:0];
assign data[1:0] = dataDir[0]==1 ? dataOut[0] : 1'bZ;
assign data[2:1] = dataDir[1]==1 ? dataOut[1] : 1'bZ;
assign data[3:2] = dataDir[2]==1 ? dataOut[2] : 1'bZ;
assign data[4:3] = dataDir[3]==1 ? dataOut[3] : 1'bZ;
assign data[5:4] = dataDir[4]==1 ? dataOut[4] : 1'bZ;
assign data[6:5] = dataDir[5]==1 ? dataOut[5] : 1'bZ;
assign data[7:6] = dataDir[6]==1 ? dataOut[6] : 1'bZ;
assign data[8:7] = dataDir[7]==1 ? dataOut[7] : 1'bZ;
endmodule
直觉表明 必须 是一种更好的方法。如果不出意外,我可能希望 GPIO 中的位数成为模块参数。
我尝试在 initial
块中使用 for
循环,但无法编译它。
您可以使用带有 for
循环的 generate
构造来代替 initial
块:
module gpio (inout [8:0] data);
reg dataOut [8:0];
reg dataDir [8:0];
genvar i;
generate
for (i=0; i<8; i=i+1) begin : drive_data
assign data[i+1:i] = dataDir[i]==1 ? dataOut[i] : 1'bZ;
end
endgenerate
endmodule
请参阅 IEEE 标准 1800-2017,第 27 节。生成构造。
您也可以使用 parameter
而不是 8。