FPGA開発日記

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

ロードストアバッファによるメモリアクセスの非同期化

メモリアクセスは一般的にCPUの性能向上を阻害しなすくなる部分で、特にストアについてはコミット後に実行するため、これまでの自作プロセッサの実装では

  1. LSUからCMユニットにストア命令が発行されたことを通知する。
  2. ストア命令はコミットレディとなる。

  3. CMユニットが当該ストア命令をコミットする。

  4. LSUに当該ストア命令がコミットされたことが通知される。

LSUはコミット完了を受け取り、メモリアクセスを実行する。 このため、従来の実装でストア命令を連発させると、ストア命令のコミット通知は、先行するストア命令がメモリアクセスを完了するまで通知できなかった。これを解消するためには、LSUが連続してコミット通知を行い、それぞれの命令について状態を保存しておく、バッファ必要になる。これをロードストアバッファと呼んでいる。 ロードストアバッファは、LSU用RSからロードストア命令が発行されると、命令の情報(アドレス、ストアするデータ、アクセスサイズなど)を保存しておく。このバッファはキューを構成し、バッファが満杯になるまでRSからの発行を許す。 同時に、RSから発行された命令がストア命令ならば、即時CMユニットに通知され、ストア操作がレディ状態になる(実際にはここで例外判定などが必要だか)。実際にストア命令がコミットされると、LSUに通知され、キューから情報が取り出されてメモリアクセスが実施される。

ちなみに、ここでLSバッファに命令が格納される順番と、コミットが通知される順番は同一でなければならない。また、LSバッファにロード命令も混在させて格納しているのは、独立して管理するとロードストアのデータ依存が解決できなくなる可能性があるからである(このあたりは簡単化のため、と言ってもいいと思う)。 こうすることで重要なのは、フラッシュが発生すると、それより前にコミット通知された命令は、フラッシュに関わらずアクセス実行して良いということである。従って、フラッシュが発生するとコミット通知された命令以外は全てフラッシュする。

ちなみに、ロード命令の場合はCMユニットに一旦通知する必要は無く、キューから取り出された段階でメモリアクセスを実行する(もちろん、このロード結果は最終的にフラッシュされる可能性があるが)。ロードアクセスが完了すると、その結果をCMユニットに通知する。

※ 自分の理解による実装なので、誤りがあれば訂正お願いします。