シングルバッファをはさんだパイプライン

[] [] []


パイプラインの例として、

(1) 1ステージは、データを1ワード入力するとnLATクロック後に処理結果を1ワードを出力する回路

(2) ステージ間のバッファは1

という場合を考える。ちなみにこの例は別の見方もできる(補足 -ハンドシェイクによるステージ間の転送)

k番目のステージの動作は次のようになる。

(1) 初期状態ではステージはアイドル(idle_reg =1)でバッファは空(buf_full=0)

(2) 前段のバッファに有効なデータが入り(ibuf_full=1)、かつ自ステージが処理中でなく(idle_reg=1)かつ後段のバッファがフルでなければ(obuf_full=0)、データを入力レジスタにロード(load =1パルス)してステージは処理中(idle=0)になる。ここでidleに対してセットとクリアが同時に来ることはない。

/* ステージの開始条件 */

assign load = ibuf_full & ~obuf_full & idle_reg;

 

/* ステージの処理有無 */

always @(posedge clk or negedge rst_n)

    begin

    if(~rst_n)

        idle_reg <= 1'b1;

    else if(done)

        idle_reg <= 1'b1;

    else if(load)

        idle_reg <= 1'b0;

    end

(3) nLATクロック後に完了する(done=1パルス)ので、idleをクリアし、出力データを後段のバッファに書き込む。ここで、バッファはセット(done=1パルス)とクリア(load=1パルス)が同時に来たらセット優先である。

/* バッファのデータ有無 */

always @(posedge clk or negedge rst_n)

    begin

    if(~rst_n)

        buf_full_reg <= 1'b0;

    else if(done)

        buf_full_reg <= 1'b1;

    else if(load)

        buf_full_reg <= 1'b0;

    end

シミュレーションで確認してみると、処理のレイテンシ(nLAT)が変化しても、ステージ間で順番に受け渡しができている様子が見れる。

この図において、長い処理1(nLAT=9)の次に短い処理2,3,4(nLAT=3)が続いたとき、ステージ3の処理1が終わるまで、ステージ1,2が待たされている。もしバッファを1個から2個に増やせば、ステージ1,2が待たなくてよいはずである。そこでステージ間のバッファが2個にした場合を次項で考える。


[] [] []