FPGA開発日記

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

L1キャッシュを制御するためのステートマシン調査

L1キャッシュは、具体的にはどのようにして制御をしたらいいのだろう? まずはサンプル回路を使って、制御シーケンスを調査してみよう。

対象とするのは、パタヘネで解説してあるL1キャッシュのシーケンサだ。

コンピュータの構成と設計 第5版 上

コンピュータの構成と設計 第5版 上

コンピュータの構成と設計 第5版 下

コンピュータの構成と設計 第5版 下

  • Advanced Material: Implementing Cache Controllers

https://www.engr.colostate.edu/~sudeep/teaching/reading_452/CD5.9-P374493.pdf

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

ステートマシンをイラストとして起こしてみると、以下のようになる。

f:id:msyksphinz:20161014012609p:plain

まずは初期状態から、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に戻ってくる。