Ch 8: Data Link Layer — DLLP·ACK/NAK·Flow Control·FLIT Mode
#한 줄 요약
“Data Link Layer는 TLP를 무결성·신뢰성 있게 link 너머로 전달하는 책임을 집니다.” — *DLLP (Data Link Layer Packet)*가 ACK·NAK·Flow Control·Power Management를 운반, Replay Buffer가 NAK 시 재전송, Credit-based Flow Control이 수신측 buffer overrun 방지. Gen 6+의 FLIT mode는 가변 TLP를 256 byte 고정 FLIT으로 바꾸며 FEC 통합했습니다.
Ch 2 TLP에서 TLP가 transaction layer의 packet임을 봤습니다. DLL은 그 TLP를 wrap해서 link error 복구·flow control·priority를 책임집니다.
#DLLP 종류
| 종류 | 의미 |
|---|---|
| ACK | TLP 잘 받음 — sequence number까지 acknowledge |
| NAK | TLP 손상 — replay 요청 |
| InitFC1·InitFC2 | Flow Control 초기화 |
| UpdateFC | Flow Control credit 갱신 |
| PM | Power Management (PM_Enter_L1, PM_Active_State_Request_L1 등) |
| Vendor | vendor-specific |
DLLP는 짧음 — 6 byte (header + payload + 16-bit CRC). TLP보다 훨씬 가벼움.
#TLP Wrapping — DLL이 TLP에 추가하는 것
| 영역 | 크기 | 의미 |
|---|---|---|
| STP/SDP | 1 byte | Start frame (PHY가 처리) |
| Sequence Number | 2 byte | TLP 순번 — replay 시 사용 |
| TLP (TL이 만든 패킷) | N byte | header + payload + 선택 ECRC |
| LCRC | 4 byte | Link-layer CRC, 32-bit |
| END | 1 byte | End frame |
DLL이 sequence number와 LCRC 추가. 받는 측은 LCRC 검증 → 통과면 ACK·실패면 NAK.
#ACK/NAK 프로토콜
| 단계 | 동작 |
|---|---|
| 1 | Sender가 TLP (seq=N) 보냄 + replay buffer에 저장 |
| 2 | Receiver가 LCRC 검증 |
| 3a | 성공 → ACK (seq=N) 보냄 |
| 3b | 실패 → NAK (마지막 정상 seq) 보냄 |
| 4 | Sender가 ACK 받으면 replay buffer에서 해당 TLP 제거 |
| 5 | Sender가 NAK 받으면 replay buffer의 NAK 이후 TLP 모두 재전송 |
Sliding window로 여러 outstanding TLP 가능. Replay Timer 만료 시도 NAK 동작.
#Replay Buffer
Sender는 ACK 받기 전 TLP를 buffer에 보관. Buffer 크기가 throughput · latency 결정:
| 항목 | 영향 |
|---|---|
| Buffer 부족 | Stall — flow control은 통과해도 buffer 꽉 차서 transmission 중단 |
| Replay Timer 만료 | Timeout으로 NAK 동작 |
| Replay Number Rollover | 너무 많은 replay → UE 진입 (Ch 7) |
Gen 4·5 link는 buffer가 수십 ~ 수백 KB. Gen 6 FLIT mode는 다름 (아래).
#Credit-Based Flow Control
PCIe는 수신측의 buffer overrun 방지를 credit으로 관리:
| Credit 종류 | 의미 |
|---|---|
| Posted Header (PH) | Posted TLP의 header 받을 buffer |
| Posted Data (PD) | Posted TLP의 payload |
| Non-Posted Header (NPH) | Non-Posted TLP의 header |
| Non-Posted Data (NPD) | Non-Posted TLP의 payload |
| Completion Header (CplH) | Completion의 header |
| Completion Data (CplD) | Completion의 payload |
수신측이 buffer 비우면 UpdateFC DLLP로 credit 증가 알림. Sender는 credit이 충분할 때만 TLP send.
#FC Init — 링크 활성화 시
링크가 L0에 도달하면 FC Initialization:
| 단계 | 동작 |
|---|---|
| 1 | Sender가 InitFC1 (Posted·Non-Posted·Completion 각각) DLLP 보냄 |
| 2 | 자기 buffer 크기 광고 |
| 3 | 양단이 InitFC2로 confirm |
| 4 | Normal traffic 시작 |
FC Init 실패면 link 활성 안 됨 — LTSSM에 재진입.
#LCRC vs ECRC
| CRC | 영역 | 위치 |
|---|---|---|
| LCRC | DLL 단위 — TLP + Sequence Number | 항상 적용 |
| ECRC | TL 단위 — TLP만 | option, AER로 enable |
LCRC는 link 1 hop. ECRC는 RC↔EP end-to-end. Switch가 TLP transform하지 않으니 ECRC가 multi-hop 무결성 보장.
#FLIT Mode — Gen 6+의 큰 변화
PCIe 6.0부터 FLIT (Flow Control Unit) mode가 기존 가변 TLP 모델 교체:
| 항목 | 기존 (Gen 5까지) | FLIT mode (Gen 6+) |
|---|---|---|
| Unit | 가변 TLP | 256 byte 고정 FLIT |
| Error 검출 | LCRC (CRC-32) | CRC + FEC |
| Retry 단위 | TLP | FLIT |
| Latency | 가변 | predictable |
| FC | DLLP | FLIT header에 포함 |
FLIT mode는 PAM4·128b/130b의 한계에서 필요. CRC 단독 retry가 bit rate 높아질수록 비효율 — FEC 통합이 retry rate 감소. 256 byte 고정 unit이 processing pipeline 단순.
#FLIT Mode 진입 협상
Link이 Configuration에서 Gen 6 FLIT mode 협상:
| 시나리오 | 결과 |
|---|---|
| 양단 모두 Gen 6 FLIT 지원 | FLIT mode 활성 |
| 한쪽만 지원 | Non-FLIT mode로 fallback |
| FLIT mode 안정 | 기존 TLP 모델 deprecated (Gen 7부터) |
CXL 3.x·UCIe 2.0이 FLIT mode를 transport로 채택. PCIe·CXL·UCIe가 같은 FLIT 위에서 동작.
#DLLP CRC
DLLP 자체도 16-bit CRC로 보호. DLLP 손상은 재전송 없음 — 다음 DLLP가 정정. UpdateFC는 주기적으로 보내져 손실되어도 다음번에 회복.
#자주 하는 실수
#”ACK 안 받으면 영원히 stall”
Replay Timer 만료 시도 자동 retransmission. Timer가 Gen·payload size 따라 결정. timeout 동안은 throughput 떨어짐.
#”Flow Control = TLP 우선순위”
FC는 buffer overrun 방지만. priority/QoS는 별도 TC (Traffic Class). TC는 Virtual Channel과 결합돼서 high-priority traffic 보장.
#”FLIT mode는 PCIe 7.0부터”
Gen 6부터 도입. Gen 6 device가 NRZ legacy mode와 FLIT mode 둘 다 지원 — 협상 결과에 따라. Gen 7부터 FLIT 전용 가능성 큼.
#”LCRC 실패 자주면 cable 교체”
Cable·connector·card 모두 의심. Replay rate counter (lspci -vv | grep "AER.*Cor")로 frequent CE 확인. signal integrity 측정도.
#”DLLP는 PCIe Cap에 안 보임”
DLLP는 DLL 자체 protocol. Configuration Space에 별도 register 없음. Replay buffer 크기·credit은 vendor-specific.
#정리
- DLL이 TLP에 Sequence Number + LCRC + STP/END 추가해 신뢰성·flow control 책임.
- DLLP는 ACK·NAK·FC·PM·Vendor. 짧은 6 byte.
- ACK/NAK 프로토콜과 Replay Buffer가 transient bit error 복구.
- Credit-based Flow Control이 수신 buffer overrun 방지 (P/NP/Cpl × Header/Data 6 종류).
- LCRC (link)·ECRC (end-to-end) — 보호 범위 다름.
- Gen 6+ FLIT mode가 256 byte 고정 unit + FEC로 higher rate signal에 대응.
- CXL·UCIe가 같은 FLIT mode를 transport로 공유.
#다음 편
Ch 9: Physical Layer — LTSSM·Equalization·Encoding에서 link training의 모든 state와 PAM4·equalization·SKP를 본격적으로 분해합니다.
#관련 항목
- Ch 2: TLP
- Ch 7: Error Handling — Replay Number Rollover
- Ch 9: Physical Layer
- CXL Internals Ch 9: Flit Format — 같은 FLIT 표준
#시리즈 자료 출처 안내
본 글의 1차 자료·정책은 Ch 1 footer 참고.
PCIe Deep Dive · 8 of 19
- 1Ch 1: PCIe Fundamentals — 계층 구조와 토폴로지
- 2Ch 2: TLP — Transaction Layer Packet
- 3Ch 3: Configuration Space — 4 KB ECAM·Capability Linked List
- 4Ch 4: BAR & MMIO — Device 자원의 호스트 주소 매핑
- 5Ch 5: Interrupts — INTx·MSI·MSI-X·Interrupt Remapping
- 6Ch 6: Power Management — D-state·L-state·ASPM
- 7Ch 7: Error Handling — Correctable·Uncorrectable·AER·DPC
- 8Ch 8: Data Link Layer — DLLP·ACK/NAK·Flow Control·FLIT Mode
- 9Ch 9: Physical Layer — LTSSM·Equalization·SerDes
- 10Ch 10: Linux PCI Basics — Enumeration·Driver Model·sysfs
- 11Ch 11: DMA·IOMMU — Coherent·Streaming·ATS·PRI·PASID·IOMMUFD
- 12Ch 12: Virtualization I — Pass-through·SR-IOV·VFIO·DPDK·SPDK
- 13Ch 13: Virtualization II — vIOMMU·Scalable IOV·VirtIO·IDE·TDISP
- 14Ch 14: Linux Operations — Hot-plug·AER Recovery·DPC·ARI
- 15Ch 15: Tools — lspci·setpci·pcimem·protocol analyzer
- 16Ch 16: Troubleshooting — 실무 시나리오북
- 17Ch 17: Performance — Bandwidth·Latency·Tuning
- 18Ch 18: Register Maps — Config Space·Capability 비트 reference
- 19Ch 19: 고급 기능 — Lane Margining·10-bit Tag·TPH·ACS·L0p
관련 글
Ch 19: 고급 기능 — Lane Margining·10-bit Tag·TPH·ACS·L0p
코어 동작 너머의 PCIe spec 기능들 — Lane Margining(신호 마진 측정)·10-bit Tag(outstanding 확장)·TPH(캐시 주입 힌트)·ACS(격리)·L0p(부분폭 저전력)을 실무 관점에서 정리합니다.
Ch 18: Register Maps — Config Space·Capability 비트 reference
PCIe register reference — Type 0/1 header·PCIe Cap·AER·MSI·MSI-X·SR-IOV·ACS·LTR의 주요 비트 layout.
Ch 17: Performance — Bandwidth·Latency·Tuning
PCIe 성능 — theoretical vs effective BW·MaxPayload·MaxReadReq·latency breakdown·NUMA·P2P·ASPM 영향·tuning.