FPGA開発日記

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

SFENCE.VMAの実行に関する検討 (OoOでページテーブルが正しく更新されるためにはどうしたらいいか)

SFENCE.VMA を適当にCSR命令として実装していたのだがテストを実行すると不具合を見つけた。

SFENCE.VMAはページテーブルのアップデートなどを行った際にそれを適用するためのフェンスで、ページテーブルを更新した後にそれを適用するための命令だ。 この命令と、前のページを更新するストア命令を同じコミットグループに入れることが出来るように実装してしまった。

すると、SFENCE.VMA自体はインオーダで実行するように制御しているものの、ストア命令が実際にストアバッファからL1Dに更新を行うのはそのコミットグループがコミットされた後のため、SFENCE.VMAがコミットした後にストアバッファがL1Dに書き込みを発生させてしまい後続の命令がページテーブルを正しく参照することが出来ない。

これを防ぐためには、SFENCE.VMAは別の通常命令と独立したコミットグループとして扱った方が良さそうだ。 いっそのことCSR系の命令は完全に別の命令と分離した方が良いような気がしてくる。

もう一つは、SFENCE.VMACSRのパイプラインに流すかどうかだ。SFENCE.VMA自体はCSRレジスタを触らないため、LSU側で実行しても良い気がしてきた。 この方がストアバッファを近くで参照することができるし、道理が通っているような気がする。

f:id:msyksphinz:20220103010108p:plain