У вас есть промах понимание того, как упакованные и распакованные массивы работы. Я рекомендую вам ознакомиться с разделом 7.4.1, 7.4.2, 7.4.4, & IEEE1800-2012. 7.4.5. Технически IEEE1800 предназначен для SystemVerilog, который является супер-набором Verilog. Они одинаковы для массивов со статическими размерами, и я считаю, что IEEE1800 имеет более подробное объяснение и примеры, чем IEEE1364.
Если вы уже не имеете копии LRM, то вы можете скачать ее бесплатно на сайте ieee.org: IEEE Std 1800-2012
Для предоставленного кода, вы не можете присвоить каждый элемент в распакованном виде массива таким образом. У вас есть два варианта: используйте for-loop, чтобы назначить распакованную часть массива или сделать массив массивным.
/* Using for-loop */
reg [7:0] FIFO [0:8];
integer i;
[email protected](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
[email protected](posedge clk) begin
if(wr & !rd & !full) begin
FIFO[0:8] <= {data_in,FIFO[0:7]};
end
end
Благодарю вас, вы спасли мой день :). Я действительно не знал разницы между упакованными и распакованными массивами. Я также старался реализовать его с помощью цикла for, но я использовал genvar. Спасибо за ссылку на скачивание, я сейчас же посмотрю LRM, прежде чем спрашивать :). – zsidanyi