#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.