FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-VプロセッサBOOMを分解 (vhierによる内部構造把握)

f:id:msyksphinz:20161101020618p:plain

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ファイルをコンパイルすることなく、内部構成を把握することができる。

msyksphinz.hatenablog.com

今回の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