論理回路デザイン
ArchiTek home page
同期

異なる終了タイミングの結合サンプルRTL

Routing
  • 結合でパイプライン番号0の終了フラグendを基準に制御。
  • 全てのパイプラインがendを出した時点でフレームの終了とする。
  • パイプラインごとに基準のendより早いか遅いかの状態を管理する。
  • 各endの個数を計測して状態を制御してもよい(FF数はセーブできるがパイプライン数が多くなると論理段数増大の懸念が生じる)。
  • データの記述は省略。
Latency(CLK)0
    
    module combine(iVld, iStall, iEnd, oVld, oStall, reset, clk);
            parameter       N       = 4;

            parameter       IDLE    = 2'h0,
                            PASS    = 2'h2, // Late End
                            BLOCK   = 2'h3; // Early End
    
            input   [N-1:0] iVld;
            output  [N-1:0] iStall;
            input   [N-1:0] iEnd;
            output          oVld;
            input           oStall;
            input           reset;
            input           clk;
    
            reg     [N-1:0] cnd[0:N-1];     // Pipeline Condition
            reg     [N-1:0] cndD[0:N-1];    // Number0 is useless
            reg     [N-1:0] iDummyVld;      // Condition = EARLY
            reg     [N-1:0] iDummyStall;    // Condition = LATE
            reg     [N-1:0] iDummyVldD;
            reg     [N-1:0] iDummyStallD;
            wire    [N-1:0] iAlloc  = iVld & ~iStall & iEnd;
            wire            iDone   = &(iAlloc | iDummyStall);
    
            wire            nasc    = &(iVld | iDummyVld) & ~|oStall;
    
            integer         i;
    
            always @(posedge clk)
                    if (reset) for (i=0; i<N; i=i+1)
                            cnd[i]  <= #1 IDLE;
                    else for (i=0; i<N; i=i+1)
                            cnd[i]  <= #1 cndD[i];
    
            always @(
                    cnd[0] or cnd[1] or cnd[2] or cnd[3] or
                    iAlloc or iDone
            ) begin
                    for (i=0; i<N; i=i+1)
                            cndD[i] = cnd[i];       // Default Case
    
                    for (i=0; i<N; i=i+1) case (cnd[i])
                            IDLE:   casex ({iDone, iAlloc[i], iAlloc[0]})
                                            3'b001: cndD[i] = PASS;
                                            3'b01x: cndD[i] = BLOCK;
                                    endcase
                            PASS:   casex ({iDone, iAlloc[i]})
                                            2'b1x:  cndD[i] = IDLE;
                                            2'b01:  cndD[i] = BLOCK;
                                    endcase
                            BLOCK:  if (iDone)
                                            cndD[i] = IDLE;
                    endcase
            end
    
            always @(
                    cndD[0] or cndD[1] or cndD[2] or cndD[3]
                    )
                    for (i=0; i<N; i=i+1) begin
                            iDummyVldD[i]   = (cndD[i] == PASS);
                            iDummyStallD[i] = (cndD[i] == BLOCK);
                    end
    
            always @(posedge clk)
                    if (reset)
                            iDummyVld       <= #1 {N{1'b0}};
                    else for (i=0; i<N; i=i+1)
                            iDummyVld       <= #1 iDummyVldD;
    
            always @(posedge clk)
                    if (reset)
                            iDummyStall     <= #1 {N{1'b0}};
                    else
                            iDummyStall     <= #1 iDummyStallD;
    
            assign iStall   = iDummyStall | {N{!nasc}};
            assign oVld     = nasc;
    endmodule
    
            
iVld → oVld伝搬
iVld → iStall伝搬
iStall ← oStall伝搬
Separate Circuit

回路デザイン > パイプライン > 同期    次のページ(メモリ接続)   このページのTOP ▲

[1]
同期化のためのFIFOは前段の分岐と後段の結合の間に入れることが普通です。ただし大局的に見ると、別系統のパイプラインが並走していることがあります(整理しないと分からない場合があります)。このような場合では、分岐前や結合後であってもFIFOを挿入します。
[2]
同期化のためのFIFOはあくまで他のパイプラインとの同期をとるためのものです。正常な位置でも容量不足だったり、適量でも間違った位置だったりが、巨大なシステムLSIの根本的な性能のボトルネックになることもあります。
[3]
変動するレイテンシに対してFIFOの深さを見積もれない、もしくは非現実的な数字になる場合があります。コストと性能に対する要求の違いで対応も違いますが、大抵は技術者の直観で決められるのではないでしょうか。

しかし、定量的な裏付けが十分なされていないとトラブルになる場合があります。システム設計者と性能とコストのコンセプトについて、明確にしておくことが重要です。
[4]
FIFO Aが必ず悪と言うわけではありません。複数のノードIがあって同時に制御する場合、ノードIのStallが全て'0'にならないと発行できないため、少しのゆらぎでも性能が劣化します。このような場合は、FIFO Aが必要です。