FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

TileLinkはどのようにしてコヒーレントを維持するのか(1. TileLinkのコマンド)

f:id:msyksphinz:20181124195957p:plain

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だ。

TileLinkには以下の5つのチャネルが用意されている。 この辺りはAXIなどと似ていると思う。

  • Channel A : キャッシュブロックの取得とブロックの読み込み・書き込み権限の取得に用いる。
  • Channel B : キャッシュブロックのProbe処理(後述)などを行うためのチャネルである。
  • Channel C : キャッシュブロックの操作、開放処理などを行うためのチャネルである。
  • Channel D : キャッシュブロックの取得要求に対してデータを返す。
  • Channel E : エラー応答などを取り扱う。

TL-Cで扱えるプロトコルは以下のようになっている。その際に仕様されるChannelの種類も一緒に示している。 (SiFive TileLink Specification 1.7 より抜粋)

f:id:msyksphinz:20181124193031p:plain

ブロックのパーミッションについて。

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は単純に権限の報告をするだけで、権限の移動はない。
f:id:msyksphinz:20181124194316p:plain

各コマンドで発行される権限の移動メッセージは以下となる。

  • 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)

これらのコマンドにより、データの権限の移動が行われるという訳だ。