본문으로 건너뛰기
CXL 4.0 Internals · 9/15

Ch 9: Flit Format — 68B vs 256B vs Latency-Optimized

· Hawk · 8분 읽기
cxl flit 68b-flit 256b-flit fec

#한 줄 요약

“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 flit68 BCXL 1.132 GT/s까지
Standard 256B flit256 BCXL 3.0PCIe Flit mode에서 사용. 8 GT/s 이상
Latency-Optimized 256B flit256 BCXL 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 ID2 B — 이 flit이 CXL.io인지 CXL.cachemem인지
Slot16 B × 4
CRC2 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):

부분크기담당
HDR2 BPhysical Layer
Slot 0 (H-Slot)14 BLink Layer
Slot 1~14 (G-Slot)16 B × 14Link Layer
CRD2 BLink Layer — credit 반환
CRC8 BPhysical Layer
FEC6 BPhysical 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 0CXL.mem M2S Req (MemRd)
Slot 1CXL.cache D2H Req (RdShared)
Slot 2~5CXL.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 기준:

  1. 256 B를 다 받음
  2. FEC 디코딩·정정
  3. CRC 검증 — 실패면 retry 요청
  4. HDR의 Flit Type으로 CXL.io / CXL.cachemem / ALMP 분배
  5. cachemem flit이면 slot의 메시지를 CXL.cache·CXL.mem으로 나눔

Latency-Optimized는 2번을 CRC 실패 때만 합니다.

#세대가 다른 장치끼리

서로 다른 세대의 host·device가 붙으면 둘 다 지원하는 쪽으로 맞춥니다.

HostDevice결과
CXL 4.0CXL 4.0256B, 최대 128 GT/s
CXL 4.0CXL 3.x256B, 최대 64 GT/s
CXL 4.0CXL 2.068B, 최대 32 GT/s
CXL 2.0CXL 4.068B, 최대 32 GT/s

낮은 쪽에 맞춰 동작하고, 상위 세대 기능은 쓰지 않습니다.

#Credit-based Flow Control

CXL.cachemem은 채널마다 메시지 단위 credit을 씁니다. 받는 쪽이 버퍼를 비우면 credit을 돌려주고, 보내는 쪽은 credit이 있을 때만 그 채널 메시지를 보냅니다.

형식Credit 반환 위치
68B flitflit 헤더의 credit 필드, 또는 LLCRD control flit (§4.2)
256B flitflit 끝의 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되는지를 본격적으로 분해합니다.

#관련 항목

#시리즈 자료 출처 안내

이 글은 CXL 3.1·1.1 spec, CXL 4.0 발표문·웨비나를 근거로 합니다. 시리즈 전체의 자료 정책은 Ch 1에 있습니다.