例えば、4CPU + L2キャッシュが存在している状態をまずは考えよう。まずは誰もキャッシュをロードしていない状態で、CPUコア0がキャッシュをロードするとどうなるか。
※以下の説明はChatGPTにかなり頼っているところがある。間違っているところもあるかもしれない...

ACEプロトコル
- CPU0 が、まだ自身のL1キャッシュにデータが存在しないアドレス X を「Read」しようとする。
- CPU0のキャッシュコントローラは、ACEのマスタインターフェイスから
ARチャネル(読み取りアドレス) を使い、L2へ読み取り要求を出す。ここで、- ARSNOOP が
ReadClean相当(Shared状態を取得したい読み取り)の場合を想定。
- ARSNOOP が
- L2キャッシュ は、そのアドレス X を参照する。
- もしL2内にデータがあるなら、そのデータを返す。
- もしL2にも無い(= メモリからのフェッチが必要)なら、L2がメモリへアクセスしてデータを取得する。
- 他のコア (CPU1~CPU3) は、いずれも X のキャッシュラインを保持していない (Invalid)。
- L2(またはインターコネクト)はスヌープ要求(ACチャネル)を出す必要がない、もしくは「Invalidばかり」だと分かっているのでスヌープ応答はすべて "No data"。
- 最終的にCPU0 は L2からデータを受け取り、L1キャッシュに
Shared状態で保持する(Write意図がない場合)。 - L2 もデータをキャッシュしている場合は
Cleanな状態(多くは“Shared”相当)で保持する。

CHIプロトコル
- CPU0 がアドレス X を読み取りたい。自身のキャッシュには存在せず、Invalid。
- CPU0は REQチャネル を介して、L2 (Home Node) に「Read」要求(たとえば
ReadShared)を送る。 - L2はディレクタリ(または簡易タグ)をチェックし、X をどのコアも保持していないことを確認。
- → 他のコア(CPU1~3)が保持していない = スヌープ不要。よって SNPチャネル は発行されないか、もしくは「空振り」の形でSNPを発行して“Invalid”応答を得るだけ。
- L2が X のデータをキャッシュしていれば、そのままDATチャネルで CPU0 へ返却。
- なければ外部メモリへフェッチしてから、DATチャネルを使って CPU0 に渡す。
- CPU0 は RSPチャネル で「OK + データ準備完了」の応答を受け取り、最終的にデータを受領。
- 最終的にCPU0 は、X を
Shared(orClean) 状態で保持。L2も同じくCleanなコピーを持つ。

TileLinkプロトコル
- CPU0 がアドレス X を読み取りたい。どのコアも X をキャッシュしていない(= Invalid)。
- CPU0は、Aチャネル の “Acquire” メッセージを発行して Manager (L2) に「読み取り用の権限を獲得したい」と要求。
- L2は、他のクライアント(CPU1~3)に対して “Bチャネル(Probe)” を発行するかどうかを判断。
- 今回は他コアがInvalidなので Probe不要、あるいは Probeを送っても“Nothing to do”の応答になる。
- L2がメモリからデータを読み込むか、既に保持していれば、Dチャネル の “Grant” で CPU0 にデータを返す。
- この時点で CPU0 は “GrantData” を受け取り、キャッシュラインを“Valid”な状態として保持できる。
- Eチャネル(Finish)は、Grantを受領後にCPU0が送ってトランザクション終了を通知する(実装依存で省略できる場合もある)。
- 状態としては、CPU0がラインXを “Tip (Shared)” 相当の状態で保持し、L2も Managerとして
Validコピーを持つ。

さらに、CPU1が同じキャッシュラインXを読み込もうとしたときはどうなるかをチェックしたものはこちら。