前回までの実装で分岐予測の機構までは実装できたが、L1データキャッシュの実装がまだできていない。 L1命令キャッシュの実装は完了しているのだが、L1データキャッシュは、さらに以下の実装が必要だろう。
- データ書き込み処理
- データ書き込み時の、キャッシュアップデート処理
- データ書き込み時にキャッシュが既に埋まっていた場合の、キャッシュの追い出し処理
これらをどのようにして実装するか、ということを考えていき、Verilog-HDLに落とし込んでいきたい。
データキャッシュとCPUコアの接続
データキャッシュは、CPUコアに対して以下のように接続されると考えている。
L1データキャッシュを制御するためのステートマシンが存在し、それに対してタグメモリ、データメモリが接続されている。 タグメモリとデータメモリは、CPUコアからのリクエストが発生すると直ぐに読み込みに入り、ヒットすればそのままデータ処理、ミスすればAXIの外部インタフェースにリクエストを出す、ということになりそうだ。
ここでFastAXIと書いているのは、別にそういう規格がある訳ではなく、オリジナルで設計したバス規格で良い、ということだ。
データキャッシュを制御するためのステートマシンの設計
さて、データキャッシュを制御するためのステートマシンだが、読み込み処理と書き込み処理に分けてステートマシンを考えることができそうだ。
データキャッシュへの読み込みリクエスト
データキャッシュへの読み込みについては、リクエストが出された状態で、デファルトでステートマシンがCompareTagステートにいるとする。 ここで直ぐにタグ比較を行い、ヒットすればそのままステートを変化させずにデータを返す。
しかしミスとなれば、当該ラインの置き換えを行わなければならない。この場合には、
- タグキャッシュの当該ラインがDirty(Writeリクエストによりアップデート済み)ならば、当該ラインを外部メモリにスピルアウトする。
- タグキャッシュの当該ラインがDirtyではない、あるいはEmptyである場合には、該当するラインを外部メモリからロードする。
という処理が必要になり、ステートマシンは以下のようになるだろう。
まず、ヒットすればそのままデータを読み出す。ミスで、かつ当該タグラインがDirty状態であれば、データを一度AXIバス経由で外に出し(Wait AW_ACK, Wait W_ACKステート)、本当に欲しいデータを読み込んでくる(Wait AR_ACK, Wait R_Ackステート)、という具合だ。 もし当該タグラインがDirtyでなければ、そのまま本当に欲しいデータを読み込んでくれば良い(Wait AR_ACK, Wait R_Ackステート)。
データキャッシュへの書き込みリクエスト
書き込みリクエストも、同様のステートマシンで処理できると考えている。