이 글은 제가 PCIe를 공부하면서 겪은 시행착오를 바탕으로 정리한 글입니다. PCIe를 처음 접하는 분들에게 좋은 길라잡이가 되었으면 합니다.
이전 글)
PCIe Physical Layer
PCIe(Peripheral Component Interconnect Express)의 physical layer는 데이터를 전송하고 수신하는 역할을 합니다. 각기 다른 세대의 PCIe에 따라 전송 방식이 조금씩 다르기에, 8b/10b 인코딩 방식을 사용하는 PCIe gen1,2와 gen3이상으로 나누어 설명하겠습니다.
Physical Layer의 역할
Physical Layer는 외부 물리적 링크와 데이터 링크 계층 사이에 위치합니다. 이 계층은 데이터를 직렬화하여 모든 링크의 레인(Lane)으로 전송하며, 수신 측에서는 직렬 데이터를 다시 병렬 데이터로 변환하여 상위 계층으로 전달합니다.
전송 로직(Transmit Logic)
Data 준비
- 버퍼(Buffer): 사우이 데이터 링크 계층에서 오는 데이터를 임시로 저장하는 공간
- control 및 data character 구분(D/K# bit): Gen1과 Gen2에서는 패킷 경계를 표시하고 ordered set를 만드는 control character와 data character를 구분.
- 동기 헤더(Sync Header): Gen3에서는 128bit block의 데이터 시작 부분에 2bit sync header를 추가하여 data block인지 orderdset block인지 구분
Data 전송 준비
- Byte Striping: 여러 레인으로 데이터를 분산시켜 동시에 전송할 수 있게 함. 예를 들어, 16개의 lane이 있으면 16byte의 병렬 데이터를 한 번에 전송.
- Scrambling: data를 혼합하여 전송 중 오류를 줄이는 기술. 수신 측에서 동일한 알고리즘을 사용해 원래 데이터를 복원.
- Encoding: Gen1, Gen2에서는 8b/10b 인코딩을 사용하며, Gen3부터는 128b/130b 인코딩을 사용
수신 로직(Receive Logic)
Data 복원
- Clock & Data Recovery(CDR): 수신한 신호에서 clock 신호를 복구하고 data를 정확히 읽어들이는 과정
- Symbol 경계 및 블록 잠금: Gen/1Gen2는 10bit symbol, Gen3는 16B block을 복원
- Elastic Buffer: data 전송 시 클럭 변동을 조절하여 안정적인 데이터를 제공
- Decoding 및 Descrambling: 수신한 데이터를 디코딩하고 스크램블링된 데이터를 원래대로 복원.
PCIe Transmitter Logic Detail
Tx Buffer
Data Link Layer에서 TLP와 DLLP가 Tx buffer로 전달됩니다. 여기서 "control" 정보도 함께 전달되어 새로운 패킷이 시작되는 시점을 알 수 있습니다. 전송 버퍼는 데이터 흐름을 일시적으로 중단하고 control character와 ordered set을 삽입할 수 있도록 해줍니다.
Mux and Control Logic
Mux는 데이터 흐름에 특별한 제어 문자(K)를 삽입하는 장치. 제어 문자 K는 물리 계층에서만 사용되며, 전송 중에 삽입되고 수신 시 제거됩니다. Mux의 입력은 다음과 같습니다.
- 전송 데이터 버퍼: data link layer에서 packet을 공급할 때, mux는 buffer에서 나오는 데이터 스트림을 토과시킴.
- 시작 및 종료 문자: 모든 TLP와 DLLP의 시작과 끝에 제어 문자를 추가하여 packet의 경계를 쉽게 감지할 수 있음.
- Ordered Set: link의 운영을 유지하고 오류 복구 등을 위한 ordered set. 추후 자세하게 다룰 예정.
- Logical Idle: 전송할 packet이 없을 때 link를 유지하기 위해 logical idle 문자가 삽입.
Byte Striping
Byte striping은 여러 레인을 사용하는 경우 필요합니다. 각 레인에 순차적으로 문자를 분산시켜 동시에 전송할 수 있도록 합니다.
Packet Format Rules
packet 형식에는 몇 가지 일반적인 규칙이 있는데:
- packet의 총 길이는 항상 4의 배수.
- TLP는 STP 문자로 시작하고 END 또는 EDB 문자로 끝남.
- DLLP는 SDP 문자로 시작하고 END 문자로 끝나며 8개의 문자로 구성(문자는 1B크기)
- ordered set 및 logical idle은 항상 모든 lane에 동시에 전송.
Example
- x1 link: 단일 레인을 사용하는 링크의 경우, 패킷이 한 번에 한 바이트씩 물리 계층으로 들어가고 나감.
- x4 link: 4개의 레인을 사용하는 링크의 경우, STP와 SDP문자는 항상 레인 0에서 전송되고 END와 EDB 문자는 레인 3에서 전송.
Scrambler
Scrambler는 data stream에서 반복적인 패턴을 방지하는 역할을 합니다. 반복적인 패턴이 발생하면 일정한 주파수가 발생되어, 이는 전자기 간섭(EMI)를 증가시킬 수 있습니다. 스크램블링은 EMI문제를 줄이는 데 목적이 있으며, 인접한 레인 간의 간섭을 줄여 수신기가 각 레인의 신호를 더 쉽게 구분할 수 있게 도와줍니다.
Scrambler는 16bit LFSR를 사용하며, 다음과 같은 구성됩니다. LFSR은 data byte의 clock 주파수보다 8배 빠르게 동작하며, 출력은 8bit register에 입력됩니다. 이 register의 출력은 8bit data character와 XOR연산을 통해 scrambled된 data로 변환됩니다.
8b/10b Encoding
8b/10b encoding은 PCIe gen1, 2에서 사용되는 방식입니다. 이러한 인코딩 방식의 주요 목적은 다음과 같습니다.
- Clock Embedding: 인코딩을 통해 데이터 스트림에 충분한 에지를 제공하여 수신기에서 클럭을 복구할 수 있게 합니다. 이를 통해 EMI를 줄이고, 신호 전달을 더 원할하게 만듦.
- 오류 검출 향상: 인코딩 방식은 전송 오류를 쉽게 검출할 수 있게 하는데, 10bit symbol 중 많은 부분이 유효하지 않은 패턴으로 간주되어, 수신기에서 이러한 패턴을 쉽게 감지할 수 있음.
10bit symbol의 특성
단순히 8bit를 10bit로 변환하는 것이 아닌, 5bit를 6bit로, 3bit를 4bit로 변환하는 두 단계로 이루어지며, 다음과 같은 규칙을 따릅니다.:
- 연속된 1이나 0의 개수는 최대 5개를 넘지 않음.
- 각 10bit symbol은 4가지 조합중 하나.
- 4개의 0과 6개의 1
- 6개의 0과 4개의 1
- 5개의 0과 1
- 각 10bit symbol은 두 개의 부분으로 나뉨.
- 첫 번째 부분은 6bit이며, 4개 이상의 1이나 0을 포함하지 않음.
- 두 번째 부분은 4bit이며, 3개 이상의 1이나 0을 포함하지 않음.
캐릭터 표기법
8b/10b 인코딩은 특별한 표기법을 사용하는데,
- 문자를 3bit와 5bit 부분으로 나눔.
- 이 부분들의 임치를 바꿈.
- 각 부분의 10진수 값을 구함.
- 데이터 문자는 Dxx.y, 제어 문자는 Kxx.y로 표기. 여기서 xx는 5비트 필드의 10진수 값, y는 3비트 필드의 10진수 값.
Disparity
Disparity는10bit symbol 내의 1과 0의 불균형을 나타내며, + Disparity는 1의 개수가 0의 개수보다 많은 경우를 말합니다. 반대로 - Disparity는 0의 개수가 1의 개수보다 많은 경우를 말합니다. CRD(Current Running Disparity)는 현재 상태의 disparity를 추적하며, 이는 다음 symbol을 encoding할 때 필요한 정보를 제공합니다.
- 초기 상태: CRD는 전송 시작 시 초기 상태를 가집니다. 초기 CRD는 음수 또는 양수일 수 있으며, 수신기와 발신기 간의 초기 상태가 일치하지 않을 수 있습니다. 그러나 초기 심볼이 수신되면 수신기는 이를 조정하여 동기화합니다.
- Disparity 변경: 각 심볼이 인코딩되고 전송될 때, 그 심볼의 disparity가 CRD에 반영됩니다. 예를 들어,
- 현재 CRD가 음수인 경우, 양의 disparity를 가진 심볼이 전송되면 CRD는 양수로 전환됩니다.
- 현재 CRD가 양수인 경우, 음의 disparity를 가진 심볼이 전송되면 CRD는 음수로 전환됩니다.
- 중립 disparity를 가진 심볼이 전송되면 CRD는 변하지 않습니다.
예시를 통한 이해
위의 예시를 통해 CRD의 동작을 살펴봅시다.
- 초기 상태: CRD가 음수로 시작한다고 가정.
- 첫 번째 심볼: K28.5 (+Disparity)를 전송하면, CRD는 양수로 변경
- 두 번째 심볼: K28.5 (-Disparity)를 전송하면, CRD는 다시 음수로 변경
- 세 번째 심볼: D10.3 (중립 Disparity)를 정송하면, CRD는 그대로 음수를 유지.
Control Characters
8b/10b 인코딩은 여러 특별한 문자를 제공하여, 링크 관리를 돕습니다. 아래는 주요 제어 문자들입니다.
- COM(Comma): ordered set의 첫 번째 symbol로 사용되며, 수신기가 수신 스트림을 잠금할 때, 도움을 줌.
- PAD: 여러 레인을 사용하는 링크에서 패킷이 모든 레인을 채우지 못할 때 나머지 레인을 채우는 용도로 사용.
- SKP(Skip): 주기적으로 전송되어 클럭 허용 오차 보정을 도움.
- STP(Start TLP): TLP의 시작을 나타냄.
- SDP(Start DLLP): DLLP의 시작을 나타냄.
- END: TLP/DLLP의 정상적인 종료를 나타냄.
- EDB(End Bad): 오류가 있는 TLP의 종료를 나타내며, 패킷을 무효화하는 데 사용.
- FTS(Fast Training Sequence): L0s 대기 상태에서 L0 상태로 복구할 때 사용
- IDL(Idle): 링크가 저전력 상태로 전환되는 것을 알리는 전기적 유휴 상태에서 사용.
- EIE(Electrical Idle Exit): 전기적 유휴 상태에서 깨어날 때 사용.
Ordered sets
ordered sets은 링크 파트너 간의 물리 계층 통신에 사용되며, TLP나 DLLP와는 다른 문자들의 시퀀스로 구성됩니다. ordered set은 모든 레인에서 동시에 전송되며, 수신기가 정렬과 디스큐를 검증할 수 있게 합니다. 주요 ordered set은 다음과 같습니다:
- TS1 & TS2 odered set(TS1OS/TS2OS): 링크 초기화와 트레이닝에 사용. 링크 파트너 간에 비트 및 심볼 락을 맞추고 링크 속도를 협상.
- Electrical Idle oredered set(EIOS): 송신기가 저전력 링크 상태로 전환하려고 할 때 전송. 수신기는 이 ordered set를 수신하여 저전력 상태로 준비.
- Fast Training Ordered Set(FTSOS): 링크를 L0s 상태에서 L0상태로 복구하기 위해 전송. 수신기는 이를 감지하고 비트 및 심볼 락을 회복.
- SKP Ordered Set(SOS): 주기적으로 전송되어 클럭 허용 오차 보정을 수행. 수신기는 SOS를 받아 필요에 따라 SKP문자를 추가하거나 제거.
- Electrical Idle End Orderd Set(EIEOS): 전기적 유휴 상태에서 깨어날 때 사용.
Serializer
PCIe 8b/10b 인코더는 각 레인에서 직렬화기를 통해 심볼을 순서대로 출력합니다. 이때, 가장 작은 비트(a)가 먼저 출력되고, 가장 큰 비트(j)가 마지막으로 출력됩니다. 각 레인의 심볼은 250MHz 또는 500MHz의 주파수로 직렬화되어, 2.5GHz 또는 5.0GHz의 속도로 전송됩니다.
Differential Driver
차동 드라이버는 실제로 비트 스트림을 전송하는 장치로, NRZ(Non-Return-to-Zero) 인코딩을 사용합니다. NRZ는 특별한 중간 전압 수준 없이 데이터를 전송하는 방법을 의미합니다. 차동 신호는 신호 무결성을 향상시키며, 더 높은 주파수와 더 낮은 전압에서 작동할 수 있게 합니다.
Clock Compensation
고속 직렬 전송에서는 수신기가 수신된 비트 스트림에서 클럭을 복구하지만, 수신기의 내부 클럭과 동기화되지 않습니다. 송신기 클럭이 더 빠른 경우, 수신기에서 데이터를 처리하기 전에 패킷이 도착할 수 있습니다. 이를 보상하기 위해 송신기는 "버릴 수 있는 문자"를 삽입하며, PCIe에서는 SKIP oredered set를 사용합니다.
Reference)
- PCI Express® Base Specification Revision 5.0
- PCI Express Technology 3.0 (minshare)
'Interface Standards > PCIe' 카테고리의 다른 글
[8] PCIe - Physical Layer (PCIe Gen3 ~) (0) | 2024.05.27 |
---|---|
[7] PCIe - Physical Layer (PCIe Gen1 & Gen2) - Receive Logic (0) | 2024.05.26 |
[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 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!