Сдвиг 2D массива Verilog


Я не знаю, что не работает на следующем коде, но он не будет синтезировать:

reg [7:0] FIFO [0:8];

always@(posedge clk) begin
    if(wr & !rd & !full) begin
       FIFO[0:8] <= {data_in, FIFO[1:8]};
    end
end

Я пытался индексировать FIFO и другими способами, но ничего не работает. Нашел эту тему на форуме Xilinx, но я просто не могу понять, что он хотел этим сказать. Вот ссылка:

Http://forums.xilinx.com/t5/General-Technical-Discussion/2-dimensional-array-problem-in-Verilog/td-p/42368

Спасибо

2 5

2 ответа:

Вам не хватает понимания того, как работают упакованные и распакованные массивы. Я рекомендую вам прочитать раздел 7.4.1, 7.4.2, 7.4.4 и 7.4.5 IEEE1800-2012. Технически IEEE1800 предназначен для SystemVerilog, который представляет собой супер набор Verilog. Они одинаковы для массивов со статическими размерами, и я нахожу, что IEEE1800 имеет лучшее объяснение и примеры, чем IEEE1364.

Если у вас еще нет копии LRM, то вы можете скачать ее бесплатно по адресу ieee.org веб-сайт: IEEE Std 1800-2012

Для предоставленного кода Вы не можете назначить каждый элемент в распакованном массиве таким образом. У вас есть два варианта: использовать цикл for для назначения распакованной части массива или сделать Ваш массив дважды упакованным.

/* Using for-loop */
reg [7:0] FIFO [0:8];
integer i;
always@(posedge clk) begin
    if(wr & !rd & !full) begin
       for(i = 8; i > 0; i=i-i) begin
          FIFO[i] <= FIFO[i-1];
       end
       FIFO[0] <= data_in;
    end
end

/* Using double packed array */
reg [0:8] [7:0] FIFO; // NOTE: format and usage explained in IEEE1800-2012 7.4.5
always@(posedge clk) begin
    if(wr & !rd & !full) begin
       FIFO[0:8] <= {data_in,FIFO[0:7]};
    end
end

Также будет работать следующее. Он работает независимо от того, является ли FIFO распакованным массивом упакованных (reg [7: 0] FIFO [0: 8]) или упакованным массивом упакованных (reg [7:0] [0:8] ФИФО).

reg [7:0] FIFO [0:8];

always@(posedge clk) begin
    if(wr & !rd & !full) begin
       FIFO[0] <= data_in;
       FIFO[1:8] <= FIFO[0:7];
    end
end