Ch 9: Flit Format — 68B vs 256B vs Latency-Optimized
#한 줄 요약
“Flit은 CXL 링크 위 고정 크기 전송 단위이며, 세 가지 형식이 있습니다.” — 68B flit (CXL 1.1·2.0, 32 GT/s까지), Standard 256B flit (3.0+, PCIe Flit mode), Latency-Optimized 256B flit (3.0+, 128 B 반쪽마다 CRC). CXL 4.0은 128 GT/s에서도 3.x의 256B flit 형식과 FEC·CRC를 그대로 씁니다.
Ch 8에서 CXL.mem 메시지의 의미를 봤습니다. 이 장은 그 메시지가 실제로 링크 위를 어떻게 흐르는지 — flit입니다.
#Flit이란
*Flit (Flow Control Unit)*은 CXL 링크 위 데이터 전송 단위입니다.
| 항목 | 의미 |
|---|---|
| 크기 | 고정 (68 B 또는 256 B) |
| 내용 | 헤더 + message slot + CRC (+ 256B는 FEC) |
| 한 flit의 프로토콜 | 한 flit은 CXL.io 또는 CXL.cachemem 중 하나만 싣습니다 |
*패킷 (packet)*과 다른 개념. PCIe TLP는 가변 크기이지만 flit은 고정 크기입니다. PCIe 6.0에서 PCIe 자체도 Flit mode를 도입했고, CXL 256B flit은 그 위에서 동작합니다.
#Flit 형식 한눈에
| 형식 | 크기 | 도입 | 비고 |
|---|---|---|---|
| 68B flit | 68 B | CXL 1.1 | 32 GT/s까지 |
| Standard 256B flit | 256 B | CXL 3.0 | PCIe Flit mode에서 사용. 8 GT/s 이상 |
| Latency-Optimized 256B flit | 256 B | CXL 3.0 | 선택 기능. 128 B 반쪽마다 CRC |
CXL 4.0 웨비나(2025-12)는 128 GT/s에서도 PCIe 7.0 FEC·CRC가 CXL 3.0과 같고, Standard 256B와 Latency-Optimized 256B를 함께 쓴다고 정리합니다. 4.0 발표문은 3.x·2.0·1.1·1.0과의 하위 호환을 유지한다고 밝힙니다.
#68B Flit
CXL 1.1·2.0의 기본 형식입니다(CXL 3.1 §4.2).
| 부분 | 크기 |
|---|---|
| Protocol ID | 2 B — 이 flit이 CXL.io인지 CXL.cachemem인지 |
| Slot | 16 B × 4 |
| CRC | 2 B |
| 합계 | 68 B (Protocol ID 뒤 528 bit가 link layer flit) |
PCIe 5.0까지의 NRZ 링크에는 FEC가 없습니다. 오류는 CRC로 잡고, CXL.cachemem은 *LLR (Link Layer Retry)*로 재전송합니다.
#Standard 256B Flit
CXL 3.0에서 추가된 형식입니다. PCIe Flit mode가 켜지면 256B flit mode가 함께 정해지고, 8 GT/s 이상에서 씁니다(§6.4.1.3.1). 64 GT/s 이상은 256B flit만 됩니다.
CXL.cachemem용 Standard 256B flit(§4.3.2, Figure 4-41):
| 부분 | 크기 | 담당 |
|---|---|---|
| HDR | 2 B | Physical Layer |
| Slot 0 (H-Slot) | 14 B | Link Layer |
| Slot 1~14 (G-Slot) | 16 B × 14 | Link Layer |
| CRD | 2 B | Link Layer — credit 반환 |
| CRC | 8 B | Physical Layer |
| FEC | 6 B | Physical Layer — 3-way interleaved ECC (PCIe Base Spec 정의) |
PCIe 6.0의 PAM4 링크는 BER이 1E-6 수준이라(§6.4.1.3.3) FEC가 필요합니다. 256B flit에서 retry buffer는 Physical Layer에 있습니다(§5.1.2.3). 68B의 LLR과 다릅니다.
HDR의 Flit Type 2 bit가 flit 종류를 가릅니다: NOP, CXL.io, CXL.cachemem, ALMP(§6.2.3.1.1.1).
#Latency-Optimized 256B Flit
256B flit을 128 B 반쪽 둘로 나누고, 반쪽마다 CRC를 붙인 형식입니다(§6.2.3.1.2).
| 반쪽 | 구성 |
|---|---|
| 짝수 반쪽 | Flit Header 2 B + Flit Data 120 B + CRC 6 B |
| 홀수 반쪽 | Flit Data 116 B + FEC 6 B (256 B 전체 보호) + CRC 6 B |
얻는 것은 flit accumulation latency 감소입니다. 짝수 반쪽이 CRC를 통과하면 홀수 반쪽을 기다리지 않고, FEC 디코딩도 건너뛰고 바로 소비합니다. spec은 x4 링크·64 GT/s에서 왕복 accumulation latency가 8 ns라고 예를 듭니다. 링크 폭이 좁을수록 이득이 큽니다.
| 상황 | 처리 |
|---|---|
| 두 반쪽 CRC 통과 | FEC 없이 바로 소비 |
| 한 반쪽 CRC 실패 | 256 B 전체에 FEC 디코딩·정정 후 다시 CRC |
| 정정 후에도 실패 | 256 B flit 전체를 retry |
Standard와 Latency-Optimized 중 무엇을 쓸지는 alternate protocol negotiation에서 한 번 정합니다. 동적 전환은 지원하지 않습니다(§6.2.3.1.2).
#Flit에 메시지 싣기
68B flit은 slot 4개, Standard 256B CXL.cachemem flit은 H-Slot 1개 + G-Slot 14개입니다. CXL.cache와 CXL.mem 메시지는 같은 cachemem flit의 slot에 섞여 들어갈 수 있습니다. CXL.io는 별도 flit으로 갑니다.
예 (Standard 256B cachemem flit, 개념적):
| 위치 | 내용 |
|---|---|
| Slot 0 | CXL.mem M2S Req (MemRd) |
| Slot 1 | CXL.cache D2H Req (RdShared) |
| Slot 2~5 | CXL.mem S2M DRS (data) |
| CRD | 받은 메시지에 대한 credit 반환 |
| 끝 | CRC + FEC |
보낼 메시지가 없을 때도 CXL.cachemem은 Empty flit으로 ARB/MUX 경로를 잡아 둘 수 있습니다. 뒤늦게 도착한 메시지를 같은 flit의 뒷 slot에 실어, 다음 256 B 경계까지 기다리지 않게 하는 장치입니다(§6.2.3.1.1.1).
#Receiver 처리
Standard 256B flit 기준:
- 256 B를 다 받음
- FEC 디코딩·정정
- CRC 검증 — 실패면 retry 요청
- HDR의 Flit Type으로 CXL.io / CXL.cachemem / ALMP 분배
- cachemem flit이면 slot의 메시지를 CXL.cache·CXL.mem으로 나눔
Latency-Optimized는 2번을 CRC 실패 때만 합니다.
#세대가 다른 장치끼리
서로 다른 세대의 host·device가 붙으면 둘 다 지원하는 쪽으로 맞춥니다.
| Host | Device | 결과 |
|---|---|---|
| CXL 4.0 | CXL 4.0 | 256B, 최대 128 GT/s |
| CXL 4.0 | CXL 3.x | 256B, 최대 64 GT/s |
| CXL 4.0 | CXL 2.0 | 68B, 최대 32 GT/s |
| CXL 2.0 | CXL 4.0 | 68B, 최대 32 GT/s |
낮은 쪽에 맞춰 동작하고, 상위 세대 기능은 쓰지 않습니다.
#Credit-based Flow Control
CXL.cachemem은 채널마다 메시지 단위 credit을 씁니다. 받는 쪽이 버퍼를 비우면 credit을 돌려주고, 보내는 쪽은 credit이 있을 때만 그 채널 메시지를 보냅니다.
| 형식 | Credit 반환 위치 |
|---|---|
| 68B flit | flit 헤더의 credit 필드, 또는 LLCRD control flit (§4.2) |
| 256B flit | flit 끝의 CRD 2 B (§4.3.5) |
CXL.io는 PCIe 방식 그대로 DLLP로 flow control credit을 주고받습니다.
#자주 하는 실수
#“256B flit은 무조건 빠르다”
256B flit은 64 GT/s 이상으로 대역폭을 올립니다. 하지만 Standard 256B는 flit 전체를 받아 FEC를 거쳐야 소비할 수 있어 accumulation latency가 생깁니다. 이걸 줄이려고 Latency-Optimized 형식이 따로 있습니다.
#“Standard·Latency-Optimized는 트래픽 따라 오간다”
아닙니다. 링크 협상 때 한 번 정하고, 동적 전환은 없습니다(§6.2.3.1.2).
#“FEC가 모든 error를 고친다”
FEC가 고칠 수 있는 범위를 넘는 오류는 CRC에 걸리고, flit 단위 retry로 복구합니다. 256B flit에서 retry는 Physical Layer가 맡습니다.
#“68B flit은 CXL 4.0에서 사라졌다”
아닙니다. CXL 4.0 발표문은 1.0·1.1·2.0과의 하위 호환을 유지한다고 밝힙니다. 1.1·2.0 디바이스와는 68B flit으로 붙습니다.
#정리
- Flit은 CXL 링크의 고정 크기 전송 단위. 한 flit은 CXL.io나 CXL.cachemem 하나만 싣습니다.
- 68B flit: Protocol ID 2 B + slot 16 B × 4 + CRC 2 B. FEC 없음, LLR로 retry.
- Standard 256B flit (3.0+): HDR 2 B + slot 15개 + CRD 2 B + CRC 8 B + FEC 6 B. retry는 Physical Layer.
- Latency-Optimized 256B flit: 128 B 반쪽마다 CRC. 통과하면 FEC 없이 바로 소비. 협상 때 한 번 선택.
- CXL 4.0: 128 GT/s에서도 3.x의 256B 형식과 FEC·CRC 유지.
- Credit은 채널·메시지 단위. 68B는 헤더·LLCRD, 256B는 CRD 필드로 반환.
#다음 편
Ch 10: ARB/MUX — 세 프로토콜의 PHY 다중화에서 CXL.io·CXL.cache·CXL.mem 세 프로토콜이 같은 PHY로 어떻게 multiplexed되는지를 본격적으로 분해합니다.
#관련 항목
- Ch 5: CXL 4.0의 핵심 새 기능
- Ch 8: CXL.mem
- Ch 10: ARB/MUX
- HBM·GDDR 심화 Ch 4: GDDR6·GDDR6X·GDDR7 — PAM4·PAM3 signaling
#시리즈 자료 출처 안내
이 글은 CXL 3.1·1.1 spec, CXL 4.0 발표문·웨비나를 근거로 합니다. 시리즈 전체의 자료 정책은 Ch 1에 있습니다.
CXL 4.0 Internals · 9 of 15
- 1 Ch 1: CXL의 자리와 진화 — 1.1에서 4.0까지
- 2 Ch 2: System Architecture — Type 1·2·3·MLD·MH-MLD
- 3 Ch 3: 메모리 일관성 모델 — HDM-DB·HDM-D·Bias·BISnp
- 4 Ch 4: Pooling·GFAM·Fabric — Multi-host 메모리 공유
- 5 Ch 5: CXL 4.0의 핵심 새 기능 — 128 GT/s·Bundled Port
- 6 Ch 6: CXL.io — PCIe와의 차이·DOE·DVSEC
- 7 Ch 7: CXL.cache — D2H·H2D 흐름과 coherency state
- 8 Ch 8: CXL.mem — M2S·S2M·HDM Decoder
- 9 Ch 9: Flit Format — 68B vs 256B vs Latency-Optimized
- 10 Ch 10: ARB/MUX — 세 프로토콜의 PHY 다중화
- 11 Ch 11: Linux drivers/cxl/ 분석 — Mainline kernel CXL 구현
- 12 Ch 12: QEMU CXL 에뮬레이션 — 노트북에서 CXL 개발
- 13 Ch 13: Switching·Fabric Manager — 2.0 pooling에서 3.x fabric까지
- 14 Ch 14: Security — IDE·SPDM·TSP·CXL TEE
- 15 Ch 15: RAS·Performance·Compliance — 운용·검증의 마지막 단계
관련 글
Ch 10: ARB/MUX — 세 프로토콜의 PHY 다중화
같은 PHY에 CXL.io·CXL.cache·CXL.mem을 시분할로 흘리는 layer.
같은 시리즈에서 이어 읽기
Ch 11: Linux drivers/cxl/ 분석 — Mainline kernel CXL 구현
Linux mainline CXL subsystem의 코드 구조, probe·region·mailbox 경로.
같은 시리즈에서 이어 읽기
EFI·UEFI에서 CXL 초기화 — CEDT 생성과 HDM Decoder 사전 설정
EDK II 기반 UEFI에서 CXL 디바이스 초기화 — CEDT(CXL Early Discovery Table) 생성, HDM Decoder 사전 설정, ACPI handoff.
공통 태그 기반 추천
이 글을 참조하는 글 (6)
- CXL.mem 프로토콜 분해 — 왕복 횟수가 만드는 지연, 링크가 만드는 대역폭 — HBM·GDDR 심화
- Ch 8: Data Link Layer — DLLP·ACK/NAK·Flow Control·FLIT Mode — PCIe Deep Dive
- Ch 10: ARB/MUX — 세 프로토콜의 PHY 다중화 — CXL 4.0 Internals
- Ch 8: CXL.mem — M2S·S2M·HDM Decoder — CXL 4.0 Internals
- Ch 5: CXL 4.0의 핵심 새 기능 — 128 GT/s·Bundled Port — CXL 4.0 Internals
- Ch 1: CXL의 자리와 진화 — 1.1에서 4.0까지 — CXL 4.0 Internals