Verilog - Соединение нескольких аппаратных экземпляров вместе

0

Я очень новичок в 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),

);

Заранее спасибо.

Универсальный мыслитель
источник
Два вопроса: 1 / Можете ли вы использовать System Verilog? 2 / Насколько большой (сколько бит) in_a?
Олдфарт
Привет @ Олдфарт. 1) я могу использовать System Verilog 2) in_a имеет ширину 32 бита.
Универсальный мыслитель

Ответы:

0

При доступе к System Verilog я бы использовал 3-мерный массив:

wire [31:0] a [0:N-1][0:N-1];

Теперь вы можете подключить порты с помощью 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-мерного массива в линейной памяти:

wire [31:0] a [0:N*N-1];

Теперь индекс представляет собой комбинацию j и i: a[j*N+i](если я правильно помню)

Oldfart
источник
Спасибо Oldfart, это работает хорошо!
Универсальный мыслитель