Эффективное назначение всем элементам упакованного типа

#verilog

Вопрос:

Рассмотрим следующий модуль 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 было параметром модуля.

Я попытался использовать for цикл в initial блоке, но не смог заставить его скомпилироваться.

Ответ №1:

Вместо использования initial блока вы можете использовать generate конструкцию с for циклом:

 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 Std 1800-2017, раздел 27. Создание конструкций.

Вы также можете использовать a parameter вместо 8.