이 글은 제가 PCIe를 공부하면서 겪은 시행착오를 바탕으로 정리한 글입니다. PCIe를 처음 접하는 분들에게 좋은 길라잡이가 되었으면 합니다.
PCIe 란?
PCIe의 "PCI"는 Peripheral Component Interconnect의 약자로써 말 그대로, " Peripheral Component " 주변 장치를 CPU 및 메모리와 연결하는 데 사용되는 표준 인터페이스입니다. 여기서 말하는 주변 장치에는 GPU, NIC, SSD와 같이 PCIe 포트에 장착되는 요소들입니다. 기존 PCI와 PCI-X를 걸쳐 현재 우리가 아는 PCIe로 넘어왔으며, 2024년 현재 PCIe gen 7까지 spec이 지정되었으며, 상용 장치는 현재 PCIe gen 5까지 출시된 상태입니다.
PCIe Link
PCIe는 PCIe device 간에 연결해 주는 인터페이스이기에, PCIe link에 대해 먼저 알아봅시다. PCIe는 point-to-point serial bus이며, link는 하나 이상의 lane으로 구성이 됩니다. 또한 PCIe lane은 동시에 양방향 송수신이 가능한 "duplex" 연결이므로 하나의 lane은 Tx와 Rx 부분의 wire로 구성되어 있습니다. 그래서 하나의 lane은 2개의 wire라고 생각할 수 있지만, PCIe는 differential signaling을 사용하기 때문에 Tx와 Rx는 각각 2개의 wire를 가지게 됩니다. 즉, 하나의 PCIe lane은 총 4개의 wire로 구성됩니다.
PCIe link의 데이터 전송 속도는 밑의 테이블과 같이 세대에 따라 점점 증가했습니다. 특이한 것은 2세대에서 3세대로 넘어갈 때, 속도를 2배 높이는 대신 encoding(8b/10b -> 128b/130b) 방식을 변화하여 총 bandwidth를 늘렸습니다.
Gen1 | Gen2 | Gen3 | Gen4 | Gen5 | |
전송 속도 | 2.5 GT/s | 5 GT/s | 8 GT/s | 16 GT/s | 32 GT/s |
참고) 왜 PCIe에서 serial bus를 사용할까?
많은 Bus에서 serial 방식을 채택하고 있습니다. 대표적으로 USB(Universal Serial Bus)가 있습니다. 처음 생각할 때는 parallel bus가 뭔가 더 많이? 병렬적으로? 보낼 수 있을 것 같기에, 더 좋아 보이는 것은 사실입니다. 하지만 parallel bus에 비해 serial bus가 가지는 여러 가지 장점이 있습니다.
- 간소화된 신호 처리: serial bus는 data 전송을 위해 단일 또는 소수의 data line만 사용할 수 있습니다. 이는 parallel bus에 비해 물리적 연결이 간소화되어 설계가 더 단순하고 비용적인 측면에서 더 효율적입니다.
- 높은 데이터 전송 속도: PCIe와 같은 serial interface는 높은 데이터 전송 속도를 지원합니다. 왜냐하면 serial communication에서는 data가 연속적인 bit stream으로 전송되므로 클럭 속도를 높일 수 있기 때문입니다. 이는 동일한 클럭 속도에서 데이터를 더 빠르게 전송할 수 있습니다.
- 신호 무결성 향상: serial bus는 신호 간섭 및 전자기 간섭(EMI) 문제를 줄일 수 있습니다. 각 신호 하인이 별도로 보호되고 더 적은 수의 신호선을 사용하기 때문에 간섭이 그만큼 줄어들어 안정적인 데이터 전송을 가능케 합니다.
- 스케일링 용이성: PCIe는 라인수를 증가시키거나 줄이는 것이 비교적 간단합니다. 이를 통해 시스템 요구사항에 맞춰 유연하게 대역폭을 조정할 수 있습니다.
PCIe Topology
Root Complex
Root complex는 CPU 및 memory와 직접 연결되는 PCIe 시스템의 주요 요소입니다. 이는 시스템의 host bus interface를 제공하고, PCIe topology 내의 다른 모든 구성 요소와의 통신을 관리합니다. root complex는 하나 이상의 PCIe 포트를 포함할 수 있으며, 이 포트들은 다른 PCIe device 혹은 PCIe switch로 연결됩니다. 대표적으로 intel에서는 intel 머더보드의 칩셋 구성 요소인 PCH(Platform Controller Hub)를 통해 CPU와 다른 시스템 부품 사이의 통신을 지원합니다.
Switch
PCIe siwtch는 다수의 PCIe device 간의 packet을 routing 하는 역할을 합니다. 이는 network switch와 유사하게 작동하며, 여러 endpoint device 또는 다른 switch와의 연결을 확장(fan-out)하는 데 사용됩니다.
Bridge
PCIe bridge는 서로 다른 버스 표준을 연결하는 데 사용됩니다. 예를 들어, PCI-to-PCIe bridge는 기존 PCI bus 기반 device를 PCIe topology에 통합할 수 있도록 합니다. 이 bridge는 data 포맷과 전송 프로토콜 차이를 해결하며, 두 다른 버스 시스템 간의 호환성을 보장합니다.
Endpoint
Endpoint device는 PCIe topology의 최종 사용자 device로 GPU, NIC, SSD 등이 이에 해당합니다. 각 endpoint는 PCIe interface를 통해 data를 송수신할 수 있는 독립적인 기능을 가지고 있으며, 이들은 root complex 또는 switch를 통해 시스템의 다른 부분과 통신합니다.
PCIe Layer
PCIe architecture는 계층적 구조로 되어 있으며, 이는 각 계층이 특정 기능을 수행하도록 설계되어 있습니다. 주요 계층은 transaction layer, data link layer, (logical/electrical) physical layer이며, 각 계층의 역할은 다음과 같습니다.
Transaction Layer
transaction layer는 data transaction의 생성 및 관리를 담당합니다. 이 계층에서는 data packet(TLPs)를 구성하고, data 전송을 위한 address 지정, 오류 검출(ECRC), transaction routing 등을 수행합니다. transaction 계층은 read, write 그리고 message 전송과 같은 다양한 transaction 유형의 요청을 생성할 수 있으며, 이러한 요청을 data link layer로 전달하여 data 전송이 이루어지도록 합니다.
Data Link Layer
data link layer의 주요 기능의 데이터의 안정적인 전송을 보장하는 것입니다. 이 계층은 전송된 data의 무결성을 검증하고, 오류 검출(LCRC) 및 수정(Retry)을 수행합니다. 또한 data link layer packet(DLLPs)은 packet의 전송을 확인하고 필요한 경우 재전송을 관리합니다. 이 계층은 transaction layer와 physical layer사이의 인터페이스 역할을 하며, flow control과 packet의 ordering을 담당하여 data의 안정적인 전송을 돕습니다.
Physical Layer
physical layer는 실제 data 전송을 담당하는 hardware 계층입니다. 이 계층에서는 전기 신호를 처리하고, data를 전기적 신호로 변환하여 PCIe device 간의 실제적인 data 전송을 가능하게 합니다. physical layer는 data link layer로부터 받은 정보를 serial data stream으로 encoding 하고, 전송하며, 수신된 data를 다시 decoding 합니다. 또한 physcial layer는 serial 통신에서 발생할 수 있는 clock recovery 및 data 정렬과 같은 기능도 제공합니다.
Memory Read Request Example
위 예시는 memory read request의 동작을 표현하고 있는 예시이며, 본격적으로 자세하게 PCIe를 다루기 전 전초전 느낌으로 보면 정말 좋은 자료입니다. 설명하기 전, 좋은 자료를 만들어주신 mindshare에게 감사의 말씀을 전합니다.
Device A에서의 동작
설명의 편의성을 위해 왼쪽을 device A, 오른쪽을 device B라고 부르겠습니다. device A의 core에서 device B에 대한 memory read transaction을 생성해 냅니다. 이를 바탕으로 transaction layer에서는 TLP를 만드며, TLP header에 transaction 유형, 접근하고자 할 address, requester ID 등을 기입합니다. read 이기에 TLP에 data payload는 없습니다. (만약 write라면 최대 4KB의 data payload가 있을 것입니다.) 그림에서는 선택적인 ECRC까지 있는 모습입니다. 이제 만들어진 TLP는 VC(Virtual Channel)중 하나로 들어가게 됩니다. VC는 QoS(Quality of Service)와 관련이 있으며, 추후 transaction layer를 설명하면서 자세히 다루도록 하겠습니다. 간단히 말하자면 일종의 "우선순위"를 매기는 것입니다. TLP header에 3bit 크기의 TC(Traffic Class) 값이 저장되어 있는데, 이 값을 보고 특정 VC로 들어갑니다.(즉, TC <-> VC 간 매핑이 존재합니다.)
Arbitration을 통해 여러 VC 중 하나의 VC를 선택해 data link layer로 TLP를 전송합니다. data link에서는 transaction layer로부터 전달받은 packet의 앞에는 sequence number를 붙이고, 뒤에는 필수적으로 필요한 LCRC를 생성해 붙입니다. 그리고 physical layer로 전송하기 전 Retry Buffer라는 곳에 생성한 TLP를 복사하여 저장합니다. 이는 해당 TLP가 전송에 실패하면 재전송을 위한 복사본이라고 생각하시면 됩니다. 좀 더 구체적으로 전송에 실패하여 device B가 Nak DLLP를 보내어 device A가 Nak DLLP를 수신한다면, 해당하는 TLP에 대한 복사본을 retry buffer를 통해 재전송하는 것입니다.
이제 data link layer에서 physical layer로 packet을 보냅니다. physical layer에서도 전달받은 packet 앞 뒤에 framing symbol(start, end)를 추가하며, 특정 인코딩에 맞게 (PCIe 3.0 이상부터는 128b/130b 인코딩) 진행한 뒤, serailization을 진행하여 device A에서 device B로 packet을 전송합니다.
Device B에서의 동작
Device B의 physical lyaer는 device A에서 전송받은 packet을 다시 seral to parallel 변환을 하고, 디코딩을 진행한 후, logical phy에서 붙인 framing symbol을 제거한 뒤, data link layer로 전송합니다. data link layer에서는 CRC 체크와 예상되는 sequence number와 실제 들어온 sequence number를 비교해 이상이 없는지 확인합니다. 만약 이상이 있으면, device B는 device A에게 Nak DLLP를 전송합니다. 이상이 없으면 data link layer에서 LCRC와 sequence number를 제거한 뒤, transaction layer로 전송합니다. transaction layer에서 ECRC check를 한 뒤, 문제가 없으면 전송받은 packet을 확인한 뒤, 알맞은 동작을 수행하게 됩니다.
Next Topic
이번 글에서 PCIe를 자세하게 들여다보기 전 알면 좋은 내용들을 설명하였습니다. 다음 글에서는 PCIe에서 어떻게 configuration space를 접근하는지, address routing은 어떻게 하는지에 대해 살펴보겠습니다.
Reference)
- PCI Express® Base Specification Revision 5.0 Version 1.0
- PCI Express Technology 3.0 (minshare)
'Interface Standards > PCIe' 카테고리의 다른 글
[5] PCIe - Data Link Layer (DLLP & Ack/Nak protocol) (0) | 2024.05.13 |
---|---|
[4] PCIe - Transaction Layer (Ordering) (0) | 2024.05.12 |
[3] PCIe - Transaction Layer (Quality of Service & Flow Control) (0) | 2024.05.12 |
[2] PCIe - Transaction Layer (TLPs) (0) | 2024.05.12 |
[1] PCIe - Introduction 2 (0) | 2024.05.11 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!