RISC-Vプロセッサの実装バリエーションのうち、性能重視のプロセッサであるBOOM (Barkeley Out-of-Order Machine)は、どのような構造で実装されているのだろう。
git clone https://github.com/ucb-bar/rocket-chip.git cd rocket-chip git checkout boom git submodule update --init cd emulator; make run CONFIG=BOOMConfig
BOOMのビルドが完了すると、一通りBOOMのVerilogモデルが生成される。これは1つのファイルで形成されていて、rocketchip.BOOMConfig.v
というファイルが生成されていた。
全てのモジュールを一つのファイルでまとめているらしい。こりゃ、解析する気にならないな...
wc rocketchip.BOOMConfig.v 860267 2870793 32449520 rocketchip.BOOMConfig.v
86万行もあるぜ!
Verilog-Perlのツールであるvhierを使って構成を把握する
これは本ブログでも以前紹介した、Verilog-Perlの機能の一つであるvhierを使うものだ。vhierを使えば、Verilogファイルをコンパイルすることなく、内部構成を把握することができる。
今回のvhierのオプションは簡単だ。1つしかファイルが存在しないため、そのまま指定すれば良い。
$ vhier rocketchip.BOOMConfig.v -o rocketchip.hier --cells --forest --instance %Error: rocketchip.BOOMConfig.v:860145: Cannot find SimDTM %Error: rocketchip.BOOMConfig.v:860145: Module/Program/Interface reference not found: SimDTM Exiting due to errors
ありゃ、失敗してしまった。SimDTMというファイルが無いらしい。検索してみると、../../vsrc/SimDTM.v
に存在したので、追加でオプション指定する。
$ vhier rocketchip.BOOMConfig.v ../../vsrc/SimDTM.v -o rocketchip.hier --cells --forest --instance
rocketchip.hier
に階層構成が生成された。
TestHarness TestHarness |--LatencyPipe_1_1 LatencyPipe_1 |--LatencyPipe_2 LatencyPipe |--SimAXIMem_1 SimAXIMem |--SimDTM_1 SimDTM \--dut ExampleTop |--NastiIOTileLinkIOConverter_1 NastiIOTileLinkIOConverter | |--get_id_mapper IdMapper | |--gnt_arb LockingArbiter_2 | |--put_id_mapper IdMapper | \--roq ReorderQueue_2 ...
ずいぶんと長いが、まずはトップモジュールとしてTestHarnessが定義されていた。そこからduvとしてsoc階層が定義されている。プロセッサのコア部はさらに奥だ。
- BOOMCore
- ALUExeUnit_1
- ALUExeUnit_2
- MemExeUnit_1
- bpd_stage
- csr
- dec_brmask_logic
- dec_serializer
- decode_units_0
- decode_units_1
- fetch_unit
- issue_unit
BOOMCore BOOMCore |--ALUExeUnit_1_1 ALUExeUnit_1 | |--fu_units_0 ALUUnit_1 | | \--alu ALU | |--fu_units_1 FDivSqrtUnit | | |--RecFNToRecFN_2_1 RecFNToRecFN_1 | | |--RecFNToRecFN_3_1 RecFNToRecFN_1 | | |--divsqrt DivSqrtRecF64 | | | |--ds DivSqrtRecF64_mulAddZ31 | | | \--mul Mul54 | | |--downvert_d2s RecFNToRecFN_4 | | | \--RoundRawFNToRecFN_1_1 RoundRawFNToRecFN | | \--fdiv_decoder UOPCodeFDivDecoder | \--muldiv MulDivUnit | \--muldiv MulDiv |--ALUExeUnit_2 ALUExeUnit | |--fu_units_0 ALUUnit | | \--alu ALU | |--fu_units_2 FPUUnit | | \--fpu FPU | | |--dfma FPUFMAPipe | | | \--fma MulAddRecFN | | | |--mulAddRecFN_postMul MulAddRecFN_postMul | | | \--mulAddRecFN_preMul MulAddRecFN_preMul | | |--fp_decoder UOPCodeFPUDecoder | | |--fpiu FPToInt | | | |--RecFNToIN_1_1 RecFNToIN_1 | | | |--RecFNToIN_2 RecFNToIN | | | \--dcmp CompareRecFN | | |--fpmu FPToFP | | | |--RecFNToRecFN_1_1 RecFNToRecFN_1 | | | \--RecFNToRecFN_2 RecFNToRecFN | | | \--RoundRawFNToRecFN_1 RoundRawFNToRecFN | | |--ifpu IntToFP | | | |--INToRecFN_1_1 INToRecFN_1 | | | \--INToRecFN_2 INToRecFN | | \--sfma FPUFMAPipe_1 | | \--fma MulAddRecFN_1 | | |--mulAddRecFN_postMul MulAddRecFN_postMul_1 | | \--mulAddRecFN_preMul MulAddRecFN_preMul_1 | \--imul PipelinedMulUnit | \--imul IMul |--MemExeUnit_1 MemExeUnit | |--lsu LoadStoreUnit | | |--dtlb TLB | | \--forwarding_age_logic ForwardingAgeLogic | \--maddrcalc MemAddrCalcUnit |--bpd_stage BranchPredictionStage | |--BranchDecode_1_1 BranchDecode | |--BranchDecode_2 BranchDecode | \--br_predictor GShareBrPredictor | |--brob BranchReorderBuffer | \--counters TwobcCounterTable | |--h_table HTable | | \--hwq Queue_4 | |--p_table PTableBanked | \--pwq Queue_5 |--csr CSRFile |--dec_brmask_logic BranchMaskGenerationLogic |--dec_serializer FetchSerializerNtoM |--decode_units_0 DecodeUnit |--decode_units_1 DecodeUnit_1 |--fetch_unit FetchUnit | \--FetchBuffer Queue_3 |--issue_unit IssueUnitCollasping | |--IssueSlot_10_1 IssueSlot | |--IssueSlot_11_1 IssueSlot | |--IssueSlot_12_1 IssueSlot | |--IssueSlot_13_1 IssueSlot