自作CPUの分岐予測器(Gshare)をちゃんとデバッグしたいため、モデルとの比較環境を構築している。
比較環境に基づいて、Gshareの改良を行っている。ポイントは、複数の命令を同時にフェッチした際のGshareの履歴テーブルの作り方と、投機実行が失敗した際の履歴テーブルの戻し方だ。 モデルの履歴テーブルと、RTLの履歴テーブルを完全に一致させないと検証が難しい。 (本当は投機実行で勝手に更新した履歴テーブルを使って予測しても精度を保てるのかもしれない、しかしその状態での検証が難しいので、とりあえずモデルとRTLの完全一致を目指して構成した)。
ポイントは、投機実行に失敗してフラッシュが発生した際、フラッシュを起こした命令をフェッチしたときの履歴テーブルまで戻すこと。 このために、履歴テーブルの情報を保存しておいてフラッシュ時に復元する。 これにより、かなり履歴テーブルのパタンがモデルと一致するようになった。
もう一つは、とある分岐命令の最初の登場により、フェッチ時に履歴テーブルを更新できなかった場合(BTBに分岐命令の情報が存在していなかった場合)、これはどうしても差分が生じる。しかしこれはループの一番最初にのみ生じるので、ここの実装を正確に合わせる必要はない気がしている。 もうちょっと精度を維持しつつ回路を簡単化できそうな気がする。
$ grep -c SUCC sim_rv64imafdc_standard/dhrystone/gshare.log 33326 $ grep -c MISS sim_rv64imafdc_standard/dhrystone/gshare.log 2144
ヒット率としては93.95%程度だ。まあかなり良くなっていると思う。