FPGA開発日記

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

L1データキャッシュの実装検討(ステートマシン作成)

前回までの実装で分岐予測の機構までは実装できたが、L1データキャッシュの実装がまだできていない。 L1命令キャッシュの実装は完了しているのだが、L1データキャッシュは、さらに以下の実装が必要だろう。

  • データ書き込み処理
  • データ書き込み時の、キャッシュアップデート処理
  • データ書き込み時にキャッシュが既に埋まっていた場合の、キャッシュの追い出し処理

これらをどのようにして実装するか、ということを考えていき、Verilog-HDLに落とし込んでいきたい。

データキャッシュとCPUコアの接続

データキャッシュは、CPUコアに対して以下のように接続されると考えている。

f:id:msyksphinz:20161114085558p:plain

L1データキャッシュを制御するためのステートマシンが存在し、それに対してタグメモリ、データメモリが接続されている。 タグメモリとデータメモリは、CPUコアからのリクエストが発生すると直ぐに読み込みに入り、ヒットすればそのままデータ処理、ミスすればAXIの外部インタフェースにリクエストを出す、ということになりそうだ。

ここでFastAXIと書いているのは、別にそういう規格がある訳ではなく、オリジナルで設計したバス規格で良い、ということだ。

データキャッシュを制御するためのステートマシンの設計

さて、データキャッシュを制御するためのステートマシンだが、読み込み処理と書き込み処理に分けてステートマシンを考えることができそうだ。

データキャッシュへの読み込みリクエスト

データキャッシュへの読み込みについては、リクエストが出された状態で、デファルトでステートマシンがCompareTagステートにいるとする。 ここで直ぐにタグ比較を行い、ヒットすればそのままステートを変化させずにデータを返す。

しかしミスとなれば、当該ラインの置き換えを行わなければならない。この場合には、

  • タグキャッシュの当該ラインがDirty(Writeリクエストによりアップデート済み)ならば、当該ラインを外部メモリにスピルアウトする。
  • タグキャッシュの当該ラインがDirtyではない、あるいはEmptyである場合には、該当するラインを外部メモリからロードする。

という処理が必要になり、ステートマシンは以下のようになるだろう。

f:id:msyksphinz:20161114090212p:plain

まず、ヒットすればそのままデータを読み出す。ミスで、かつ当該タグラインがDirty状態であれば、データを一度AXIバス経由で外に出し(Wait AW_ACK, Wait W_ACKステート)、本当に欲しいデータを読み込んでくる(Wait AR_ACK, Wait R_Ackステート)、という具合だ。 もし当該タグラインがDirtyでなければ、そのまま本当に欲しいデータを読み込んでくれば良い(Wait AR_ACK, Wait R_Ackステート)。

データキャッシュへの書き込みリクエスト

書き込みリクエストも、同様のステートマシンで処理できると考えている。

f:id:msyksphinz:20161114090440p:plain