3 |
RISC-Vプロセッサの設計 (9) |
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をエンキューします。