L1キャッシュは、具体的にはどのようにして制御をしたらいいのだろう? まずはサンプル回路を使って、制御シーケンスを調査してみよう。
対象とするのは、パタヘネで解説してあるL1キャッシュのシーケンサだ。
- 作者: ジョン・L.ヘネシー,デイビッド・A.パターソン,成田光彰
- 出版社/メーカー: 日経BP社
- 発売日: 2014/12/06
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- 作者: デイビッド・A・パターソン,ジョン・L・ヘネシー,成田光彰
- 出版社/メーカー: 日経BP社
- 発売日: 2014/12/06
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- Advanced Material: Implementing Cache Controllers
https://www.engr.colostate.edu/~sudeep/teaching/reading_452/CD5.9-P374493.pdf
キャッシュを制御するためのステートマシン
ステートマシンをイラストとして起こしてみると、以下のようになる。
まずは初期状態から、CPUからのリクエストを待っている。CPUからのリクエストが発生すると、ステートマシンはCompareTagに移り、読み込み、書き込みに関わらず、タグとのヒットチェックを実行する。
ヒットした場合は、外部メモリへのアクセスは発生しない(Tag Hit
)。さらに書き込み処理の場合、当該キャッシュラインのデータを上書きして、再度初期状態に戻る。
ミスした場合は、以下の2つの条件に分かれる。
- 当該タグにデータが格納されており、Dirtyビットが立っている場合(
tag.valid==1 && tag.dirty==1
) - 当該タグのキャッシュラインにデータが格納されていない、あるいはDirtyビットが立っていない場合(
tag.valid==0 || tag.dirty==0
)
Dirtyビットが立っている場合、まずはメモリへ当該キャッシュラインをストアする必要がある。このため、まずはWriteBackステートに移動する。
WriteBackステートにて、キャッシュラインのストアが完了すると、次に本当に欲しいキャッシュラインのリードリクエストを発行する (WriteBack
ステートからAllocate
ステートへ)
キャッシュラインのリードが完了すると、再びCompare Tag
ステートマシンに戻ってくる。Compare Tag
ステートでは、必ずキャッシュラインはヒットするため、無事にCPUにデータを返して、Init
に戻ってくる。
Dirtyビットが立っていない場合は簡単だ。キャッシュラインのストアが必要無いため、Allocate
ステートに移って、リードリクエストを発生させる。
リードリクエストにより当該キャッシュラインのデータを取得すると、同様にCompare Tag
に戻ってきてキャッシュラインをヒットさせ、CPUにデータを返す。もしくは、CPUからの書き込みデータをキャッシュラインに上書きして、Dirtyビットを1に設定し、Init
に戻ってくる。