私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋をやっております。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストのCPUとOS/Applicationまわりの経験・知識共に乏しいので、親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。
#1. Control Flit
前回の"CXLその8"で触れたのですが、CXLには、メモリ空間のデータの読み書きのコマンドとレスポンスで使用されるProtocl Flitの他に、Control Flitがあります。
Control Flitは、ホストCPUとCXLデバイスにおける、CXL.cache/CXL.memのLink Layer間で発生するコマンド・レスポンスで使用されます。
Control Flitには以下の種類があります。
Type Name | 概要 |
---|---|
Retry | 受信したFlitでCRCエラー検出時など、Flitの再送要求時に使用される。 |
LLCRD | Flitを正常に受信できていること通知する。 |
IDE | CXLのセキュリティ機能の制御に使用される。 |
INIT | リンク層の初期化に使用される。 |
LLCRDの用途は、例えばホストCPUが短時間で多数のデータ書き込みコマンドを送り、CXLデバイス側がレスポンスを返すまでに時間が掛かってしまう場合等で使用されます。
前回の"CXLその8"で触れましたが、この場合、ホストCPUはAckが返ってくるまで、CXLデバイスからのRetry要求に備えて、コマンドとデータをバッファに保持しておく必要があります。、CXLデバイス側がレスポンスを返すまでに時間が掛かってしまう場合、ホストCPU側のバッファが溢れることを防ぐため、LLCRDでAckを通知します。
Control Flitでは、Slot0のみが使用され、Slot1からSlot3はReservedの扱いとなっています。
#2. Flex Bus Physical Layer
前回の"CXLその8"と今回でCXL.cache/CXL.memで扱われるFlitについて触れましたが、下図に示す通り物理層に当たるFlex Bus Physical Layerでは、PCIe/CXL.io経由で来るパケット(TLP/DLP)と、CXL.cache/CXL.mem経由で来るFlitが扱われます。
TLP/DLPについては、PCIeの仕様に従いますので、この記事では詳細には触れません。
Flex Busで流れるデータのレイアウトの例を下図に示します。
図の例は、ホストCPUとCXLデバイスを16 Laneで接続し、TLP/DLPとFlitが混在している状態のレイアウトの例です。
Flex Busでは、CXL.io/PCIe経由で来るTLP/DLPは、64B単位で分割され、先頭にProtocol ID(2B)とReserved(2B)が付加されます。CXL.cache/CXL.mem経由で来るFlit(64B+CRC2B)には、先頭にProtocol ID(2B)が付加されます。
CXL.io/PCIeとCXL.cache/CXL.memとの区別はProtocol IDで行われます。
図中の緑色箇所はTLP/DLPを示し、桃色箇所はFlitを示しています。
次回は、CXL.ioでやり取りされるコマンドについて書こうと思っています。