私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋です。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストのCPUとOS/Applicationまわりの経験・知識共に乏しいので、親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。
1. CXL.memのコマンドとレスポンス
CXL.memのプロトコルでは、ホストCPUからCXLデバイスのメモリ空間にデータの読み書きする際に実行されるコマンドは、以下の2種類のいずれかのフォーマットに従って送信されます。
-
Request (Req)
データの読み出し等、ホストCPUからデータの転送が不要であるコマンドの実行を指示するためのフォーマット。 -
Requeset with Data (RwD)
データの書き込み等、ホストCPUからデータの転送が必要であるコマンドの実行を指示するためのフォーマット。
コマンドに対するレスポンスは、以下の2種類のいずれかのフォーマットで返されます。
-
Data Response (DRS)
Reqに対するレスポンス。Reqの実行結果として、CXLデバイスからデータの転送が伴う場合に返される。DRSは、データのヘッダとして転送され、以降のSlotにData Chunkが入る。 -
No Data Response (NDR)
Req、もしくはRwDに対するレスポンス。Req、もしくはRwDの実行結果として、CXLデバイスからデータの転送が伴わない場合に返される。
2. Request (Req)
Reqのデータフォーマットを下図に示します。
それぞれのパラメータ下表に示します。
Field | Bits | 概要 |
---|---|---|
Valid | 1 | リクエストが有効であるか無効であるか示す。 0b: 無効なリクエスト 1b: 有効なリクエスト |
Memory Operation | 4 | リクエストのオペレーションコード。ReqでCXL Type3に実行指示が可能なリクエストは以下の通り。 0000: MemInv 0001: MemRd 0010: MemRdData 1000: MemSpecRd 1001: MemInvNT |
Snoop Type | 3 | スヌープタイプ。 000: No-Op 001: リクエスタがデータのShared Copyを要求している示す 010: リクエスタがデータをキャッシュしないことを示す 011: リクエスタがデータのExclusive Copyを要求していることを示す |
Meta Data Field | 2 | メタステートの更新の有無を指示する。 00: メタステートをMeta Data Valueで指定する値に更新 (MS0) 11: Meta Data Valueの値を無視 (No-Op) |
Meta Data Value | 2 | キャッシュラインのメタステートの値。MESIプロトコルに従う。 00: Invalid 10: Any (Exclusive or Modified) 11: Shared |
Tag | 16 | リクエストの発行元(リクエスター)を示す |
Address [51:5] | 47 | リクエストを実行するメモリ空間のアドレス。Address[5]は将来の用途のための予約であるため、アドレスは64Bアライン。 |
Traffic Class | 2 | QoSに関連するパラメータに使用される(将来の用途のための予約)。 |
LD-ID | 4 | Logical Device Identifier。MLDをサポートするデバイスで使用される。Requestを実行するLogical DeviceのIDを示す。 |
Reserved | 6 | Reserved |
3. Request with Data (RwD)
RwDのデータフォーマットを下図に示します。
それぞれのパラメータ下表に示します。
Field | Bits | 概要 |
---|---|---|
Valid | 1 | リクエストが有効であるか無効であるか示す。 0b: 無効なリクエスト 1b: 有効なリクエスト |
Memory Operation | 4 | リクエストのオペレーションコード。RwDでCXL Type3に実行指示が可能なリクエストは以下の通り。 0001: MemWr 0010: MemWrPtl |
Snoop Type | 3 | スヌープタイプ。 000: No-Op 001: リクエスタがデータのShared Copyを要求している示す 010: リクエスタがデータをキャッシュしないことを示す 011: リクエスタがデータのExclusive Copyを要求していることを示す |
Meta Data Field | 2 | メタステートの更新の有無を指示する。 00: メタステートをMeta Data Valueで指定する値に更新 (MS0) 11: Meta Data Valueの値を無視 (No-Op) |
Meta Data Value | 2 | キャッシュラインのメタステートの値。MESIプロトコルに従う。 00: Invalid 10: Any (Exclusive or Modified) 11: Shared |
Tag | 16 | リクエストの発行元(リクエスター)を示す |
Address [51:6] | 46 | リクエストを実行するメモリ空間のアドレス。アドレスは64Bアライン。 |
Poison | 1 | リクエストで送信するデータがPoisonの状態であることを示す。 0: Poisonでない 1: Poison |
Traffic Class | 2 | QoSに関連するパラメータに使用される(将来の用途のための予約)。 |
LD-ID | 4 | Logical Device Identifier。MLDをサポートするデバイスで使用される。Requestを実行するLogical DeviceのIDを示す。 |
Reserved | 6 | Reserved |
ReqとRwDのフォーマットの違いは、Addressのビット数と、RwDにPoisonのパラメータが存在することです。Poisonは、何らかの誤りを含むデータを、ホストCPUとCXLデバイス間で転送する際に付けられるフラグです。
CXLデバイスは、Poisonであるデータを受信した場合、受信したデータがPoisonであることを保持しておく必要があります。Poisonの詳細は、エラーに関して書く際に触れたいと思います。
4. No Data Response (NDR)
NDRのデータフォーマットを下図に示します。
パラメータ下表に示します。
Field | Bits | 概要 |
---|---|---|
Valid | 1 | リクエストが有効であるか無効であるか示す。 0b: 無効なリクエスト 1b: 有効なリクエスト |
Memory Operation | 4 | リクエストのオペレーションコード。RwDでCXL Type3に実行指示が可能なリクエストは以下の通り。 0001: MemWr 0010: MemWrPtl |
Meta Data Field | 2 | メタステートの更新の有無を指示する。 00: メタステートをMeta Data Valueで指定する値に更新 (MS0) 11: Meta Data Valueの値を無視 (No-Op) |
Meta Data Value | 2 | キャッシュラインのメタステートの値。MESIプロトコルに従う。 00: Invalid 10: Any (Exclusive or Modified) 11: Shared |
Tag | 16 | リクエストの発行元(リクエスター)を示す |
LD-ID | 4 | Logical Device Identifier。MLDをサポートするデバイスで使用される。Requestを実行するLogical DeviceのIDを示す。 |
Device Load | 2 | デバイスのQoSを示す。 |
5. Data Response (DRS)
パラメータ下表に示します。
Field | Bits | 概要 |
---|---|---|
Valid | 1 | リクエストが有効であるか無効であるか示す。 0b: 無効なリクエスト 1b: 有効なリクエスト |
Memory Operation | 4 | リクエストのオペレーションコード。RwDでCXL Type3に実行指示が可能なリクエストは以下の通り。 0001: MemWr 0010: MemWrPtl |
Meta Data Field | 2 | メタステートの更新の有無を指示する。 00: メタステートをMeta Data Valueで指定する値に更新 (MS0) 11: Meta Data Valueの値を無視 (No-Op) |
Meta Data Value | 2 | キャッシュラインのメタステートの値。MESIプロトコルに従う。 00: Invalid 10: Any (Exclusive or Modified) 11: Shared |
Tag | 16 | リクエストの発行元(リクエスター)を示す |
LD-ID | 4 | Logical Device Identifier。MLDをサポートするデバイスで使用される。Requestを実行するLogical DeviceのIDを示す。 |
Device Load | 2 | デバイスのQoSを示す。 |
NDRとDRSのフォーマットの違いは、Reservedとして確保されているサイズの違いはありますが、DRSにPoisonのパラメータが存在することです。このPoisonは、RwDのPoison同様、ホストCPUとCXLデバイス間で転送されるデータに誤りが含まれることを示します。
Poisonは、CXLデバイスのメモリから読み出されたデータに含まれる誤りが、CXLデバイス内部で訂正し切れなかった場合にも用いられます。
CXLデバイスは、Poisonであるデータを送信した場合も、Poisonでデータを送信したことを保持しておく必要があります。
6.CXL.memのコマンドとレスポンスの対応
Req/RwDとDRS/NDRとの対応関係を以下の表に示します。
仕様上発生しないコマンドおよびレスポンスのパラメータの組み合わせは表から除外してあります。
上記に挙げたReq/RwD/DRS/NDRが、前回の記事(CXLその6)で示した、Header Slot(12B)/Generic Slot(16B)に埋め込まれて転送されます。それぞれのSlotに埋め込まれるReq/RwD/DRS/NDRは1つとは限りません。複数個のReq/RwD/DRS/NDRが組み合わされてSlotに埋め込まれ、Flit単位で転送されます。
次回以降もCXLの仕様の詳細について書いていきます。