PCIe

**PCI Express**，簡稱 **PCI-E**，官方簡稱 **PCIe**，是電腦匯流排的一個重要分支，它沿用既有的 PCI 編程概念及訊號標準，並且構建了更加高速的串行通信系統標準。目前這一標準由 PCI-SIG 組織制定和維護。PCIe 僅應用於內部互連。由於 PCIe 是基於既有的 PCI 系統，所以只需修改實體層而無須修改軟體就可將現有 PCI 系統轉換為 PCIe。

PCIe 擁有更快的速率，所以幾乎取代了以往所有的內部匯流排（包括 AGP 和 PCI）。現在英特爾和 AMD 已採用單晶片組技術，取代原有的南橋／北橋方案。

除此之外，PCIe 裝置能夠支援熱拔插以及熱交換特性，目前支援的三種電壓分別為 + 3.3V、3.3Vaux 以及 + 12V。

考慮到現在顯示卡功耗的日益增加，PCIe 而後在規範中改善了直接從插槽中取電的功率限制，×16 的最大提供功率一度達到了 75W，相對於 AGP 8X 介面有了很大的提升。

PCIe 保證了相容性，支援 PCI 的作業系統無需進行任何更改即可支援 PCIe 總線。這也給使用者的升級帶來方便。由此可見，PCIe 最大的意義在於它的通用性，不僅可以讓它用於南橋和其他裝置的連接，也可以延伸到晶片組間的連接，甚至也可以用於連接圖形處理器，這樣，整個 I/O 系統重新統一起來，將更進一步簡化電腦系統，增加電腦的可移植性和模組化。

## 歷史

在 2001 年的春季英特爾開發者論壇（IDF）上 Intel 公布取代 PCI 匯流排的第三代 I/O 技術，被稱為「3GIO」。該匯流排的規範由 Intel 支援的 AWG（Arapahoe Work Group）負責制定。2002 年 4 月 17 日，AWG 正式宣布 3GIO 1.0 規範草稿制定完畢，移交 PCI 特殊興趣組織（PCI-SIG）進行稽核，2002 年 7 月 23 日經過稽核後正式公布，改名為「PCI Express」，並根據開發藍圖在 2006 年正式推出 Spec 2.0（2.0 規範）。2019 年 5 月 28 日，PCI-SIG 官方發布了 PCIe 5.0 的 1.0 版基礎規範，規範主要定義了 PCIe5.0 的架構（architecture）、互聯屬性規範（interconnect attributes）、網路結構管理（fabric management）以及編程介面（programming interface）等內容。

以 PCIe 2.0 為例，每秒 5GT（Gigatransfer）原始數據傳輸率，編碼方式為 8b/10b（每 10 個位元只有 8 個有效數據），即有效頻寬為 4Gb/s = 500MByte/s。

## PCI Express 與其他傳輸規格比較

PCIe 的規範主要是為了提升電腦內部所有匯流排的速度，因此頻寬有多種不同規格標準，其中 PCIe ×16 是特別為顯示卡所設計。AGP 的資料傳輸效率最高為 2.1GB／s，不過對上 PCIe ×16 的 8GB／s，很明顯的就分出勝負，但 8GB／s 是指資料傳輸的理想值，並不是使用 PCIe 介面的顯示卡，就能夠有突飛猛進的效能表現，實際的測試數據並不會有這麼大的差異存在。

計算公式：PCI-E 串行匯流排頻寬（MB/s） = 串行匯流排時脈頻率（MHz）\* 串行匯流排位寬（bit/8 = B）\* 串行匯流排管線 \* 編碼方式 \* 每時鐘傳輸幾組資料（cycle），例：雙工 PCI-E 1.0 X1，其頻寬 = 2500\*1/8\*1\*8/10\*1\*2=500 MB/s。

PCI Express 1.0 匯流排頻率 2500 MHz，這是在 100 MHz 的基準頻率通過鎖相環振盪器（Phase Lock Loop，PLL）達到的。PCI-E 2.0 匯流排頻率從 2.5GHz 提高到 5GHz，3.0 則提高到 8GHz，編碼方式變成 128/130。

## PCI Express 的硬體協定

PCIe 的連接是建立在一個單向的序列的（1-bit）對等連接基礎之上，這稱之為_通道_（lane）。這一點上 PCIe 連接與早期 PCI 連接形成鮮明對比，PCI 連接基於匯流排控制，所有裝置共享雙向 32 位元並列匯流排。PCIe 是一個多層協定，由事務層，資料交換層和實體層構成。實體層又可進一步分為邏輯子層和電氣子層。邏輯子層又可分為物理代碼子層（PCS）和媒介接入控制子層（MAC）。這些術語借用自 IEEE 802 網路協定模型。PCIe 通過 ASPM 協定進行電源管理。

### 實體層

於使用電力方面，每組管線使用兩個單向的低電壓差分訊號（LVDS）合計達到 2.5 Gbit/s。傳送及接收不同資料會使用不同的傳輸通道，每一通道可運作四項資料。兩個 PCIe 裝置之間的連接成為「連結」，這形成 1 組或更多的傳輸通道。各個裝置最少支援 1 傳輸通道（x1）的連結。也可以有 2，4，8，16，32 個通道的連結。這可以更好的提供雙向相容性（x2 模式將用於內部介面而非插槽模式）。PCIe 卡能使用在至少與之傳輸通道相當的插槽上（例如 x1 介面的卡也能工作在 x4 或 x16 的插槽上）。一個支援較多傳輸通道的插槽可以建立較少的傳輸通道（例如 8 個通道的插槽能支援 1 個通道）。PCIe 裝置之間的連結將使用兩裝置中較少通道數的作為標準。一個支援較多通道的裝置不能在支援較少通道的插槽上正常工作，例如 x4 介面的卡不能在 x1 的插槽上正常工作（插不入），但它能在 x4 的插槽上只建立 1 個傳輸通道（x1）。PCIe 卡能在同一資料傳輸通道內傳輸包括中斷在內的全部控制資訊。這也方便與 PCI 的相容。多傳輸通道上的資料傳輸採取交叉存取，這意味著連續位元組交叉存取在不同的通道上。這一特性被稱之為「資料條紋」，需要非常複雜的硬體支援連續資料的同步存取，也對連結的資料吞吐量要求極高。由於資料填充的需求，資料交叉存取不需要縮小封包。與其它高速數傳輸協定一樣，時鐘資訊必須嵌入訊號中。在實體層上，PCIe 採用常見的 8B/10B 代碼方式來確保連續的 1 和 0 字串長度符合標準，這樣保證接收端不會誤讀。編碼方案用 10 位編碼位元代替 8 個未編碼位元來傳輸資料，占用 20% 的總頻寬。到了 PCIe 3.0，採用 128B/130B 代碼方式，僅占用 1.538% 的總頻寬。有些協定（如 SONET）使用另外的編碼結構如「不規則」在資料流中嵌入時鐘資訊。PCIe 的特性也定義一種「不規則化」的運算方法，但這種方法與 SONET 完全不同，它的方法主要用來避免資料傳輸過程中的資料重複而出現資料散射。第一代 PCIe 採用 2.5GT/s 單訊號傳輸率，PCI-SIG 計劃在未來版本中增強到 5~10GT/s。

### 資料鏈路層

資料鏈路層採用按序的交換層資訊包（Transaction Layer Packets,TLPs），是由交換層生成，按 32 位元迴圈冗餘校驗碼（CRC，本文中用 LCRC）進行資料保護，採用著名的協定（Ack and Nak signaling）的資訊包。TLPs 能通過 LCRC 校驗和連續性校驗的稱為 Ack（命令正確應答）；沒有通過校驗的稱為 Nak（沒有應答）。沒有應答的 TLPs 或者等待逾時的 TLPs 會被重新傳輸。這些內容儲存在資料鏈路層的快取內。這樣可以確保 TLPs 的傳輸不受電子噪音干擾。PCIe 對於 ACK 有所規範，在收到 TLP 封包之後，在一定時間內必須回應 ACK，也就是 ACK 延遲（ACK Latency）的等待時間。因應 ACK/NAK 流程的需要，必須實作出重新播送緩衝器（Replay Buffer）。

TLPs 加上 Sequence number 以及 16 位元 CRC 後，被包裹成為資料鏈路層資訊包（Data Link Layer Packet,DLLP），除了資料傳遞外，交握訊號 ACK 和 NAK 訊號亦被包裹在資訊包中傳送，除此之外也用來傳送兩個互連裝置的交換層之間的流控制資訊和實現電源管理功能。

### 事務層

PCI Express 採用分離交換（資料提交和應答在時間上分離），可保證傳輸通道在目標端裝置等待傳送回應資訊傳送其它資料資訊。

PCI Express 採用可信性流控制。這一模式下，一個裝置廣播它可接收快取的初始可信號誌。連結另一方的裝置會在傳送資料時統計每一傳送的 TLP 所占用的可信號誌，直至達到接收端初始可信訊號最高值。接收端在處理完畢快取中的 TLP 後，它會回送傳送端一個比初始值更大的可信號誌。可信訊號統計是客製化的標準計數器，相比於其他方法，如基於握手的傳輸協定，這一模式的優勢在於可信訊號的回傳反應時間不會影響系統效能，因為如果雙方裝置的快取足夠大，是不會出現達到可信訊號最高值的情況，這樣傳送資料不會停頓。

第一代 PCIe 標稱可支援每傳輸通道單向每秒 250 MB 的資料傳輸率。這一數字是根據物理訊號率 2500 Mbit/s 除以編位元速率（10 位／每位元組）計算而得。這意味著一個 16 通道（x16）的 PCIe 卡理論上可以達到單向 250\*16=4000 MB/s（3.7 GB/s）。實際的傳輸率要根據資料有效載荷率，即依賴於資料的本身特性，這是由更高層（軟體）應用程式和中間協定層決定。

PCI Express 與其它高速序列連接系統相似，它依賴於傳輸的強健性（CRC 校驗和 ACK）。長時間連續的單向資料傳輸（如高速儲存裝置）可以達到 > 95% 的 PCIe 通道資料傳輸利用率。這樣的傳輸受益於增加的傳輸通道（x2, x4 等）。但大多數應用程式如 USB 或乙太網路控制器會把傳輸內容拆成小的封包，同時還會強制加上確認訊號。這類資料傳輸由於增加封包的解析和強制中斷，降低傳輸通道的效率。作為一個在同一個印刷電路板（PCB）裝置間的通信協定，它不需要達到其他遠距離通信協定要求的高資料傳輸錯誤容忍度，而且，這種效率的降低並非只出現在 PCIe 上。

### 引腳

下表列出在邊緣連接器上的 PCI Express 卡兩側的導線。在印刷電路板（PCB）的焊接側為 A 側，並且組件側的 B 側。PRSNT1# 和 PRSNT2# 引腳必須比其餘稍短，以確保熱插入卡完全插入。該 WAKE# 引腳採用全電壓喚醒計算機，但必須拉高從備用電源，以表明該卡是能夠喚醒。

## 格式標準

* 半高卡
* Mini PCIe：用以代替 Mini PCI 卡（支援 x1 PCIe、USB 2.0 和 SMBus 匯流排介面）。
* ExpressCard：類似 PC 卡介面標準（支援 x1 PCIe、USB 2.0/3.0、熱插拔）。
* PCI Express ExpressModule：支援熱插拔的介面標準，用於伺服器和工作站上。
* XMC：類似 CMC／PMC 介面標準（支援 x4 PCIe 或串行 RapidI/O）。
* AdvancedTCA：用以代替 Compact PCI 卡，支援串行背板拓撲結構基礎。
* AMC：AdvancedTCA 規範的補充，支援處理器和 I/O 模組在 ATCA 板上（x1、x2、x4 或 x8 PCIe）。
* PCI Express 外置接線。
* Mobile PCI Express Module（MXM）輝達所發明的圖形模組規範。
* Advanced eXpress I/O Module（AXIOM）圖形模組，由 ATI 認可。
* Thunderbolt
* M.2
* U.2

## 競爭協定

基於高速序列構架產生了很多傳輸標準，包括 HyperTransport、InfiniBand、RapidIO 和 StarFabric 等等。這些標準均有業界的不同企業支援，背後也都有大量的資金投入標準的研究開發，所以每一標準都聲稱自己與眾不同，獨占優勢。主要的差異在於可延伸性、靈活性與反應時間、單位成本的取捨平衡各不相同。其中的一個例子是在傳輸包上增加一個複雜的頭資訊以支援複雜路由傳輸（PCI Express 不支援這種方式）。這樣的資訊增加降低了介面的有效頻寬也使傳輸更複雜，但是相應創造了新的軟體支援此功能。這種架構下需要軟體追蹤網路拓撲結構的變化以實現系統支援熱插拔。InfiniBand 和 StarFabric 標準即能實現這一功能。另一個例子是縮小資訊包以減少反應時間。較小的資訊包意味著包頭占用了包的更大百分比，這樣又降低了有效頻寬。能實現此功能的標準是 RapidIO 和 HyperTransport。PCI Express 取中庸之道，定位於設計成一種系統互連介面而非一種裝置介面或路由網路協定。另外為了針對軟體透明，它的設計目標限制了它作為協定，也在某種程度上增加了它的反應時間。

## 應用與前景

在 2005 年，PCIe 已近乎成為新的個人電腦主機板標準。關於此有不少評論，但最基本的原因是它對於軟體開發者完全透明 —— 為 PCI 所設計的作業系統可以不做任何代碼修改來啟動 PCIe 裝置。其二，它能增強系統效能，還有強有力的品牌認知。各類網卡、音效卡、顯示卡，以及當下的 NVMe 固態硬碟都使用了 PCIe 標準。下面為主流的使用 PCIe 的外設產品。

#### 顯示卡

大部分新型的 AMD 或 NVIDIA 顯示卡都使用 PCIe 標準。NVIDIA 在它新開發的 SLI 上採用 PCIe 的高速資料傳輸，這使得兩塊相同晶片組顯示卡可同時工作於一台電腦之上。AMD 公司也基於 PCIe 開發一種兩個 GPU 一同運作的技術，稱為 CrossFire。

#### 硬碟

當下主流的固態硬碟介面有 M.2、U.2、PCIe、SATA、SATA Express、SAS 等。M.2 和 U.2 可選 PCIe 介面。NVMe 協定是目前最高效的 PCIe SSD 協定標準。

## 參考文獻

## 參見

* PCI
* PCI-X
* M.2
* USB Type-C
* Express Card
* USB 3.1