Как получить доступ к генерируемым экземплярами Verilog genvar и их сигналам - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно инициализировать массивы в сгенерированных экземплярах через блок генерации в Verilog.Я пытаюсь использовать приведенный ниже синтаксис, однако я получаю сообщение об ошибке:

Внешняя ссылка foo [0] .bar.array [0] остается неразрешенной.

в Xilinx ISE.

    integer i, j;
    initial begin
        // initialization of arrays
        for(i=0; i<(2**7); i=i+1) begin
            valid_array[i] = 0;
            for(j=0; j<N; j=j+1) begin
                foo[j].bar.array[i] = 0;
            end
        end
    end

Это мой блок генерации:

    genvar jj;
    generate
        for(jj = 0; jj < N; jj = jj + 1) begin : foo
            Memory_v3
            #(
                .ADDRESS_WIDTH(INDEX),
                .DATA_WIDTH(TAG)
            ) bar
            (
                .clock(clock),
                .we(we),
                .addr_a(addra),
                .addr_b(addrb),
                .din(din),
                .dout(dout)
            );
        end
    endgenerate

Как правильно это сделать?

1 Ответ

0 голосов
/ 16 ноября 2018

проблема в том, что блок foo разрешается во время компиляции.Таким образом, имена типа foo[0], foo[1] предварительно сгенерированы и являются именами во время компиляции, они не работают с динамическим разрешением индекса во время выполнения.Поэтому foo[j] не будет работать.

решение в этом случае состоит в использовании другого блока генерирования для их инициализации.Примерно так:

 generate
   for(jj = 0; jj < N; jj = jj + 1) begin : foo_init
      initial begin
         // initialization of arrays
         for(i=0; i<(2**7); i=i+1) begin
            foo[jj].bar.array[i] = 0;
         end
      end
   end
endgenerate

Та же история с массивом экземпляров.

FOO bar[3:0](); // array of instances

int i,j;
generate
   for(jj = 0; jj < 4; jj = jj + 1) begin : foo_init
      initial begin
         for(i=0; i<(2**7); i=i+1) begin
            bar[jj].array[i] = 0;
         end
      end
   end
endgenerate

Кстати, в системном журнале вы можете избежать использования пар generate/endgenerate:

...