RISC-Vの多くの実装で採用されているTileLinkには、大きく分けて3つのグレードが存在している。
- TL-UL (TileLink Uncached Lightweight)
- TL-UH (TileLink Uncached Heavyweight)
- TL-C (TileLink Cached)
この中で、最も上位のTL-Cはマスター間でのコヒーレントを維持することができる構成になっている。 TileLinkの内部でどのようなプロトコルが動作してコヒーレントを維持するのか、調査した。
参考にしているのは、SiFiveが公開しているTileLink Spefication 1.7だ。
- SiFive TileLink Specification 1.7 https://static.dev.sifive.com/docs/tilelink/tilelink-spec-1.7-draft.pdf
TileLinkには以下の5つのチャネルが用意されている。 この辺りはAXIなどと似ていると思う。
- Channel A : キャッシュブロックの取得とブロックの読み込み・書き込み権限の取得に用いる。
- Channel B : キャッシュブロックのProbe処理(後述)などを行うためのチャネルである。
- Channel C : キャッシュブロックの操作、開放処理などを行うためのチャネルである。
- Channel D : キャッシュブロックの取得要求に対してデータを返す。
- Channel E : エラー応答などを取り扱う。
TL-Cで扱えるプロトコルは以下のようになっている。その際に仕様されるChannelの種類も一緒に示している。 (SiFive TileLink Specification 1.7 より抜粋)
ブロックのパーミッションについて。
TL-Cにおいて扱われるブロックには、パーミッションが存在している。 それぞれ、そのブロックは持っているノードがどのような状態なのか、どのような操作が許されるのかを示している。
- Nothing : 現在、データのコピーをキャッシュしていない。
- Trunk : キャッシュされたコピーを持っている。書き込みによりデータがアップデートする権限を持っている。データがアップデートされている可能性がある。
- Hint : メモリアクセスのシリアライズポイントとして機能する。キャッシュされたコピーを持っており、そのコピーに対してRWする権限を持っている。
- Branch : 読み取り専用のキャッシュコピーを持っているノード。
これに対して、TL-Cのコマンドで以下のような操作を実施する。
- Prune:権限をダウングレードする。前の権限と現在の権限を記録する。
- Grow : 権限をアップグレードする。前の権限と現在の権限を記録する。
- Report : 現在のアクセス権限を報告する。
- Cap : 元のアクセス許可の内容に関係なく、アクセス許可の変更を行う。
以下も資料から抜粋。コンテンツに対して、Cap, Grow, Prune, Reportでどのように権限が変更されるか。
- Capは前の権限に依存しないので、問答無用でT(Trunk), B(Branch), N(None)へ変更される。
- Growは前の権限に依存し、常に上位の権限に移動する(None to Branch, None to Trunk, Branch to Trunk)
- Pruneは前の権限に依存し、常に下位の権限に移動する(Trunk to Branch, Trunk to None, Branch to None)
- Reportは単純に権限の報告をするだけで、権限の移動はない。
各コマンドで発行される権限の移動メッセージは以下となる。
- Acquire(データブロックの取得) : Grow(NtoB, NtoT, BtoT)
- Probe(データブロックの権限の変更) : Cap(toN, toB, toT)
- ProbeAck(Probeの応答) : Shrink or Report(TtoB, TtoN, BtoN, TtoT, BtoB, NtoN)
- ProbeAckData(Probeの応答) : Shrink or Report(TtoB, TtoN, BtoN, TtoT, BtoB, NtoN)
- Grant (データの応答) : Cap(toN, toB, toT)
- GrantData(データの応答) : Cap(toN, toB, toT)
- Release(権限の解放) : Shrink or Report(TtoB, TtoN, BtoN, TtoT, BtoB, NtoN)
- ReleaseData(権限とデータの解放) : Shrink or Report(TtoB, TtoN, BtoN, TtoT, BtoB, NtoN)
これらのコマンドにより、データの権限の移動が行われるという訳だ。