BOOMの分岐予測について、boom-docs.orgを読みながら解き明かしていこうと思う。
BOOMのRASはMediumBoomConfig
で32エントリ用意されていた。32エントリの内、最初の1エントリはどうも使われていないっぽい。
このエントリに情報が登録されるタイミングだが、
- 入力: f3
ステージでf3
Queueからデキューされるタイミング(バックエンドに発行される瞬間?)
- 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 }
ここでの疑問点としては、関数コール命令が投機的に実行された場合にインデックスがずれてしまうが、これをどのように復帰させるのかということだ。 もう少し小さめのテストを作って確認してみたい。