[PCIe] Transaction Layer 완전 정리 | TLP 구조, Header, Routing, Completion

2026. 6. 17. 21:58기초지식

반응형

Transaction Layer란?

PCIe 3계층 구조에서 최상위 레이어이다. 소프트웨어 스택과 PCIe 하드웨어 간의 인터페이스 역할을 한다. 데이터 전송 요청을 TLP(Transaction Layer Packet)로 패키징하고, 수신 측에서 이를 해석한다.

Transaction Layer의 핵심 기능은 세 가지이다. TLP 생성/소비, Flow Control, Ordering 규칙 적용이다.


TLP 구조

TLP는 세 부분으로 구성된다.

Header - 3DW(12B) 또는 4DW(16B). 트랜잭션 타입, 주소, 크기, Tag, Requester ID 등 포함
Data Payload - 선택적. 최대 4KB. 32-bit DWORD 단위
ECRC - 선택적. End-to-End CRC. 32-bit

// TLP 기본 구조
// [Header (3DW or 4DW)] [Data Payload (0~4KB)] [ECRC (optional)]
//
// Header 첫 번째 DW (공통):
// [31:29] Fmt   - Header 형식 + Data 유무
// [28:24] Type  - TLP 타입
// [22:20] TC    - Traffic Class [2:0]
// [15]    TD    - TLP Digest (ECRC 존재 여부)
// [14]    EP    - Poisoned
// [13:12] Attr  - Attribute (Relaxed Ordering, No Snoop)
// [9:0]   Length - Payload 길이 (DWORD 단위, 0=1024DW)

Fmt 필드 - Header 형식 결정

Fmt[2:0] 3비트로 Header 크기와 Data 유무를 결정한다.

000 - 3DW Header, No Data (예: MRd 32-bit)
001 - 4DW Header, No Data (예: MRd 64-bit)
010 - 3DW Header + Data (예: MWr 32-bit)
011 - 4DW Header + Data (예: MWr 64-bit)
100 - TLP Prefix


TLP 타입 종류

Memory Request

MRd - Memory Read. Fmt=000/001. 데이터 없음. Non-Posted - Completion 필요
MRdLk - Memory Read Lock. Legacy 락 시맨틱. x86 레거시 지원용
MWr - Memory Write. Fmt=010/011. 데이터 포함. Posted - Completion 없음

IO Request

IORd / IOWr - IO 공간 접근. x86 레거시 지원용. Non-Posted - Completion 필요

Configuration Request

CfgRd0 / CfgWr0 - Type 0. 직접 접근 (같은 버스의 디바이스)
CfgRd1 / CfgWr1 - Type 1. 브리지를 통한 간접 접근. Non-Posted

Message Request

Msg / MsgD - INTx, PME, Error, Vendor-defined 등 Sideband 신호 대체. Posted

Completion

Cpl - 데이터 없는 Completion (IOWr, CfgWr 응답)
CplD - 데이터 포함 Completion (MRd, IORd, CfgRd 응답)
CplLk / CplDLk - Lock 트랜잭션용 Completion


TLP Header 상세 - Memory Request

// MRd 3DW Header (32-bit Address)
// DW0: [31:29]Fmt=000 [28:24]Type=00000 [22:20]TC [15]TD [14]EP [13:12]Attr [9:0]Length
// DW1: [31:16]Requester ID(BDF) [15:8]Tag [7:4]LastBE [3:0]FirstBE
// DW2: [31:2]Addr[31:2] [1:0]PH

// MRd 4DW Header (64-bit Address)
// DW0: [31:29]Fmt=001 [28:24]Type=00000 ... Length
// DW1: Requester ID + Tag + LastBE + FirstBE
// DW2: Addr[63:32]
// DW3: [31:2]Addr[31:2] [1:0]PH

// Requester ID = BDF (Bus[7:0]:Device[4:0]:Function[2:0])
// Tag = 요청 식별자. Completion 매칭에 사용
//       기본 8-bit (256개 동시 요청), Extended Tag 10-bit (1024개)
// FirstBE/LastBE = 첫/마지막 DWORD에서 유효 바이트 마스크

Completion Header

// CplD 3DW Header
// DW0: [31:29]Fmt=010 [28:24]Type=01010 ... (no Length in completion sense)
// DW1: [31:16]Completer ID(BDF) [15:13]Status [12]BCM [11:0]ByteCount
// DW2: [31:16]Requester ID [15:8]Tag [7:0]LowerAddr
//
// Status [15:13]:
// 000 = SC  (Successful Completion)
// 001 = UR  (Unsupported Request)
// 010 = CRS (Configuration Request Retry Status)
// 100 = CA  (Completer Abort)
//
// ByteCount = 남은 데이터 바이트 수 (Split Completion 지원)
// LowerAddr = 응답 데이터의 시작 바이트 오프셋

TLP Routing 방식

Address Routing - Memory/IO Request에 사용. 32-bit 또는 64-bit 주소 기반. Switch가 각 포트의 BAR 범위(Address Decode)를 보고 포워딩

ID Routing - Configuration Request, Completion에 사용. BDF(Bus:Device:Function) 기반. Switch가 Bus 번호 범위를 보고 포워딩. Secondary/Subordinate Bus 레지스터로 범위 설정

Implicit Routing - Message에 사용. 방향(Route to RC, Broadcast, Local Terminate 등)으로 라우팅. 주소/ID 불필요


Posted vs Non-Posted vs Completion

Posted 트랜잭션 - MWr, Msg. Completion 없음. Flow Control FC(P) 버퍼 사용. 전송 후 즉시 다음 TLP 전송 가능. 전달 보장 없이 빠른 전송

Non-Posted 트랜잭션 - MRd, IORd, IOWr, CfgRd, CfgWr. Completion 필수. FC(NP) 버퍼 사용. Tag를 점유하며 Completion 수신 전까지 재사용 불가

Completion - Non-Posted에 대한 응답 전용. FC(Cpl) 버퍼 사용. Requester ID + Tag로 요청과 매칭

// Split Transaction 예시 (MRd)
// Requester -> Completer: MRd TLP (Tag=0x05, Length=4DW, Addr=0x1000_0000)
// (링크를 다른 TLP에 양보 가능)
// Completer -> Requester: CplD TLP (Tag=0x05, Status=SC, Data=4DW)

Traffic Class (TC)와 Virtual Channel (VC)

TC는 0~7 총 8개이다. TLP Header의 TC[2:0] 필드에 설정한다. TC0이 디폴트이다.

각 TC는 Virtual Channel에 매핑된다. VC는 독립적인 FC 버퍼와 큐를 갖는다. TC-VC 매핑은 VC Extended Capability 레지스터에서 설정한다. 기본적으로 모든 TC는 VC0에 매핑된다.

여러 TC를 분리된 VC에 매핑함으로써 서로 다른 QoS 트래픽이 Head-of-Line Blocking 없이 독립적으로 흐른다.


Attribute 필드 - Relaxed Ordering, No Snoop

Relaxed Ordering (RO) - 비트 1. 1로 설정 시 PCIe Ordering 규칙 일부 완화. 성능 향상 목적. 소프트웨어가 순서에 의존하지 않음을 명시

No Snoop (NS) - 비트 0. 1로 설정 시 프로세서 캐시 스누프 불필요 명시. DMA 전송 시 캐시 일관성이 소프트웨어로 관리될 때 사용. 스누프 오버헤드 제거로 성능 향상


Byte Enable (FirstBE / LastBE)

4비트 필드로 각 비트가 바이트 1개를 나타낸다. FirstBE는 첫 번째 DWORD, LastBE는 마지막 DWORD의 유효 바이트를 지정한다.

// 예시: 4바이트 중 바이트 1,2만 유효
// FirstBE = 4'b0110 (bit1=byte1, bit2=byte2 유효)
// LastBE  = 4'b0000 (단일 DWORD 전송 시 0)
//
// 1바이트 전송 (byte0만):
// FirstBE = 4'b0001, LastBE = 4'b0000
//
// Length=1, FirstBE=4'b1111 = 4바이트 전체 유효

Flow Control 개요

Transaction Layer에서 FC를 관리한다. 수신 측 버퍼 가용량을 Credit 단위로 상대방에게 광고한다. 송신 측은 Credit 범위 내에서만 전송한다. Credit 소진 시 송신 대기(블로킹)한다.

Credit 타입은 6가지이다. PH(Posted Header), PD(Posted Data), NPH(Non-Posted Header), NPD(Non-Posted Data), CplH(Completion Header), CplD(Completion Data)이다.

초기 Credit(InitFC)은 링크 트레이닝 완료 직후 DLLP UpdateFC로 교환한다. FC Credit = 0은 무한 Credit(Infinite)을 의미한다. 주로 Completion 쪽에 사용된다.


📚 다음 글

기초지식 카테고리 글 더보기