Posts Issued on December 8, 2022

posted by sakurai on December 8, 2022 #566

1段FIFOのシミュレーション

本来はFIFOは1段で良いはずですが、なぜ2段となっているのでしょうか?ここだけ見ると物量が倍になってしまいます。たいした物量ではないものの、1段で済ませないかを検討します。

前述のように、bscが出力するシミュレーションモデルではFIFO2という2段FIFOを使用しています。このモデルを1段FIFOに入れ替えたいのですが、bsimモデルは触ることができないので、verilogモデルのほうを修正します。上位において次のようにFIFO2を呼び出しているところをテキストエディタでFIFO1に修正します。

// submodule exs
FIFO2 #(.width(32'd32), .guarded(32'd1)) exs(.RST(RST_N),
                                             .CLK(CLK),
                                             .D_IN(exs$D_IN),
                                             .ENQ(exs$ENQ),
                                             .DEQ(exs$DEQ),
                                             .CLR(exs$CLR),
                                             .D_OUT(exs$D_OUT),
                                             .FULL_N(exs$FULL_N),
                                             .EMPTY_N(exs$EMPTY_N));

次にverilogシミュレーションを行うと、以下のような波形が得られます。

図%%.1
図566.1 PCパイプラインタイムチャート

1ステージのレイテンシが2サイクルとなってしまいます。

これは、emtpyやfullは1サイクルおきにアサートされ、そのため2サイクルに1度しかキューに投入できないためです。従ってスループットが半分、レイテンシが倍になってしまいます。FIFOの動作上、空でないと上位からは詰められず、一方で詰まってないと下位からは引き取れないので、交互動作になるのは当然です。

通常のパイプラインはエンキューとデキューが同時に行えるので、これは改善できるかもしれません。


左矢前のブログ 次のブログ右矢