Posts Tagged with "FIFO"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on December 5, 2022 #563

bsimシミュレーション

このソースに対して、以下のようにコンパイル、bsimシミュレーションを実行します。

$ bsc -sim Tb.bsv; bsc -sim -e mkTb -o mkTb.exe
Elaborated module file created: mkTb.ba
Bluesim object created: mkTb.{h,o}
Bluesim object created: model_mkTb.{h,o}
Simulation shared library created: mkTb.exe.so
Simulation executable created: mkTb.exe
$ ./mkTb.exe -V
------
------
 pc_if = 0000
------
 pc_if = 0004
 pc_id = 0000
------
 pc_if = 0008
 pc_id = 0004
 pc_ex = 0000
------
 pc_if = 000c
 pc_id = 0008
 pc_ex = 0004
 pc_ma = 0000
------
 pc_if = 0010
 pc_id = 000c
 pc_ex = 0008
 pc_ma = 0004
 pc_wb = 0000
------
 pc_if = 0014
 pc_id = 0010
 pc_ex = 000c
 pc_ma = 0008
 pc_wb = 0004

のように正しくパイプラインが動作しました。また、gtkwaveで取得したタイムチャートを図563.1に示します。

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

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

posted by sakurai on December 3, 2022 #562

BSVのFIFO調査

BSVにおいて、パイプラインレジスタとしてFIFOを使用できるか調査します。まず、PCパイプラインを設計します。PCパイプラインとは、各ステージのPCを保持することで、例えば各ステージにおいてEIT(例外、割り込み、トラップ)が起きた場合、EITが起こった命令アドレスをハンドラに正しく伝えるためのものです。

Tb.bsv


import FIFO::*;

(* synthesize *)
module mkTb (Empty);

   Reg#(int) pc    <- mkReg(0);
   FIFO#(int) ifs    <- mkFIFO;
   FIFO#(int) ids    <- mkFIFO;
   FIFO#(int) exs    <- mkFIFO;
   FIFO#(int) mas    <- mkFIFO;
   FIFO#(int) wbs    <- mkFIFO;

   // <PC>
   rule pc_stage;
      if (pc > 100) $finish(0);
      $display("------");
      ifs.enq(pc);
      pc <= pc + 4;
   endrule

   // <IF>
   rule if_stage;
      let pc_if = ifs.first; ifs.deq;
      $display (" pc_if = %04h", pc_if);
      ids.enq (pc_if);
   endrule

   // <ID>
   rule id_stage;
      let pc_id = ids.first; ids.deq;
      $display (" pc_id = %04h", pc_id);
      exs.enq (pc_id);
   endrule

   // <EX>
   rule ex_stage;
      let pc_ex = exs.first; exs.deq;
      $display (" pc_ex = %04h", pc_ex);
      mas.enq (pc_ex);
   endrule

   // <MA>
   rule ma_stage;
      let pc_ma = mas.first; mas.deq;
      $display (" pc_ma = %04h", pc_ma);
      wbs.enq (pc_ma);
   endrule

   // <WB>
   rule wb_stage;
      let pc_wb = wbs.first; wbs.deq;
      $display (" pc_wb = %04h", pc_wb);
   endrule

endmodule: mkTb

ここで、<PC>は入力レジスタは無いため、ここではFIFOは使用しません(が、後で検討します)。単にPCレジスタを設置するだけです。これは<PC>(PCステージ)のPCということになります。通常はPC<=PC+4ですが、分岐時等ではオフセットが足されます。

各ステージでは、入力されたPCをデキューし、表示し、サイクルの終わりで次のステージにそのPCをエンキューします。

図%-%.1
図562.1 FIFOのDequeuとEnqueueの関係
従って、同一サイクルでエンキューしたものをデキューする(バイパス、パススルー)ことはできません。

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


ページ: