CVA6はオープンソースのRISC-V CPUコアで、Chipyardにも組み込まれているインオーダパイプラインのCPUだ。 そのL1Dキャッシュの機能について解説されている文書が公開されているので読んでいく。
https://arxiv.org/ftp/arxiv/papers/2202/2202.03749.pdf
- AMO Buffer
アトミック操作はあまり焦点が当たることが無いが、OSを動かすためには必須の機能なのでちゃんと検討する必要がある。AMOバッファの機能は、アトミック操作の機能をバッファリングしておき、外部でアトミック操作が行われている最中にその機能を記憶しておくものだ。
アトミック操作は、Swapやメモリの書き換えなど多岐に渡るが、通常はL1Dが直接実行するのではなく、外部のL2などがその処理を担当することが多い(マルチコア向けの機能なので当然ではある)。 そこで、実際のアトミック操作自体はL2以降の階層で実行するものとして、AMO Bufferはリクエスト自体をL2に渡す機能を持っているようだ。
アトミック操作要求自体はコミットステージから到達する。つまり、この命令の実行が確定した時点でAMO操作がリクエストされ、キャッシュサブシステムにむけて送信がなされる、という訳だ。
- MSHR (Miss Status Holding Register)
MSHRなどとけったいな名前が付いているが、Miss Unitの機能の一部だと考えて良いだろう。L1Dに載っていないキャッシュラインを操作する際にMSHRにそのリクエスト情報が格納される。
MSHRはキャッシュミスが発生した際に起動され、キャッシュデータの読み込みとL1Dへの書き込みのための機能を有している。 CVA6のMSHRでは1つのエントリしか存在しておらず、すなわちL1Dキャッシュミスが発生すると最大でも1つの命令しか外部にリクエストされない。
キャッシュアクセスリクエストに対してAMO BufferやMSHRに同じ物理アドレスの要求が格納されている場合、そのキャッシュアクセスリクエストは先に進むことは出来ない。まあこれはデータの矛盾を避けるための通常の措置だ。 従って、CVAのキャッシュアクセスにおいてストールは以下の条件で発生する。
- ライトミスがMSHR(読み込みミス)と衝突する
読み込みミスのキャッシュウェイアドレスがAMOバッファのインフライト中のアドレスと衝突する
Miss Unit
Miss Unitはキャッシュアクセスにおいてキャッシュミスが発生したラインを外部から読み込む機能を有する。
- 読み込み・書き込みストールを検出する
- 読み込み操作におけるキャッシュラインの置き換えポリシを管理する
- キャッシュフラッシュをお来ぬ
- メインメモリとの通信を行う
- ライトバッファとの通信を行う
- キャッシュの書き込みを行う
Miss Unitのステートマシンは以下のようになっていた。ちょっとこのステートマシンでは分かりにくい...
- Write Buffer
ライトバッファはライトデータを保持するが、複数のライトデータをマージする機能も持ち合わせており、キャッシュメモリとCPU、Miss Unitとの通信を行って書き込みデータを制御する。また、書き込み中途中のライトバッファデータを、後続のロード命令にフォワードする機能も有している。 また、ライトバッファはロードリクエストに対するキャッシュの出力を、CPUに渡すための機能も有している。ライトバッファはキャッシュラインのすべてのワードを書き込むこともできるし、特定のワードを書き込むこともできる。