論理回路デザイン
お問い合わせ サイトマップ リンク Tips
ArchiTek home page
メモリ接続

メモリアクセスサンプルRTL

FIFO付きRead制御
  • アドレス情報を入力しデータ出力を得るパイプライン。アドレス長とデータ長は32bitを想定。
  • 同一の深さのFIFOを2つ使用する。1つはデータの送受信がないSignaling FIFOを使う。
  • FIFOによる制御は以下の通り。
    • アドレス発行数(メモリ)とデータ読み込み数(パイプライン)の差が、一定以上の値を超えないようにSignaling FIFOで制御する。
    • メモリからの読み出しとデータFIFO間の制御は、原始型の制御で連結
    • Signaling FIFOとデータFIFOは同じ深さのため、データパイプラインは必ずその深さ分のデータしか流れない。即ち、メモリのデータの読み出しには、Waitはかからない。
  • バーストアクセスはサポートしない。
Latency(CLK)0
    
    module rdMem(
            iData, iVld, iStall,
            oData, oVld, oStall,
            memAddr, memReq, memGnt,
            memData, memStrb, memAck,
            reset, clk);
    
            input   [31:0]  iData;          // Address
            input           iVld;
            output          iStall;
            output  [31:0]  iData;          // Read Data
            output          oVld;
            input           oStall;
            output  [31:0]  memAddr;
            output          memReq;
            input           memGnt;
            input   [31:0]  memData;
            output          memStrb;
            input           memAck;
            input           reset;
            input           clk;
    
            wire            vVld, vStall;
            wire            dVld;
    
            sig vFifo (                   // Virtual FIFO
                    .iVld           (iVld & memGnt),
                    .iStall         (vStall),
                    .oVld           (vVld),
                    .oStall         (!dVld | oStall),
                    .reset          (reset),
                    .clk            (clk)
                    );
    
            fifo dFifo (                   // Data FIFO
                    .iData          (memData),
                    .iVld           (memAck),
                    .iStall         (),     // NC
                    .oData          (oData),
                    .oVld           (dVld),
                    .oStall         (!vVld | oStall),
                    .reset          (reset),
                    .clk            (clk)
                    );
    
            assign iStall   = vStall | !memGnt;
    
            assign oVld     = vVld & dVld;
    
            assign memReq   = iVld & !vStall;
            assign memAddr  = oData;
            assign memStrb  = 1'b1;
    endmodule
    
            
iVld → oVld切断
iStall ← oStall切断
iVld → memReq伝搬
oVld ← memAck切断
Read Memory
Structure

FIFO付きWrite制御
  • アドレス情報を入力しデータ出力を得るパイプライン。アドレス長とデータ長は32bitを想定。
  • 同一の深さのFIFOを4つ使用する。2つはデータの送受信がない仮想的なFIFOでよい。
  • FIFOによる制御は以下の通り。
    • アドレス発行数(メモリ)とデータ書き込み数(パイプライン)の差があればアドレスの発行を許可(VA FIFO)。データが準備出来た後でクエストを行い相対的な遅延を小さくするため。
    • アドレス発行数(メモリ)とデータ書き込み数(メモリ)の差があれば、データ発行を許可(VD FIFO)。リクエストを行った後でデータを送信するため(データを先行して送信してもよい仕様なら不必要)。
  • バーストアクセスはサポートしない。
Latency(CLK)0
    
    module wrMem(
            iAdData, iAdVld, iAdStall,
            iDtData, iDtVld, iDtStall,
            memAddr, memReq, memGnt,
            memData, memStrb, memAck,
            reset, clk);
    
            input   [31:0]  iAdData;        // Address
            input           iAdVld;
            output          iAdStall;
            input   [31:0]  iDtData;        // Write Data
            input           iDtVld;
            output          iDtStall;
            output  [31:0]  memAddr;
            output          memReq;
            input           memGnt;
            output  [31:0]  memData;
            output          memStrb;
            input           memAck;
            input           reset;
            input           clk;
    
            wire            adVld;
            wire            dtVld, dtStall;
            wire            vaVld, vaStall;
            wire            vdVld, vdStall;
    
            fifo adFifo (                   // Address FIFO
                    .iData          (iAdData),
                    .iVld           (iAdVld),
                    .iStall         (iAdStall),
                    .oData          (memAddr),
                    .oVld           (adVld),
                    .oStall         (!memAdGnt | !vaVld | vdStall),
                    .reset          (reset),
                    .clk            (clk)
                    );
    
            fifo dtFifo (                   // Data FIFO
                    .iData          (iDtData),
                    .iVld           (iDtVld & !vaStall),
                    .iStall         (dtStall),
                    .oData          (memData),
                    .oVld           (dtVld),
                    .oStall         (!memDtAck | vdStall),
                    .reset          (reset),
                    .clk            (clk)
                    );
    
            sig vaFifo (                   // Virtual Address FIFO
                    .iVld           (iDtVld & !dtStall),
                    .iStall         (vaStall),
                    .oVld           (vaVld),
                    .oStall         (!memAdGnt | !adVld | vdStall),
                    .reset          (reset),
                    .clk            (clk)
                    );
    
            sig vdFifo (                   // Virtual Data FIFO
                    .iVld           (memGnt & adVld & vaVld),
                    .iStall         (vdStall),
                    .oVld           (vdVld),
                    .oStall         (!memAck | !dtVld),
                    .reset          (reset),
                    .clk            (clk)
                    );
    
            assign iDtStall = dtStall | vaStall;
    
            assign memReq   = adVld & vaVld & !vdStall;
            assign memStrb  = dtVld & vdVld;
    endmodule
    
            
iVld → oVld切断
iStall ← oStall切断
iVld → memReq伝搬
oVld ← memAck切断
Write Memory
Structure

回路デザイン > パイプライン > メモリ接続    次のページ(リソースシェアリング)   このページのTOP ▲

[1]
メモリアクセスの最少レイテンシは構造から計算できますが、最大レイテンシの見積もりはたいていが困難です。例えば、競合相手がメモリの使用権の調停をフリーズさせるような構造がある場合だと最大レイテンシは∞になってしまいます。

メモリアクセスを一旦開始すればそれに対するStall制御などのハンドシェークはなるべく生じないようにすれば、アクセス頻度や分配方式によってレイテンシの分布を確率的に検討することは可能だと思います。
[2]
並走するパイプラインのFIFO深さを∞にするため、ポインタのみを管理しFIFOデータをシステムメモリに置き換えることがあります。ただし、システムメモリへのアクセスが増加するためデメリットにもなり得ます。
[3]
Writeの場合、同一パイプラインから分岐してアドレスとデータに分けて固定パイプライン長で処理する場合、このような同期化のためのFIFOはほとんどの場合が必要としません。