8 |
RISC-Vプロセッサの設計 (13) |
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ステージのレイテンシが2サイクルとなってしまいます。
これは、emtpyやfullは1サイクルおきにアサートされ、そのため2サイクルに1度しかキューに投入できないためです。従ってスループットが半分、レイテンシが倍になってしまいます。FIFOの動作上、空でないと上位からは詰められず、一方で詰まってないと下位からは引き取れないので、交互動作になるのは当然です。
通常のパイプラインはエンキューとデキューが同時に行えるので、これは改善できるかもしれません。