PCIe 구조 및 특징 정리



1. PCIe 의 대표적인 특징들

  • 전송과 수신이 동시에 가능한 양방향 통신(bidirectional connection)이 가능합니다. 한 link에서는 보내거나 받는 하나의 역할만을 할 수 있기 때문에, Simplex 2개가 합쳐진 Dual-simplex connection이라고 합니다.
  • Link 안에는 여러 개의 Lane이 있습니다. x1, x2, x4, x8, x16, x32와 같은 방식으로 구성되어있습니다.
  • 이전에 쓰여진 software에서도 지원가능하게 설계됩니다. 이전의 PCI에서 쓰이던 요소들은 유지되고 확장되어가는 형태로 이루어지고 있습니다.
  • 직렬(Serial) 통신은 병렬(Parallel) 통신보다 더 빠른데, 직렬 통신이 병렬 통신의 단점을 극복했기 때문입니다. PCIe에서는 직렬 통신을 사용합니다.
    • 아래와 같은 병렬 통신의 문제점들이 존재합니다.
      • 병렬 버스는 signal을 transmitter에서 reciever로 보내는데 걸리는 시간이 중요해지는데, 이 시간은 flight time이라고 부릅니다. flight time은 clock의 주기보다 더 적어야되는데, 고속신호에서는 이와 같은 상황이 되기 어려워집니다.
      • 전송측과 수신측에서의 clock 도착시간이 다른데, 이를 clock skew 라고 합니다.
      • 주어진 clock에서 signal들이 도착하는 시간이 모두 다른 것을 signal skew 라고 합니다.
    • 위의 문제들을 직렬 통신이 해결하였습니다.
      • clock은 Data stream에 포함되어 signal과 동시에 도착하기 때문에, flight time은 non-issue가 되었습니다.
      • signal skew는 한 Lane에서 한 bit만 들어오기 때문에,
  • Differential Signal을 이용하여 positive와 negiative 신호(D+, D-)를 전송합니다. 수신측에서는 두 신호의 차를 이용하여 신호로 인식합니다. 이는 노이즈가 두 신호에 동일하게 잡혀도 두 신호의 차에서는 노이즈가 제거되기 때문입니다. 예를 들면, [D+] + noise & [D-] + noise 인 상황이라면, 두 신호의 차인 [D+] + noise - ([D-] + noise)는 2D+ 가 되어 노이즈가 제거됩니다.
  • Gen1,2 의 경우 8b/10b encoding을 사용하고, Gen3 이후부터는 128b/130b encoding을 사용합니다. 이는 8bit나 128bit를 보내기 위하여 추가적으로 비트를 더 보내게 되고, 실제로 보내야 하는 비트 수가 각각 10bit, 130bit 이라는 것을 의미합니다.
  • Bridge가 Switch와 Root에 통합되었지만, legacy software는 이를 인지하지 못합니다. 따라서, Root Complex와 Switch 안에 여러 Bridge가 동일한 버스를 공유하는 형태로 인식합니다.
  • CPU와 메모리, 그래픽이 연결되어 있는 경우에는, CPU안에 memory controller와 routing logic가 통합되어 있는 것입니다. 이 경우, Root Complex가 CPU안에 포함되어 있다고 볼 수 있습니다.

2. PCIe Layer

2.1. Device Core / Software Layer

  • PCIe 스펙에 Layer로 등재되지는 않았습니다.
  • Transaction Layer 상단에 있고, 모든 Requests의 목적지이거나 출발지입니다.

2.2. Transaction Layer

2.2.1. Transaction layer의 특징

  • Software Layer의 요청으로 인하여, Transaction layer는 outbound packets를 생성합니다.
  • Software layer에게, Transaction layer는 inbound packets를 검사한 후에 전달해줍니다.
  • TLP는 아래의 Request Type들로 구성되어 있고, Message 타입은 PCIe 때 새로 추가되었습니다.
    • non-posted : 수신측에서 TLP 패킷을 보내면, 응답측에서 Completion 패킷을 보냅니다.
    • posted : 수신측에서 TLP 패킷을 보내더라도, 응답측에서 Completion 패킷을 보낼 필요가 없습니다. Completion 패킷을 보내는 것은 정확성을 높혀주지만, Completion을 대기하는 시간이 걸리기 때문에 성능에 부하를 주게 됩니다. 트레이드 오프가 있기 때문에, 각각의 packet에 역할에 따라 Completion 여부를 채택하였습니다.
Request Type Non-Posted or Posted 여부 축약어
Memory Read Request Non-Posted MRd
Memory Write Request Posted MWr
IO Read Request Non-Posted IORd
IO Write Request Non-Posted IOWr
Configuration Read Request Non-Posted CfgRd
Configuration Write Request Non-Posted CfgWr
Message Request Posted Msg
  • 참고할만 한 Request Type
    • Ordinary Read는 보통 Memory Read에 사용되는 TLP입니다. Locked Read는 Atomic Read-Modify-Write로서 semaphore와 같은 요소들을 프로세서가 사용할 때, 다른 transaction이 들어올 수 없게 합니다.
    • Message의 특징은 아래와 같습니다.
      • 타게팅 한 요소에만 패킷을 보내거나, 모든 엔트포인트에 모두 패킷을 broadcasting 할 수 있습니다.
      • Message는 pin의 개수를 줄일 수 있게 디자인 할 수 있습니다. Message는 인터럽트, 전원 관리 이벤트, 에러 등을 다른 패킷들이 전송되는 경로로 전송해주기 때문에, side-band signal 을 줄일 수 있습니다.
  • TLP의 주요 역할
    • Qos(Quality of Service)
      • QoS는 다른 응용 프로그램, 사용자, 데이터 흐름 등에 우선 순위를 정하여, 데이터 전송에 특정 수준의 성능을 보장하기 위한 능력을 말합니다.
      • Traffic Class(TC) 라고 불리는 3-bit 필드를 이용하여 우선순위를 결정합니다.
      • Virtual Channels(VC) 라고 불리는 다수의 버퍼들이 하드웨어에 들어있습니다.
    • Transaction Ordering

2.2.2. Packet의 구성요소

  • TLP(Transaction Layer Packet)는 Header, Data, ECRC(End-to-End CRC)로 구성되어 있습니다.
    • CRC는 Cyclic Redundacy Check(or Code)의 약자로, error detection 역할을 가지고 있습니다.
  • DLLP(Data Link Layer Packet)에서는 위의 TLP에 Sequence Number와 LCRC(Link CRC)를 추가합니다.
    • LCRC는 Link CRC의 약자로, 인접한 receiver가 error를 check할 때 사용합니다.
  • Physical Layer를 지나면 DLLP에 Start와 End를 추가합니다.
    • PCIe 3.0 이전에는 start와 end에는 control characters가 추가되었습니다.
    • PCIe 3.0 이후에는 control characters가 더 이상 사용되지 않지만, 추가적으로 필요한 정보를 더해주기 위하여 다른 bit들로 채워집니다.
  • DLLP의 큰 3가지 역할은 TLP error correction, flow control, Link Power Management입니다.
    • TLP error correction _ Ack/Nak Protocol
      • Error correction function는 하드웨어 기반의 메카니즘으로 동작합니다. LCRC & Sequence Number가 TLP에 추가되며, 데이터를 전송하기 전까지 TLP는 Replay Buffer에서 대기합니다. 수신 측에서 송신 측이 보낸 패킷에 대하여 잘 받았다는 신호로 Ack/Nack DLLP를 전송해주면, Buffer에서 다음 데이터를 보냅니다.
    • Flow Control
      • 수신측에서는 송신측의 버퍼가 비어있어야 TLP 패킷을 보낼 수 있는데, 이를 위하여 송신측에서는 DLLP를 이용하여 reporting을 해줍니다. 수신측에서는 이를 확인하고 남아있는 버퍼 이상으로 데이터를 보내지 않습니다. 수신측에서 TLP를 다 처리하고 버퍼에서 제거하면, Flow Control Update DLLP를 전송합니다.
    • Power Management
      • DLLP는 Link & system power 상태를 요청할 수 있습니다.

2.4. Physical Layer

  • Physical Layer는 아래의 2가지 part로 나눠집니다.
    • Logical part
      • Digital Logic
      • Start와 End 가 DLLP에서 추가됩니다.
      • packet은 lanes마다 쪼개집니다. 이를 byte striping 이라고 합니다.
      • EMI(Electro-magnetic interference)를 줄이기 위하여 반복되는 패턴을 줄입니다.
      • Link Training and Initialization
        • 두 링크 사이의 원할한 패킷 교환을 위하여 진행되는 과정으로 모든 과정은 automatic 하게 진행됩니다. 다양한 옵션을 자동으로 확인하는데, 아래와 같은 요소들이 체크됩니다.
          • Link width
          • Link data rate
          • Bit lock per Lane
          • Symbol lock per Lane
          • Lane reversal
          • Polarity inversion
          • Lane-to-Lane de-skew(Multi-lane을 사용하는 경우)
    • Electrical part
      • Analog Interface
      • AC 커플링은 AC와 DC 성분을 모두 포함한 신호에서 DC 신호 성분을 걸러내는 커패시터로 구성됩니다.
      • Ordered Set(OS)
        • Physical layer에서 만들어져서, Physical layer에서만 사용되는 type입니다.
        • Gen1/2에서 OS는 COM character로 시작됩니다.
        • Link Training, entry or exit low power state, Clock tolerance compensation(전송측과 수신측간의 internal clock의 차이 보상)

출처

  • PCIe Spec
  • 위키피디아