6

次のコードで何が機能しないのかわかりませんが、合成されません。

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 にインデックスを付けようとしましたが、何も機能しません。ザイリンクス フォーラムでこのトピックを見つけましたが、彼が何を伝えたかったのかわかりません。リンクは次のとおりです。

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

ありがとう

4

2 に答える 2

7

パックされた配列とアンパックされた配列がどのように機能するかを理解していません。IEEE1800-2012 セクション 7.4.1、7.4.2、7.4.4、および 7.4.5 を読むことをお勧めします。技術的にIEEE1800は、VerilogのスーパーセットであるSystemVerilog用です。静的サイズの配列の場合、2つは同じであり、IEEE1800にはIEEE1364よりも優れた説明と例があります。

LRM のコピーをまだ持っていない場合は、ieee.org の Web サイトから無料でダウンロードできます: IEEE Std 1800-2012

提供されたコードでは、アンパックされた配列のすべての要素をそのように割り当てることはできません。選択肢は 2 つあります。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-1) 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
于 2013-03-22T20:56:57.553 に答える