PCIe에 대해 한번 알아보자.
먼저 PCI와 PCIe는 어떻게 다를까
1. PCI vs PCIe
1.1 PCI (Peripheral Component Interconnect)
- 개념 : PCI는 1992년에 인텔이 개발한 병렬 버스 인터페이스로 CPU와 주변 장치를 연결하는데 사용되었다.
- 동작 방식 :
- 병렬 전송 방식 : 여러 비트의 데이터를 병렬로 동시에 전송한다.
- 버스 아키텍처 : 여러 장치들이 동일한 버스를 공유하여 데이터를 전송하는데 한 번에 하나의 장치만 버스를 사용할 수 있다. 또한 이 버스는 제한된 대역폭(32비트 또는 64 비트 폭, 33MHz 또는 66MHz 클럭속도)을 가진다.
- 주소 기반 메모리 접근 : CPU는 PCI장치와 직접 메모리 주소를 기반으로 통신한다.
- 속도 : 최대 533 MB/s의 속도를 지원한다. (at 64 bit, 64MHz)
1.2 PCIe (PCI Express)
- 개념 : 기존 PCI를 대체하기 위해 설계된 고속 직렬 인터페이스로, 병렬 방식 대신 직렬 방식의 고속 데이터 전송을 사용한다.
- 동작 방식 :
- 직렬 전송 방식 : Lane을 통해 데이터가 직렬로 전송된다. 각 Lane은 TX와 RX를 위한 두 쌍의 차동 신호로 구성되어 Full Duplex 통신이 가능하며, 데이터 전송 속도가 훨씬 빠르다.
- Point-to-Point 아키텍처 : 각 장치가 별도의 링크를 통해 RC(Root Complex)에 직접 연결되거나 또는 PCIe Switch(하나의 업스트림에 여러개의 다운스트림을 가지고 확장성을 제공하는 장치)를 통해 RC와 연결되는 구조이다. PCI와 달리 대역폭을 공유하지 않고 각 링크마다 독립적인 통신 경로가 존재하여 더 높은 성능을 제공한다. PCIe에도 여전히 버스라는 개념이 존재하긴 하지만 연결된 장치들을 묶어서 관리하기 위한 논리적인 개념일 뿐이다.
- TLP(Transaction Layer Packet) 기반 프로토콜 : PCIe는 데이터 전송을 위해 TLP를 사용한다.
1.3 PCI와 PCIe 차이 및 공통점
PCI는 병렬 인터페이스이고, PCIe는 PCI를 대체하는 고속의 직렬 인터페이스이며 패킷 기반의 통신(TLP) 방식을 사용한다.
하지만 이런 물리적 및 프로토콜의 차이에도 불구하고, 소프트웨어와 운영체제 관점에는 동일한 메모리 접근 패턴을 사용하여 PCI 및 PCIe 장치와 통신하므로 소프트웨어 개발자는 두 인터페이스 간 차이를 크게 의식할 필요 없이 개발이 가능하다고 한다.
2. PCIe Generation과 Lane
2.1 Generation에 따른 속도차이
PCIe는 현재까지 Gen 1.0부터 Gen 6.0까지 존재하며, 세대가 증가할 수록 데이터 전송 속도가 두 배씩 증가한다.
- PCIe 1.0 : 2.5 GT/s (Giga-transfers per second), 약 250 MB/s per Lane
- PCIe 2.0 : 5 GT/s, 약 500 MB/s per Lane
- PCIe 3.0 : 8 GT/s, 약 1 GB/s per Lane
- PCIe 4.0 : 16 GT/s, 약 2 GB/s per Lane
- PCIe 5.0 : 32 GT/s, 약 4 GB/s per Lane
- PCIe 6.0 : 64 GT/s, 약 8 GB/s per Lane
2.2 Lane(x1, x4, x8, x16)
PCIe의 슬롯은 물리적으로 x1, x4, x8, x16의 형태로 구분되며, 이는 각 슬롯이 지원하는 Lane 수를 의미한다. Lane은 데이터 전송을 위한 전송 라인으로 송신(TX)와 수신(RX)를 위한 두 쌍의 차동 신호선으로 이루어져 있으며, Lane 수가 증가할수록 전송 대역폭도 비례하여 증가한다. 예를들어 x16은 x1에 비해 최대 16배의 대역폭을 제공한다.
한편 PCIe 슬롯은 하위 호환성을 갖추고 있어 x16 슬롯은 최대 16개의 Lane을 수용할 수 있지만 x1, x4, x8 장치가 장착된 경우 더 적은 수의 Lane을 사용할 수도 있다.
3. PCIe Topology & Bus Enumeration
3.1 PCIe Topology 구성 요소
- Root Complex (RC) : 오직 다운스트림만 가지는 장치를 Root Complex라고 한다. RC는 CPU 및 메모리를 PCIe 인터페이스에 연결하는 Host Bridge와 여러 다운스트림 포트(Root port)로 구성되며 Type 1 헤더를 가진다.
- PCIe Switch : 1개의 업스트림과 n개의 다운스트림을 가지고 확장성을 제공하는 장치로 Type 1 헤더를 가진다 .
- Endpoint (EP) : 오직 업스트림만 가지는 장치를 Endpoint라고 한다. 최종적으로 데이터를 수신하거나 전송하는 장치로 네트워크 카드, 그래픽 카드, 스토리지 장치 등이 이에 해당한다. EP는 Type 0 헤더를 가진다.
✔️ Type 0 Header와 Type 1 Header
- Type 0 헤더 : 데이터 전송의 최종 목적지인 PCIe Endpoint 장치에 사용된다.
- Type 1 헤더 : 장치 간의 연결을 관리하고 여러 장치를 연결하는 역할을 수행하는 PCIe Switch, RC의 Root Port 등에서 사용한다.
헤더는 64바이트를 차지하며 그 중 첫 16 바이트는 Type 0 헤더와 Type 1 헤더 모두 동일 용도로 사용한다.
3.2 PCIe Bus Enumeration
시스템 부팅 시 Root Complex는 먼저 연결된 모든 장치를 스캔한다. Type 0 헤더 또는 Type 1 헤더의 구성 정보를 읽어 각 장치와 기능을 식별하고 각각의 장치에 고유한 Bus Number, Device Number, Function Number를 할당한다.
- Bus Number : PCIe Topology 내에서 서로 다른 버스를 식별하는 번호로 Bus 0은 Root Complex 자체에 할당되며 첫번 째 연결된 장치는 Bus 1, 두 번째 장치는 Bus 2 등의 방식으로 번호가 지정된다.
- Device Number : 특정 버스에 연결된 여러 장치 중 하나를 식별하는 번호로 각 버스에는 최대 32개의 Device Number(0~31)가 할당될 수 있다. 예를 들어 Bus 1에 여러 장치가 연결되어 있으며 첫 번째 장치는 Device 0, 두 번째 장치는 Device 1 등의 방식으로 식별된다.
- Function Number : 하나의 장치 내에서 서로 다른 여러 기능(모듈 또는 서브장치)을 식별하는 번호이다. 각 Device에는 최대 8개의 Function Number(0~7)가 할당될 수 있다. 예를 들어 하나의 네트워크 카드가 이더넷과 무선 LAN 기능을 동시에 제공할 경우 이더넷 기능은 Function 0, 무선 LAN 기능은 Function 1 등으로 식별된다.
✔️ 리눅스에서 pcituils의 lspci 명령을 사용했을 때 PCIe 장치 목록 앞부분에 나타나는 XX:YY:Z 형식이 Bus:Device.Function 번호를 나타낸다. lspci -tv명령으로 트리뷰로도 볼 수 있다.
4. PCIe Address Space
PCIe는 다음의 세 가지 주소 공간을 사용한다.
1. Configuration space
이 공간은 장치의 식별, 상태, 제어 등의 정보를 담고 있으며, 그 중에서도 첫 64바이트는 Header로 부팅 시 RC에서 각 장치를 식별하고 설정하는데 사용한다. PCI 장치는 256바이트, PCIe는 4KB의 구성 공간을 가지는데, PCIe는 하위 호환성을 유지하기 위해 기존의 PCI와 동일한 256바이트의 공간을 구현하고 나머지 부분은 추가적인 기능을 위해 사용한다.
2. Memory Space
이 공간은 장치가 메모리에 직접 액세스할 수 있도록 하여 대규모 데이터 전송이나 Memory Mapped I/O에 사용된다. RC는 Base Address Registers (BARs)라고 하는 레지스터를 사용하여 각 장치가 메모리 공간의 어느 위치에 맵핑될지 결정한다. (RC는 EP로부터 BAR 설정 요청을 받은 후, 시스템의 메모리 맵에서 해당 장치에 대한 메모리 영역을 할당하고, EP에게 그 주소를 알려준다.)
3. I/O space
별도의 I/O 주소를 통해 장치의 레지스터에 접근해 상호작용하기 위해 사용되는 공간이다. PCIe는 주로 Memory Mapped I/O를 사용하며, I/O space는 주로 레거시 PCI 장치에서 사용된다.
5. PCIe 인터페이스 방식
PCIe는 실제로 패킷 기반 프로토콜이지만 PCIe 프로토콜의 복잡한 부분은 하드웨어가 처리하며 RC 개발자 입장에서는 PCIe 장치의 메모리 맵 주소에 대해 일반적인 메모리 접근 명령어를 사용하여 쉽게 장치와 상호작용할 수 있다.
6. PCIe Slot Pin out
PCIe 슬롯의 핀맵은 특정 설계나 제품에 따라 조금씩 다를 수 있지만 대부분의 PCIe 장치들이 준수하는 표준 규격이 존재한다.
PCIe 커넥터는 보통 Side A와 Side B 양면으로 구성되어 있다. 아래 첨부한 1x Connector Pin-Out을 기준으로 핵심적인 핀 구성에 대해 알아보자.
PCI-Express 1x Connector Pin-Out
1. 전원 관련 핀
- +12V : PCIe 장치에 12V 전압을 공급한다. 주로 고성능 장치(ex. 그래픽 카드 등)에서 사용된다.
- +3.3V : PCIe 장치에 3.3V 전압을 공급하는 핀으로, 3.3V는 대부분의 저전력 장치나 논리 회로가 사용하는 전압이다.
- 3.3Vaux : 장치가 절전 모드에서도 전력을 공급받을 수 있도록 3.3V 대기 전력을 제공한다.
2. 리셋 및 전력 상태 관련 핀
- PERST# : PCI Express Reset 신호이다. 이 핀은 시스템이 부팅되거나 리셋이 필요할 때 PCIe 장치를 초기화하는 데 사용된다. 이 신호가 활성화되면 PCIe 장치는 초기 상태로 돌아가게 된다.
- PWRGD : 전력 상태가 정상적인지 장치에 신호를 보내는 핀이다. 전원이 제대로 공급되고 있는지 확인하기 위한 용도로 사용된다.
3. 핫플러그 관련 핀
- PRSTN#1, PRSTN#2 : Hot Plug Presence Detect 핀으로 장치가 PCIe 슬롯에 꽂히거나 제거될 때 시스템이 이를 인식할 수 있도록 신호를 제공한다. 이 핀을 통해 시스템은 장치의 삽입이나 제거 여부를 감지하고, 동적으로 장치를 사용할 수 있게 된다.
- WAKE# : Link Reactivation 핀으로 PCIe 장치가 절전 모드에서 깨어날 때 사용하는 핀이다. 이 신호가 활성화되면 절전 모드에서 장치를 다시 활성화할 수 있다.
4. 클럭 관련 핀
- REFCLK+, REFCLK- : 참조 클럭 신호이다. 대부분의 PCIe 시스템은 100MHz의 고정 참조 클럭을 사용하며 실제 데이터 속도는 PCIe Gen별로 결정된다. 이 클럭 신호를 기반으로 PCIe 장치 간 데이터 전송이 동기화된다.
5. 데이터 통신 관련 핀
PCIe 슬롯의 크기(x1, x4, x8, x16)에 따라 데이터 핀(Tx/Rx 레인)의 수가 달라진다.
- HSOp(0), HSON(0) : PCIe Lane 0의 데이터 전송을 위한 차동 신호 핀이다.
- HSIp(0), HSIn(0) : PCIe Lane 0의 데이터 수신을 위한 차동 신호 핀이다.
6. JTAG 관련 핀
- JTAG1-JTAG5 : JTAG 신호 핀으로 장치 디버깅 및 테스트를 위한 목적으로 사용된다. 일반적으로 고급 장치에서 회로의 문제를 추적하거나 디버깅할 때 사용된다.
- TRST# : JTAG 테스트 리셋 신호이다. JTAG 디버깅 회로의 리셋을 담당한다.
7. SMBus 관련 핀
- SMCLK : SMBus(시스템 관리 버스) 클럭 핀으로, 전력 관리나 장치 간 통신을 위한 저속 클럭 신호이다.
- SMDAT : SMBus 데이터 핀으로 데이터 전송을 담당한다.
이중에서 필수 신호는 전원 공급 및 신호 안정화를 위한 접지 신호, 리셋 신호와 장치 삽입을 감지하는 신호, 데이터 전송을 위한 차동 클럭 신호와 차동 데이터 신호 쌍이라고 할 수 있다.
참고 : https://pinoutguide.com/Slots/pci_express_pinout.shtml
'임베디드 개발 > 펌웨어' 카테고리의 다른 글
Line Coding (선로 부호화) (0) | 2024.10.30 |
---|---|
SerDes (0) | 2024.10.20 |
ADC SNR (0) | 2024.09.08 |
OP Amp (0) | 2024.09.06 |
오버슈트와 언더슈트 (0) | 2024.08.22 |