2013-03-22 89 views
5

我不知道什麼犯規在下面的代碼工作,但它不會合成:轉移二維數組的Verilog

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

[email protected](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

感謝

回答

4

你是如何緊縮和非緊縮陣列工作的小姐認識。我建議您閱讀IEEE1800-2012的7.4.1,7.4.2,7.4.4,& 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 
+1

謝謝你,你救了我的一天:)。我真的不知道打包和解壓縮數組之間的區別。我也試圖用for循環來實現它,但我使用genvar。感謝下載鏈接,我現在會在問:)之前查看LRM。 – zsidanyi 2013-03-22 21:21:25

1

以下內容也有效。無論FIFO是打包(reg [7:0] FIFO [0:8])還是打包(reg [7:0] [0:8] FIFO)打包數組,它都可以工作。

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

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