Skip to content

PCIe

PCI Express (PCIe) là bus nối tiếp, điểm-điểm, dùng để nối CPU với NIC, NVMe, GPU, card FPGA và accelerator. Trang này trình bày giao thức PCIe ở mức kiến trúc chip, theo thứ tự: topology, ba lớp giao thức, các loại TLP, flow control và độ tin cậy, link training, các thế hệ tốc độ, rồi khái niệm cấu hình. Phía driver Linux nằm ở PCIe trong Linux kernel, form factor card ở PCIe CEM, tầng điện ở SerDes.

Topology

PCIe không dùng bus chia sẻ như PCI cũ. Mỗi liên kết (link) là kết nối điểm-điểm giữa hai thiết bị, gồm một hoặc nhiều lane. Mỗi lane gồm hai cặp vi sai, một cặp cho mỗi chiều, nên truyền hai chiều đồng thời (full duplex). Các thiết bị tạo thành cấu trúc cây.

Topology PCIe

Thành phần Vai trò
Root Complex Nối CPU và bộ nhớ với cây PCIe, thường nằm trong CPU hoặc SoC, có một hay nhiều root port
Switch Chuyển giao dịch giữa một upstream port và nhiều downstream port, mở rộng số cổng
Endpoint Thiết bị đầu cuối: NIC, NVMe, GPU, FPGA
Bridge Nối PCIe với PCI hoặc PCI-X cũ

Mỗi function của thiết bị được định danh bằng bộ ba bus, device, function (BDF) dài 8, 5 và 3 bit. Số lane của link ghi dạng x1, x2, x4, x8, x16. Hai đầu tự thỏa thuận số lane và tốc độ lớn nhất cả hai cùng hỗ trợ khi training.

Ba lớp giao thức

PCIe chia thành ba lớp, mỗi lớp thêm phần đầu và phần đuôi riêng vào dữ liệu nhận từ lớp trên.

Ba lớp PCIe và đóng gói TLP

Lớp Đơn vị dữ liệu Nhiệm vụ
Transaction Layer TLP (transaction layer packet) Tạo và nhận giao dịch, flow control theo credit, sắp xếp thứ tự, virtual channel
Data Link Layer DLLP (data link layer packet) và TLP kèm sequence number, LCRC Đảm bảo TLP đến đúng và đủ: ACK/NAK, gửi lại, cập nhật flow control
Physical Layer Ordered set, ký tự khung Framing, mã hóa khối, scrambling, link training (LTSSM), SerDes

Transaction Layer

Mỗi giao dịch là một TLP gồm header (3 hoặc 4 double word, DW, mỗi DW 4 byte), payload tùy chọn và ECRC tùy chọn. Header 4 DW dùng khi địa chỉ 64 bit. Payload tối đa theo cấu hình (max payload size, từ 128 đến 4096 byte).

Loại TLP Chiều Có completion? Công dụng
Memory Read Yêu cầu Có (non-posted) Đọc từ vùng nhớ hoặc BAR của thiết bị
Memory Write Yêu cầu Không (posted) Ghi dữ liệu, không chờ phản hồi
I/O Read, I/O Write Yêu cầu Có Truy cập không gian I/O (tồn tại để tương thích, hiếm dùng)
Configuration Read, Write Yêu cầu Có Đọc ghi config space, Type 0 tới thiết bị đích, Type 1 đi qua bridge
Completion Phản hồi Trả dữ liệu cho request đọc hoặc báo trạng thái
Message Yêu cầu Không Báo ngắt kiểu message, power management, báo lỗi

Các điểm cần lưu ý:

  • Posted và non-posted: write là posted, nên bên gửi không biết kết quả ghi, trừ khi dùng read sau đó. Read là non-posted, bên gửi chờ completion.
  • Ngắt: MSI và MSI-X không phải cơ chế riêng. Thiết bị phát ngắt bằng cách gửi một Memory Write TLP tới địa chỉ do hệ thống cấp, xem SoC / System.
  • DMA: thiết bị đọc ghi bộ nhớ hệ thống bằng Memory Read và Memory Write TLP tới Root Complex, qua IOMMU nếu có.
  • Ordering: các quy tắc sắp xếp quy định TLP loại nào được vượt TLP loại nào, để tránh deadlock và đảm bảo write có thứ tự với nhau.

Flow control

Bên nhận quảng bá số credit còn trống cho từng loại giao dịch: posted, non-posted, completion, mỗi loại tách credit cho header và cho data. Bên phát chỉ gửi TLP khi còn đủ credit và trừ dần; bên nhận cấp lại credit qua DLLP khi giải phóng buffer. Cơ chế này ngăn tràn buffer ở bên nhận mà không cần bỏ gói.

Lớp này gắn vào mỗi TLP một sequence number 12 bit và LCRC 32 bit rồi lưu bản sao trong replay buffer. Bên nhận kiểm tra LCRC và sequence number rồi trả DLLP:

  • ACK: TLP đến đúng, bên phát xóa bản sao tương ứng trong replay buffer.
  • NAK: TLP lỗi, bên phát gửi lại từ gói bị lỗi trở đi.

DLLP còn dùng để cập nhật flow control và báo trạng thái power management. Nhờ ACK/NAK ở từng link, lỗi bit trên đường truyền được che khỏi phần mềm. Bit lỗi chỉ lộ ra ở mức PCIe dưới dạng tăng bộ đếm lỗi correctable.

Physical Layer

Lớp này chia hai phần: phần logic (framing, mã hóa khối, scrambling, phân phối byte lên các lane, link training) và phần điện (SerDes, xem SerDes). Mã hóa khối thay đổi theo thế hệ: 8b/10b cho Gen1 và Gen2, 128b/130b cho Gen3 đến Gen5, và chế độ FLIT với PAM4 cho Gen6 trở lên, xem Line Coding.

Khi cấp nguồn hoặc khi reset, hai đầu liên kết đi qua một máy trạng thái gọi là LTSSM (Link Training and Status State Machine) để phát hiện nhau, thỏa thuận tốc độ và số lane, rồi đưa link vào trạng thái hoạt động.

stateDiagram-v2
    [*] --> Detect
    Detect --> Polling: phát hiện bộ thu ở đầu kia
    Polling --> Configuration: đồng bộ bit và symbol
    Configuration --> L0: thỏa thuận số lane, thứ tự lane
    L0 --> Recovery: lỗi, đổi tốc độ, equalization
    Recovery --> L0
    L0 --> L0s: tiết kiệm điện nhẹ
    L0 --> L1: tiết kiệm điện sâu hơn
    L0s --> L0
    L1 --> Recovery
    Recovery --> Detect: link mất
Trạng thái Ý nghĩa
Detect Bên phát kiểm tra có bộ thu đầu kia hay không (dựa trên trở kháng đầu vào)
Polling Hai đầu gửi ordered set để đồng bộ bit, symbol và xác định tốc độ
Configuration Thỏa thuận độ rộng link, đánh số lane, xử lý đảo cực và đảo thứ tự lane
L0 Trạng thái hoạt động bình thường, truyền TLP và DLLP
Recovery Huấn luyện lại: sau lỗi, khi đổi tốc độ (ví dụ 2,5 GT/s lên 8 GT/s), khi chạy equalization
L0s, L1, L2 Các mức tiết kiệm điện (ASPM và power management do phần mềm điều khiển)
Hot Reset, Disable, Loopback Reset từ phía trên, tắt link, và chế độ kiểm tra

Link luôn khởi động ở 2,5 GT/s rồi mới chuyển lên tốc độ cao nhất hai đầu cùng hỗ trợ qua trạng thái Recovery. Từ Gen3, quá trình này có bước equalization: hai đầu trao đổi yêu cầu chỉnh hệ số FFE của bên phát, kết hợp CTLE và DFE ở bên thu, để mở mắt trên kênh thực tế. Khi training thất bại ở tốc độ cao, link thường hạ về tốc độ thấp hơn hoặc số lane ít hơn thay vì mất hẳn. Hiện tượng link chạy ở tốc độ hoặc độ rộng thấp hơn mong đợi (downtrain) thường chỉ ra vấn đề ở chất lượng kênh hoặc cấu hình board.

Các thế hệ PCIe

Thế hệ Tốc độ mỗi lane Mã hóa Băng thông hữu ích mỗi lane, mỗi chiều (xấp xỉ)
Gen1 2,5 GT/s 8b/10b 0,25 GB/s
Gen2 5 GT/s 8b/10b 0,5 GB/s
Gen3 8 GT/s 128b/130b 0,98 GB/s
Gen4 16 GT/s 128b/130b 1,97 GB/s
Gen5 32 GT/s 128b/130b 3,94 GB/s
Gen6 64 GT/s PAM4, FLIT 256 byte, FEC 7,88 GB/s

Băng thông hữu ích trong bảng là tốc độ bit nhân hiệu suất mã hóa rồi chia 8, chưa trừ overhead của TLP, DLLP và flow control, nên thông lượng thực của ứng dụng thấp hơn. Một link x16 Gen4 do đó đạt khoảng 31,5 GB/s mỗi chiều theo tính toán này. Các thế hệ tương thích ngược: card Gen4 cắm vào khe Gen3 chạy ở tốc độ Gen3.

Gen6 đổi cả cách đóng gói: dữ liệu truyền theo flit cố định 256 byte, trong đó có CRC và FEC nhẹ. FEC cho phép chịu BER thô cao hơn của PAM4 mà không phải gửi lại thường xuyên. Chế độ FLIT bật ở tốc độ Gen6, các tốc độ thấp hơn trên cùng link vẫn dùng khuôn dạng TLP/DLLP như trên. Thế hệ Gen7 (128 GT/s, PAM4) đã được PCI-SIG công bố, nội dung chi tiết chưa được kiểm chứng trong trang này.

Cấu hình và địa chỉ

Mỗi function có một configuration space 256 byte tương thích PCI, mở rộng thành 4 KB với PCIe. Vùng đầu chứa Vendor ID, Device ID, Class Code và các thanh ghi BAR (base address register), mô tả các vùng địa chỉ thiết bị cần ánh xạ vào không gian địa chỉ của CPU. Vùng mở rộng chứa các capability (MSI, MSI-X, power management, AER báo lỗi nâng cao, SR-IOV). Phần mềm truy cập config space bằng Configuration TLP hoặc, trên nhiều nền tảng, qua vùng bộ nhớ ánh xạ (ECAM). Enumeration và cách driver dùng các thanh ghi này xem PCIe trong Linux kernel.

Hai tính năng thường gặp trong SoC và server:

  • SR-IOV: một function vật lý trình ra nhiều virtual function để gán cho các VM, xem I/O Virtualization.
  • Peer-to-peer: hai endpoint trao đổi dữ liệu trực tiếp qua switch mà không đi qua bộ nhớ hệ thống, tùy hỗ trợ của Root Complex và switch.

Liên quan

Tài liệu tham khảo

  • PCI-SIG, PCI Express Base Specification (các Revision 3.0 đến 6.0). Tài liệu dành cho thành viên PCI-SIG. PCI-SIG Specifications
  • Ravi Budruk, Don Anderson, Tom Shanley, PCI Express System Architecture, MindShare, Addison-Wesley, 2003. Mô tả chi tiết ba lớp, TLP và LTSSM (Gen1 và Gen2).
  • Tài liệu kernel về PCI, gồm AER và PCIe port driver: docs.kernel.org/PCI.
  • PCI-SIG, PCI Express 6.0 Specification: PAM4, FLIT mode.