高效分配给打包类型的所有元素

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。