Я очень новичок в Verilog и реализации цифрового оборудования.
Я хочу создать несколько экземпляров аппаратного блока, разместить их рядом, а затем соединить их вместе (т. Е. Выход одного блока является входом следующего блока). Что усложняет, так это то, что я хочу создать двухмерный массив, похожий на массив этих аппаратных экземпляров. Таким образом, каждый экземпляр будет распространять сигнал своему нижнему и правому аналогу.
Этот блок создается один раз ниже:
alg_unit alg_unit_inst (
.clk(clk),
.rst(rst),
.init(init_temp),
.in_a(in_a_temp),
.in_b(in_b_temp),
.valid_D_in(valid_D_in_temp),
);
Чтобы создать несколько экземпляров, я использую 2 цикла создания.
generate
for (i=0; i<N; i=i+1) begin : alg_unit_generate_i
for (j=0; j<N; j=j+1) begin : alg_unit_generate_j
wire init_temp;
wire in_a_temp;
wire in_b_temp;
wire valid_D_in_temp;
assign in_a_temp = A[0];
// other assign statements here ...
alg_unit alg_unit_inst (
.clk(clk),
.rst(rst),
.init(init_temp),
.in_a(in_a_temp),
.in_b(in_b_temp),
.valid_D_in(valid_D_in_temp),
);
end
end
endgenerate
Мне нужен способ ссылки на ранее созданные экземпляры блоков alg_unit. Таким образом, я могу подключить входные сигналы блоков alg_unit, сгенерированных «позже», к выходным сигналам блоков alg_unit, сгенерированных «ранее».
Должен ли я назначать / хранить выходные сигналы из ранее сгенерированных блоков alg_unit для промежуточных «проводов»? Альтернативно, есть ли способ обратиться к ранее созданным экземплярам блоков alg_unit?
Т.е.)
// alg_unit_inst[0] was a previously-instantiated block
// I feel like using the approach below may require hard-coding some instantiations ???
alg_unit alg_unit_inst[1] (
.in_a(alg_unit_inst[0].out_a),
.in_b(alg_unit_inst[0].out_b),
);
Заранее спасибо.
источник
in_a
?Ответы:
При доступе к System Verilog я бы использовал 3-мерный массив:
Теперь вы можете подключить порты с помощью
a[x][y]
.Для модуля в позиции [i] [j] вы можете использовать, например,
a[i][j]
на выходе. Для подключения этого к входу следующего модуля вы можете использоватьa[i-1][j]
или,a[i][j-1]
или если вам нужно подключить по диагонали дажеa[i-1][j-1]
Если вам когда-либо придется использовать Verilog (как я должен был сделать до появления System Verilog), вы используете тот же метод, что и компиляторы для отображения N-мерного массива в линейной памяти:
Теперь индекс представляет собой комбинацию j и i:
a[j*N+i]
(если я правильно помню)источник