![]() |
26 |
RISC-Vプロセッサの設計 (24) |
再度テストベンチTb.bsv及びPCパイプラインProcessor.bsvのソースを示します。
Tb.bsv
import StmtFSM::*; import Processor::*; (* synthesize *) module mkTb(); Empty proc <- mkProcessor(); Stmt main = seq delay(30); $finish; endseq; mkAutoFSM(main); endmodule
Processor.bsv
import FIFO::*; (* synthesize, always_ready *) module mkProcessor(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: mkProcesso
コンパイルと起動コマンドは以下のとおりです。gtkwaveはここ。
\$ bsc -u -sim Tb.bsv; bsc -sim -e mkTb -o mkTb.exe; ./mkTb.exe -V; gtkwave -A dump.vcd
