FPGA開発日記

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

自作CPUの検証環境改変 (Gshareの精度向上)

自作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%程度だ。まあかなり良くなっていると思う。