5 |
RISC-Vプロセッサの設計 (27) |
今回設計したFIFOは2段FIFOでした。従って、1つ前の記事のようにif_waitを2サイクルにすると、図672.1で示すとおり0034, 0038とPCが先に進みます。
このようにパイプラインが次に進んでしまうということは、演算器等も2段分必要になります。従ってFIFOを1段に修正します。具体的にはmkFIFOをmkLFIFOに変更します。
以下に修正箇所を示します。
Processor.bsv
FIFO#(int) ifs <- mkLFIFO;
FIFO#(int) ids <- mkLFIFO;
FIFO#(int) exs <- mkLFIFO;
FIFO#(int) mas <- mkLFIFO;
FIFO#(int) wbs <- mkLFIFO;
以下はbsimシミュレーション波形です。図672.1ではif_waitによりPCが止まらずwait中に0038までも進んでしまいましたが、1段FIFO(パイプラインFIFO)に変更することで、if_waitが0030で入力されるとPCはその次のアドレスである0034で正しく止まっています。
図672.1, 図672.2共、Gtkwaveではtagのinvalidを自動認識しないため、パイプラインバブルのサイクルを手で赤で塗っています。