본문으로 건너뛰기
PCIe Deep Dive · 8/19

Ch 8: Data Link Layer — DLLP·ACK/NAK·Flow Control·FLIT Mode

· Hawk · 7분 읽기

#한 줄 요약

“Data Link Layer는 TLP를 무결성·신뢰성 있게 link 너머로 전달하는 책임을 집니다.” — *DLLP (Data Link Layer Packet)*가 ACK·NAK·Flow Control·Power Management를 운반, Replay BufferNAK 시 재전송, 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 종류

종류의미
ACKTLP 잘 받음 — sequence number까지 acknowledge
NAKTLP 손상 — replay 요청
InitFC1·InitFC2Flow Control 초기화
UpdateFCFlow Control credit 갱신
PMPower Management (PM_Enter_L1, PM_Active_State_Request_L1 등)
Vendorvendor-specific

DLLP는 짧음 — 6 byte (header + payload + 16-bit CRC). TLP보다 훨씬 가벼움.

#TLP Wrapping — DLL이 TLP에 추가하는 것

영역크기의미
STP/SDP1 byteStart frame (PHY가 처리)
Sequence Number2 byteTLP 순번 — replay 시 사용
TLP (TL이 만든 패킷)N byteheader + payload + 선택 ECRC
LCRC4 byteLink-layer CRC, 32-bit
END1 byteEnd frame

DLL이 sequence number와 LCRC 추가. 받는 측은 LCRC 검증 → 통과면 ACK·실패면 NAK.

#ACK/NAK 프로토콜

단계동작
1Sender가 TLP (seq=N) 보냄 + replay buffer에 저장
2Receiver가 LCRC 검증
3a성공 → ACK (seq=N) 보냄
3b실패 → NAK (마지막 정상 seq) 보냄
4Sender가 ACK 받으면 replay buffer에서 해당 TLP 제거
5Sender가 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:

단계동작
1Sender가 InitFC1 (Posted·Non-Posted·Completion 각각) DLLP 보냄
2자기 buffer 크기 광고
3양단이 InitFC2로 confirm
4Normal traffic 시작

FC Init 실패면 link 활성 안 됨LTSSM에 재진입.

#LCRC vs ECRC

CRC영역위치
LCRCDLL 단위 — TLP + Sequence Number항상 적용
ECRCTL 단위 — 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가변 TLP256 byte 고정 FLIT
Error 검출LCRC (CRC-32)CRC + FEC
Retry 단위TLPFLIT
Latency가변predictable
FCDLLPFLIT header에 포함

FLIT mode는 PAM4·128b/130b의 한계에서 필요. CRC 단독 retrybit rate 높아질수록 비효율FEC 통합retry rate 감소. 256 byte 고정 unitprocessing 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 책임.
  • DLLPACK·NAK·FC·PM·Vendor. 짧은 6 byte.
  • ACK/NAK 프로토콜Replay Buffertransient bit error 복구.
  • Credit-based Flow Control수신 buffer overrun 방지 (P/NP/Cpl × Header/Data 6 종류).
  • LCRC (link)·ECRC (end-to-end) — 보호 범위 다름.
  • Gen 6+ FLIT mode256 byte 고정 unit + FEChigher rate signal에 대응.
  • CXL·UCIe가 같은 FLIT mode를 transport로 공유.

#다음 편

Ch 9: Physical Layer — LTSSM·Equalization·Encoding에서 link training의 모든 statePAM4·equalization·SKP를 본격적으로 분해합니다.

#관련 항목

#시리즈 자료 출처 안내

본 글의 1차 자료·정책은 Ch 1 footer 참고.