TileLinkの3つのレベル
- TL-UL (TileLink Uncached-Lightweight)
- 簡易的なTileLink。Get/Putのアクセスのみをサポート。
- TL-UH (TileLink Uncached-Heavyweight)
- Uncachedだが、TL-ULよりは高性能。Multibeat operations/atomic accesses, Hint operationをサポート。
- TL-C (TileLink Cached)
- Cacheラインの転送をサポート。Channel-B/C/Eをサポート。
TL-UL | TL-UH | TL-C | |
---|---|---|---|
Cache line transfers | ○ | ||
Channels B+C+E | ○ | ||
Multibeat operations | ○ | ○ | |
Atomic accesses | ○ | ○ | |
Hint operations | ○ | ○ | |
Get/Put accesses | ○ | ○ | ○ |
TileLinkの5つのチャネル
TileLinkは以下の5つのチャネルを持っている。
- Channel-A : Master → Slave。 特定アドレスへのリクエスト送信。
- Channel-B : Slave → Master。 特定アドレスへのキャッシュブロック送信
- Channel-C : Master → Slave。 キャッシュブロックからのレスポンス
- Channel-D : Slave → Master。 特定アドレスからのレスポンス
- Channel-E : Master → Slave。 キャッシュブロック転送での最終ハンドシェーク。
各チャネルでの信号説明の際に登場するTypeについてここで紹介しておく。
Type Direction Description | ||
---|---|---|
X | クロック入力・リセット信号 | TileLink Agentへの入力信号 |
C | 制御信号 | 転送制御中には変化しない制御信号群 |
D | データ信号 | 転送毎に変化する |
F | Final信号 | 最終転送の時のみ変化する信号 |
V | Valid信号 | C/D/Fに有効な信号が含まれているときのみ駆動する |
R | Ready信号 | V信号が受け入れられた時に駆動する信号 |
TileLink Uncached Lightweight (TL-UL)
TileLinkの最小構成。以下の2つのオペレーションしか実行することが出来ない。
- Get操作 : メモリからデータを読み込む。
Put操作 : メモリに対してデータを書き込む。書込み操作については、バイト単位での細粒度書き込みが許される。
Channel-A での転送できるメッセージ (()内は実際のOpcode)
- Get(4)
- PutFullData(0)
- PutPartialData(1)
- Channel-D で転送できるメッセージ (()内は実際のOpcode)
- AccessAckData(1)
- AccessAck(0)
Get操作 (Read)
- Master : Getコマンドを発行する
- Slave : Getコマンドを受け取ると、AccessAckDataを返す。
PutFullData操作 / PullPartialData操作 (Write)
- Master : PutFullData / PullPartialData を発行する
- Slave : PutFullData / PullPartialDataコマンドを受け取ると、AccessAckを返す。
TileLink Uncached Heavyweight (TL-UH)
TileLink の2番目に高性能な構成。TL-ULに対して、以下の操作が追加される。
- Atomic操作 : 外部データの読み込み動作と同時に、その値に対していくつかの論理・算術演算を行い、その結果を書き込む。
- Hint操作 : 性能最適化に関する操作ヒントを提供する。
- Burstメッセージ : 物理データバスよりも長いデータを転送するために、複数サイクルでバースと転送を行うことができるようになる。Get/Put/Atomic操作に適用することができる。
各チャネルでの動作概要
- Channel-A での転送できるメッセージ (()内は実際のOpcode)
- Get(4)
- PutFullData(0)
- PutPartialData(1)
- ArithmeticData(2)
- LogicalData(3)
- Intent(5)
- Channel-D で転送できるメッセージ (()内は実際のOpcode)
- AccessAckData(1)
- AccessAck(0)
- HintAck(2)
図. アトミック操作とヒント操作について。
1. アドレス0x0に対して、PrefetchWriteのコマンドによりデータの書き込み
2. アドレス0x0に対して、1を書き込む(Put操作)
2. AtomicAddによりアドレス0x0のスレーブの値に1を書き込みその値を返す (スレーブの値は2となる)
3. AtomicSwapにより書き込みデータ3と、スレーブデータ2を交換。
4. アドレス0x0のスレーブデータをロードする(Get操作)
TL-UHの操作について
Atomic操作
Atomic操作の場合は、MasterからSlaveにリクエストを出し、Slaveがそのリクエストに応じた演算を行ってそのレスポンスを返すという仕組みである。
図. アトミックアクセスにおける動作フロー。マスターからスレーブにArithmeticData / LogicalDataのリクエストが出され、スレーブが処理をしてその結果が返される (TileLink Specification より抜粋)
ArithmeticDataの場合、a_param
に以下の値を設定可能である。
名前 | パラメータ | 効果 |
---|---|---|
MIN | 0 | 2オペランドの符号付値の最小値 |
MAX | 1 | 2オペランドの符号付値の最大値 |
MINU | 2 | 2オペランドの符号なし値の最小値 |
MAXU | 3 | 2オペランドの符号なし値の最小値 |
ADD | 4 | 2オペランドの加算 |
LogicalDataの場合、a_param
に以下の値を設定可能である。
名前 | パラメータ | 効果 |
---|---|---|
XOR | 0 | 論理XOR |
OR | 1 | 論理OR |
AND | 2 | 論理AND |
SWAP | 3 | 2値の交換 |
図. Hint操作における動作フロー。スレーブに対してヒント動作を発行する。
Intent操作
Intent操作といいつつ、要するにPrefetchである。PrefetchRead/Prefetch Writeが設定できる。
名前 | パラメータ | 効果 |
---|---|---|
PrefetchRead | 0 | ターゲットデータの読み込み |
PrefetchWrite | 1 | ターゲットデータへの書き込み |