FPGA開発日記

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

BOOMの分岐予測機構について調べる (2. BOOMのRAS実装を読む)

BOOMの分岐予測について、boom-docs.orgを読みながら解き明かしていこうと思う。

docs.boom-core.org

BOOMのRASはMediumBoomConfigで32エントリ用意されていた。32エントリの内、最初の1エントリはどうも使われていないっぽい。

このエントリに情報が登録されるタイミングだが、 - 入力: f3ステージでf3Queueからデキューされるタイミング(バックエンドに発行される瞬間?) - call命令(つまりf3_bundleにおいてis_callが有効な時)が有効な時 - 出力: f3ステージでf3 Queueからエンキューされるタイミング - ret命令が有効な時

  ras.io.write_valid := false.B
  ras.io.write_addr  := f3_aligned_pc + (f3_fetch_bundle.cfi_idx.bits << 1) + Mux(
    f3_fetch_bundle.cfi_npc_plus4, 4.U, 2.U)
  ras.io.write_idx   := WrapInc(f3_fetch_bundle.ghist.ras_idx, nRasEntries)
  // RAS takes a cycle to read
  val ras_read_idx = RegInit(0.U(log2Ceil(nRasEntries).W))
  ras.io.read_idx := ras_read_idx
  when (f3.io.enq.fire()) {
    ras_read_idx := f3.io.enq.bits.ghist.ras_idx
    ras.io.read_idx := f3.io.enq.bits.ghist.ras_idx
  }

ここでの疑問点としては、関数コール命令が投機的に実行された場合にインデックスがずれてしまうが、これをどのように復帰させるのかということだ。 もう少し小さめのテストを作って確認してみたい。