Hai una miss comprensione di come imballato e gli array non imballati lavoro. Vi consiglio di leggere la sezione IEEE1800-2012 7.4.1, 7.4.2, 7.4.4, & 7.4.5. Tecnicamente IEEE1800 è per SystemVerilog che è un super set di Verilog. I due sono gli stessi per gli array con dimensioni statiche e trovo che IEEE1800 abbia una spiegazione migliore e esempi di IEEE1364.
Se non si dispone già di una copia della LRM, quindi è possibile scaricarlo gratuitamente dal sito ieee.org: IEEE Std 1800-2012
Per il codice fornito, non è possibile assegnare ogni elemento di un array scompattato in questo modo Hai due possibilità: usa un ciclo for per assegnare la parte scompattata dell'array, oppure raddoppiare il tuo array.
/* 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
Grazie, hai salvato la mia giornata :). Non sapevo davvero la differenza tra gli array compressi e quelli decompressi. Ho anche provato formarmente a implementarlo con il ciclo for, ma ho usato genvar. Grazie anche per il link di download, ora cercherò LRM prima di chiedere :). – zsidanyi