論理回路デザイン
ArchiTek home page
ステージの構造

ステージの型

原始型(SO
  • 無条件にデータを伝搬する形式。
  • 停止制御できないため、基本的に単独で用いることはない。
  • Validの送信タイミングが確定しているため、リソースシェアリングの制御が容易。
Latency(CLK)1
    
    module s0(iData, iVld, oData, oVld, reset, clk);
            parameter       W       = 32;

            input   [W-1:0] iData;
            input           iVld;
            output  [W-1:0] oData;
            output          oVld;
            input           reset;
            input           clk;
    
            reg     [W-1:0] oData;
            reg             oVld;
    
            always @(posedge clk)
                    oData   <= #1 xxxFunc(iData);
    
            always @(posedge clk)
                    if (reset)
                            oVld    <= #1 1'b0;
                    else
                            oVld    <= #1 iVld;

    function [W-1:0] xxxFunc;
            input   [W-1:0] data;
            xxxFunc = data;
    endfunction
    endmodule
    
            
iVld → oVld切断
iStall ← oStall-
原始型

基本型(S?
  • 基本的な形式。
  • Stallをブロードキャスト制御する場合に使用する。
Latency(CLK)1
    
    module s1(iData, iVld, iStall, oData, oVld, oStall, reset, clk);
            parameter       W       = 32;

            input   [W-1:0] iData;
            input           iVld;
            output          iStall;
            output  [W-1:0] oData;
            output          oVld;
            input           oStall;
            input           reset;
            input           clk;
    
            reg     [W-1:0] oData;
            reg             oVld;
    
            always @(posedge clk)
                    if (!iStall)
                            oData   <= #1 xxxFunc(iData);
    
            always @(posedge clk)
                    if (reset)
                            oVld    <= #1 1'b0;
                    else if (!iStall)
                            oVld    <= #1 iVld;
    
            assign iStall   = oStall;

    function [W-1:0] xxxFunc;
            input   [W-1:0] data;
            xxxFunc = data;
    endfunction
    endmodule
    
            
iVld → oVld切断
iStall ← oStall切断
基本型

バッファ型(S?
  • 通常時に最も使用する形式。
  • 非活性時(Valid=0)、後段のStall伝搬を止めることでこのステージへのキューイングが可能。
  • Stallの揺らぎの吸収(1つ)が可能。
Latency(CLK)1
    
    module s2(iData, iVld, iStall, oData, oVld, oStall, reset, clk);
            parameter       W       = 32;

            input   [W-1:0] iData;
            input           iVld;
            output          iStall;
            output  [W-1:0] oData;
            output          oVld;
            input           oStall;
            input           reset;
            input           clk;
    
            reg     [W-1:0] oData;
            reg             oVld;
    
            always @(posedge clk)
                    if (!iStall)
                            oData   <= #1 xxxFunc(iData);
    
            always @(posedge clk)
                    if (reset)
                            oVld    <= #1 1'b0;
                    else if (!iStall)
                            oVld    <= #1 iVld;
    
            assign iStall   = oStall & oVld;

    function [W-1:0] xxxFunc;
            input   [W-1:0] data;
            xxxFunc = data;
    endfunction
    endmodule
    
            
iVld → oVld切断
iStall ← oStall伝播
バッファ型

パス型(S?
  • 後段の状態に合わせてバッファリングする形式。
  • 後段からブロックされた場合(Stall=1)にだけ、このステージへのキューイングが可能。
  • バッファ型と特性が対になっており、両者を結合することによりFIFOと等価になる。
  • Stallの揺らぎの吸収(1つ)が可能。
Latency(CLK)0
    
    module s3(iData, iVld, iStall, oData, oVld, oStall, reset, clk);
            parameter       W       = 32;

            input   [W-1:0] iData;
            input           iVld;
            output          iStall;
            output  [W-1:0] oData;
            output          oVld;
            input           oStall;
            input           reset;
            input           clk;
    
            reg     [W-1:0] tData;
            reg             tVld;
    
            always @(posedge clk)
                    if (!tVld)
                            tData   <= #1 iData;
    
            always @(posedge clk)
                    if (reset)
                            tVld    <= #1 1'b0;
                    else
                            tVld    <= #1 oVld & oStall;
    
            assign iStall   = tVld;
            assign oData    = xxxFunc(tVld ? tData : iData);
            assign oVld     = iVld | tVld;

    function [W-1:0] xxxFunc;
            input   [W-1:0] data;
            xxxFunc = data;
    endfunction
    endmodule
    
             
iVld → oVld伝播
iStall ← oStall切断
パス型

FIFO型(FIFO[1]
  • 後段の状態に合わせてバッファリングする形式。
  • 後段からブロックされるか、既にキューイング状態の場合、このステージへのキューイングが可能。キューイングできる数は任意で、ポインタによる管理を行う。
  • dataは単純な回路構成を用いるとセレクタ出力なので遅延に注意。
  • Stallの揺らぎの吸収(FIFO深さ分)が可能。
  • ステージ間に挿入することでValid, Stallのタイミングアークの切断、およびパイプライン組み合わせ時のタイミング調整に用いることが多い。
  • iStallに'full'、oVldに'not empty'を割り当てる。また、iStallはバッファが一杯になったことを示す'full'でなく、任意のThresholdを越したことを示す'full'にすることがある。一般的に前者を用いる。
  • dataポートを削除した制御用のFIFOもよく使用される。
Latency(CLK)1
    
    module fifo(iData, iVld, iStall, oData, oVld, oStall, reset, clk);
            parameter       W       = 32;
            parameter       D       = 4;

            input   [W-1:0] iData;
            input           iVld;
            output          iStall;
            output  [W-1:0] oData;
            output          oVld;
            input           oStall;
            input           reset;
            input           clk;
    
            reg             iStall;
            reg             oVld;
            reg     [W-1:0] tData[0:(1<<D)-1];
            reg     [D:0]   iPtr;
            reg     [D:0]   oPtr;
            wire    [D:0]   iPtrD   = iPtr + (iVld & !iStall);
            wire    [D:0]   oPtrD   = oPtr + (oVld & !oStall);
    
            always @(posedge clk)
                    if (iVld & !iStall)
                            tData[iPtr[D-1:0]]
                                    <= #1 xxxFunc(iData);
    
            always @(posedge clk)
                    if (reset) begin
                            iStall  <= #1 1'b0;
                            oVld    <= #1 1'b0;
                            iPtr    <= #1 {D+1{1'b0}};
                            oPtr    <= #1 {D+1{1'b0}};
                    end
                    else begin
                            iStall  <= #1 (iPtrD[D] != oPtrD[D])
                                        & (iPtrD[D-1:0] == oPtrD[D-1:0]);
                            oVld    <= #1 (iPtrD != oPtrD);
                            iPtr    <= #1 iPtrD;
                            oPtr    <= #1 oPtrD;
                    end
    
            assign oData    = tData[oPtr[D-1:0]];

    function [W-1:0] xxxFunc;
            input   [W-1:0] data;
            xxxFunc = data;
    endfunction
    endmodule
    
            
iVld → oVld切断
iStall ← oStall切断
FIFO型

回路デザイン > パイプライン > ステージの構造    次のページ(ステージの連結)   このページのTOP ▲

[1]
FIFOはパイプラインどうしの同期合わせだけでなく、ステージ間に挿入してタイミングアークを切断するのにも重宝します。