PCIE系統標準體系結構解讀(二):體系結構概述之PCIe 的設備層

1.2.1 概述

PCIe 規範定義了一種分層的設備設計體系結構。這些層分爲處理層(Transaction Layer)、數據鏈路層(Data Link Layer)和物理層(Physical Layer),在垂直方向上又可以進一步分成兩部分:處理出站流量的發送部分和處理入站流量的接收部分。

 

1.2.2 設備層及相關的數據包

1.2.2.1 處理層事務包(TLP)

TLP 數據包的裝配

 

軟件層/設備核心層將裝配 TLP 核心部分所需要的信息發送到處理層,這部分信息是 TLP 數據包的頭和數據部分。某些 TLP 不包含數據部分。接下來要計算可選的端到端的 CRC(ECRC) 字段並將其附加到數據包中,因爲該數據包的最終目標設備要使用 ECRC 字段來檢查 TLP 頭和數據部分中的 CRC 錯誤。

TLP 的核心部分被轉發至數據鏈路層,然後由數據鏈路層爲其附加序列 ID 和 LCRC 字段。鏈路另一端的相鄰接收器設備使用該 LCRC 字段檢查 TLP 的核心部分和序列 ID 中的 CRC 錯誤。裝配後的 TLP 被轉發至物理層,由物理層再附加各一字節的開始和結束成幀字符。然後,對數據進行編碼,並使用鏈路上可用的通道差動發送數據包。

TLP數據包的拆解

 

臨近的接收器設備接受進入的 TLP 比特流。物理層解碼接收到的 TLP ,剝去開始和結束幀字段。得到的 TLP 被髮送至數據鏈路層,由數據鏈路層檢查該 TLP 中的任何錯誤,並剝去序列 ID 和LCRC 字段。沒有 LCRC 錯誤,則該 TLP 將被向上轉發至物理層。如果接收設備是交換器,那麼交換器將根據 TLP 頭中包含的地址信息將該數據包由交換器的一個端口路由至一個出端口。允許交換器檢查 ECEC 錯誤,甚至報告它發現的錯誤。但不允許交換器修改 ECRC,如果存在這樣的錯誤,該 TLP 的目標設備將檢測到一個 ECRC 錯誤。

該 TLP 的最終目標設備負責檢查其頭和數據部分中的 ECRC 錯誤。在剝去 ECRC 字段後,留下該數據包的頭和數據部分,而正是這些信息將最終被轉發至設備核心/軟件層。

        1. 數據鏈路層數據包(DLLP)

 

DLLP 數據包源於發送器設備的數據鏈路層,終止於接收器設備的數據鏈路層。當 DLLP 通過 PCIe 鏈路從一臺設備傳送到另一臺設備時,物理層對 DLLP 的裝配和拆解也起作用。

DLLP 可用於鏈路管理功能,包括與 ACK/NAK 協議相關的 TLP 確認,電源管理和流控制信息的交換。

DLLP 在鏈路上兩個直連組件的數據鏈路層之間傳輸。與通過 PCIe 結構傳輸的 TLP 不同,DLLP 不通過交換器。DLLP 也不包含路由信息。與 TLP 相比,這些數據包較小,爲 8 個字節。

DLLP 的裝配

DLLP 有多種類型,包括流控制 DLLP,確認 TLP 接收的確認/否認 DLLP(ACK 和 NAK)、電源管理 DLLP(PMx)。DLLP 的類型字段會標識出各種 DLLP 的類型。數據鏈路層在 DLLP 上附加 16bits 的 CRC ,DLLP 接收器用來檢查 DLLP 中的 CRC 錯誤。

DLLP 的內容和 16bits CRC 一起被轉發至物理層,物理層在該數據包中附加各 1 字節的開始和結束成幀字符。然後對數據包進行編碼,並利用可用通道在鏈路上差動發送數據包。

DLLP 的拆解

由接收設備的物理層接收  DLLP ,解碼接收的比特流並剝去其開始和結束幀字段。再將得到的數據包發送至數據鏈路層,由該層檢查 CRC 錯誤並剝去 CRC 字段。數據鏈路層時 DLLP 的目的地,不再向上面的處理層轉發。

 

1.2.2.3 物理層數據包(PLP)

PLP 源於發送器設備的物理層,終止與接收器設備的物理層。PLP 是一種非常簡單的數據包,開始是 1 字節的 COM 字符,後面是定義 PLP 類型以及含有其它信息的 3 個或多個字符。PLP 的大小是 4 字節的整數倍。規範將這種數據包成爲有序集(Ordered Set)。PLP 不包含任何路由信息,不會被路由通過結構,也不會通過交換器進行傳播。在鏈路定向過程中會使用一些 PLP,一些 PLP 可以用於時鐘容差補償,還可以用PLP 將鏈路置於電氣空閒低功率狀態,或者從這種低功率狀態喚醒鏈路。

 

1.2.4 各 PCIe 設備層的功能

下圖是一個更詳細的 PCIe 設備層模塊圖。該模塊圖可用來解釋每層的主要功能,以及生成出站流量和相應入站流量時每一層的功能。這些層包括設備核心/軟件層、處理層、數據鏈路層和物理層。

 

1.2.4.1 設備核心/軟件層

設備核心由根聯合體核心邏輯或注入以太網控制器、SCSI 控制器、USB 控制器等端點核心邏輯組成。

發送部分:設備核心邏輯與本地軟件一起提供PCIe 設備生成 TLP 所需的必要信息。這些信息通過發送接口發送至設備的處理層。發送至處理層的信息包括:事務類型、地址、發送的數據量、數據、流量類別、消息索引等。

接收部分:設備核心邏輯負責通過接收接口來接收處理層發送的信息。這些信息包括:處理層接收的 TLP 的類型、地址、接收的數據量、數據、接收的 TLP 的流量類別、消息索引以及錯誤情況等。

1.2.4.2 處理層

處理層負責生成出站 TLP 流量和接收入站 TLP 流量。處理層支持用於非報告事務的分離事務協議。處理層會將給定標記值的入站完成 TLP 與早先發送的相同標記值的出站非報告請求 TLP 聯繫起來。

處理層含有虛擬信道緩衝區(VC 緩衝區),用來存儲等待發送的出站 TLP 以及從鏈路上接收的入站 TLP。與這些虛擬信道緩衝區相關的流控制協議能保證遠程發送器不會發送太多的 TLP,因而不會引起接收器接收器虛擬信道緩衝區溢出。發送前,處理層還能根據順序規則對 TLP 排序。支持服務質量(QoS)協議的正是該層。

處理層支持 4 種地址空間:存儲器地址空間、IO 地址空間、配置地址空間和消息空間。消息數據包內包含信息。

發送部分:處理層從設備核心接收信息並生成出站請求和保存在虛擬信道緩衝區中的完成 TLP,同時負責裝配處理層數據包(TLP)。TLP 的主要組成部分是:頭、數據有效載荷和一個可選的 ECRC (規範中也是用摘要(Digest)這一術語)字段。

頭的大小爲 3 或 4 個雙字,並且可以包含諸如地址、TLP 類型、傳送大小、請求者ID/完成者ID、標記、流量類別、字節允許、完成代碼和屬性(包括“不偵測(no snoop)”和“靈活的順序”比特)等字段。

對於存儲器請求,該地址是 32bits 的存儲器地址或擴展的 64bits 地址。對於 IO 請求,該地址是 32bits 的地址。對於配置事務,該地址時由總線號、設備號和功能號再加上目標寄存器的配置寄存器地址組成的 ID。對於完成 TLP,該地址是最初發出請求設備的請求者 ID。對於消息事務,用來路由的地址時目的地設備的 ID,它由總線號、設備號和消息請求的目標設備的功能號所組成。消息請求也可以由目標根聯合體或上游端口隱式廣播或路由。

傳送大小或長度字段指出要傳送的數據量,計算時以雙字爲單位。數據傳送長度可以是 1~1024 個 DW。寫請求 TLP 在其頭的長度字段中指定的這個量包括數據有效載荷。對於讀請求 TLP,長度字段指出向完成者請求的數據量。這些數據在 1 個或多個完成數據包中返回。讀請求 TLP 沒有包含數據有效載荷字段。字節允許指定了解析字節級地址的方法。

請求數據包中包含發送請求設備的請求者 ID (總線號、設備號、功能號)。完成者將記住請求中的標記字段並在完成中使用相同的標記。

頭中的一個比特(TD = TLP 摘要)指出該數據包是否含有 ECRC 字段,又稱爲摘要。該字段 32bits 位寬,含有端到端 CRC(ECRC)。ECRC 字段是由處理層在創建出站 TLP 時生成的,並且是根據整個 TLP,從頭的第一個字節一直到數據有效載荷的最後一個字節(不包括  EP 比特和類型(Type)字段的bit0。在計算 ECRC時,認爲則兩個比特總是 1 計算的。當 TLP 通過結構時,它從不會變化。當數據包通過結構時,接收設備檢查可能出現的 ECRC 錯誤。

接收部分:處理層的接收部分將入站 TLP 保存在虛擬信道緩衝區中。接收器根據 TLP 中的 ECRC 字段檢查 CRC 錯誤。如果沒錯。刪去 ECRC 字段,然後將在 TLP 頭中得到的信息以及數據有效載荷發送給設備核心。

流控制:流控制是在硬件級自動管理的,且對軟件是透明的。軟件僅僅涉及使超出虛擬信道緩衝區默認設置(成爲 VC0 緩衝區)的其它緩衝區可用。鏈路定向後,自動啓用默認的緩衝區。因而在鏈路定向之後,允許 TLP 流量立即通過結構。配置事務使用默認虛擬信道緩衝區,並且在鏈路定向過程結束後可以立即開始。

接收設備定期地發送一種稱爲流控制數據包(FCx DLLP)的 DLLP 給發送設備。該 FCx DLLP 含有流控制信用(credit)信息,用來更新發送器關於接收器虛擬信道緩衝區還有多少可用空間的信息。發送器會追蹤這一信息,並且在知道遠程接收器有多少空間可以接收 TLP 時,才發送 TLP 離開其物理層。

服務質量(QoS):指的是以不同的優先級和確定的延遲及帶寬路由不同應用程序的數據包通過結構的能力。PCI 和 PCI-X 系統不支持 QoS 能力。能實現多組虛擬信道緩衝區的  PCIe 設備具有仲裁來自不同 VC 緩衝區的 TLP 的能力。VC 緩衝區的優先級時可配置的。因此不同 VC 緩衝區中流過系統的流量將遵守不同的性能。在流過不同 VC 緩衝區的 TLP 流量之間進行仲裁的機制成爲 VC 仲裁。

流量類別(TC)和虛擬信道(VC):TC 是在數據包內發送的一個 TLP 頭字段,在端到端通過結構時沒有改變。本地應用軟件和系統軟件應根據性能要求確定某個 TLP 使用什麼樣的 TC 標誌。VC 是物理緩衝區,它通過使用發送和接收器虛擬信道緩衝區,提供一種在物理鏈路上支持多個獨立邏輯數據流的手段。PCIe 設備可以最多實現 8 個 VC 緩衝區(VC0~VC7)。TC 字段是一個 3bits 長的字段,可以將不同的流量分成 8 種流量類別(TC0~TC7)。設備必須實現 VCO。設備或交換器要實現 TC-VC 映射邏輯,把給定 TC 號的 TLP 使用特定的 VC 號的緩衝區通過鏈路轉發。PCIe 具有映射多個 TC到一個 VC 的能力,因而可通過提供有限數目的 VC 緩衝區支持來降低設備成本。

端口仲裁和 VC 仲裁:處理層支持仲裁的目的是:爲結構內的數據流提供不同的服務;提供確定的、有保證的帶寬並使端到端事務延遲最小。端點設備和只有一個端口的根聯合體不支持端口仲裁,僅支持處理層 VC 仲裁。

事務順序:事務順序規則可以保證與給定流量類別相關的 TLP 流量以正確的順序路由通過結構,以防止可能發生死鎖或活鎖現象。與不同TC 標誌相關的流量之間沒有次序關係。處理層保證在將給定 TC 的 TLP 轉發至數據鏈路層和物理層傳輸之前,對它和其他 TC 標誌相同的 TLP 正確排序。

電源管理:處理層支持 ACPI/PCI 電源管理,同系統軟件要求的一樣。處理層硬件可自動管理某設備的電源,使其在工作電源狀態的功耗最小。這種自動電源管理成爲活動狀態電源管理,與軟件無關。與 OS 有關的電源管理軟件通過電源管理配置寄存器管理某一設備的電源狀態。

配置寄存器:設備的配置寄存器與處理層有關。這些寄存器將在初始化和總線計數期間配置。也可以由設備驅動程序配置,由運行時軟件/OS 訪問。這些寄存器要負責保存已協商的鏈路功能,例如鏈路帶寬和頻率。

1.2.4.3 數據鏈路層

數據鏈路層的主要功能是保證在各鏈路上發送和接收數據包時數據的完整性。如果某發送器設備發送一個 TLP 至鏈路另一端的遠程接收器設備,並且檢測到了一個 CRC 錯誤,則發送器設備會得到一個 NAK DLLP,而且該發送器設備會自動發送該 TLP。在錯誤檢查和接收數據包有錯重發的情況下,PCIe 能以非常高的概率保證由一臺設備發送的 TLP 能夠毫無錯誤地到達其最終目的地。

發送部分:在轉發出站 TLP 至數據鏈路層前,數據鏈路層必須遵守流控制機制。如果存在足夠的信用,保存在虛擬信道緩衝區內的 TLP 將從處理層被傳遞至數據鏈路層準備發送。

下圖顯示了與數據鏈路層的 ACK-NAK 機制有關的邏輯。數據鏈路層負責 TLP CRC 的產生和 TLP 錯誤檢查。對於發送設備 A 的出站 TLP,將生成鏈路 CRC(LCRC)並附加在 TLP 上。另外,還要講一個序列 ID 附加在 TLP 上。設備 A 的數據鏈路層在重放緩衝區中保留該 TLP 的一個副本併發送該 TLP 給 B。數據鏈路層的遠程設備 B 接收該 TLP 並檢查 CRC 錯誤。

如果沒有錯誤,設備 B 的數據鏈路層返回一個帶序列 ID 的 ACK DLLP 給設備 A。設備 A 可以確認該 TLP 已經成功到達設備 B。同時,設備 A 清除其重放緩衝區中與該序列 ID 有關的 TLP。

如果遠程設備 B 在接收到的 TLP 中檢測到了 CRC 錯誤,則一個帶序列 ID 的NAK DLLP 將被返回到設備 A。若在 TLP 傳輸過程中出現了錯誤,設備 A 的數據鏈路層將重發重放緩衝區中相關的 TLP。數據鏈路層生成用於錯誤報告和記錄機制的錯誤標記。

對於重放緩衝區中某一給定的 TLP,如果發送器設備接受了某一 NAK 4 次,結果將導致該 TLP 另外被重發了 3 次,則數據鏈路層記錄此錯誤,報告一個可糾正的錯誤並重新定向該鏈路。

接收部分:數據鏈路層的接收端負責入站 TLP 的 LCRC 錯誤檢查。如果沒有檢測到錯誤,該設備安排一個 ACK DLLP 傳回遠程的發送器設備。接收器設備還要負責剝去該 TLP 的LCRC 字段和序列 ID。數據鏈路層的接收端還能接收遠程設備的 ACK 和 NAK。如果接收到一個 ACK,數據鏈路層的接收端會通知發送端清除重放緩衝區中相關的 TLP。如果接收到一個 NAK,接收端引起發送端的重放緩衝區重發相關的 TLP。

接收端還負責檢查接收 TLP 中的序列 ID,以檢驗丟失的或失序的 TLP。

數據鏈路層對 TLP DLLP 的影響:數據鏈路層將一個 12bits 的序列 ID 和 32bits 的 LCRC 字段與從處理層得到的出站 TLP 連接在一起。得到下圖的 TLP。序列 ID 可以用來將重放緩衝區中保存的出站 TLP 的副本與從相鄰遠程設備接收的入站 ACK/NAK DLLP 聯繫起來。ACK/NAK DLLP 確認出站 TLP 已到達遠程設備。

該 32bits 的 LCRC 是根據 TLP 的所有字節,包括序列 ID 計算出來的。

DLLP 是一個 CRC 字段爲 16bits 的 4 字節數據包。8bits 的 DLLP 類型字段可以表示各種類型的 DLLP,包括 ACK、NAK、與電源管理有關的 DLLP(PM_Enter_L1、PM_Enter_L23、PM_Active_State_Request_L1、PM_Request_L1)和與流控制有關的 DLLP(InitFC1-P、InitFC1-NP、InitFC1-Cpl、InitFC2-P、InitFC2-NP、InitFC2-Cpl、UpdateFC-P、UpdateFC-NP、UpdateFC-Cpl)。16bits 的 CRC 是利用 DLLP 的所有4 個字節計算出來的。接收到 CRC 檢查失敗的 DLLP 被丟棄。丟棄一個 DLLP 損失的信息是自修復的,因而後續的 DLLP 將代替丟失的信息。ACK 和 NAK DLLP 含有設備可以用來將入站的 ACK 和 NAK DLLP 與重放緩衝區中保存的 TLP 副本關聯起來的序列 ID 字段(如下圖中雜項字段所示)。

說明 ACK-NAK 協議的非報告事務:

步驟1a:請求者發送一個存儲器讀請求 TLP(MRd)。交換器接收 MRd TLP 並利用 MRd TLP 中的 LCRC 字段檢查 CRC 錯誤;

步驟1b:如果沒有錯誤,則交換器返回一個 ACK DLLP 給請求者。請求者丟棄其重放緩衝區中該 TLP 的副本。

步驟2a:交換器利用存儲器地址進行路由,轉發 MRd TLP 至正確的出端口。完成者接收 MRd TLP,並利用 LCRC 檢查接收 MRd TLP 中的 CRC 錯誤;

步驟2b:如果沒有錯誤,則返回者返回一個 ACK DLLP給交換器。見換氣丟棄其重放緩衝區中該 MRd TLP 的副本;

步驟3a:完成者利用 MRd TLP 中的可選字段 ECRC 來檢查 CRC 錯誤。假設沒有端到端錯誤。當完成者得到請求的數據時,它返回一個帶數據 TLP 的完成(CplD)。交換器接收 CplD TLP,並利用 LCRC 檢查 CRC 錯誤;

步驟3b:如果沒有錯誤,則交換器返回一個 ACK DLLP 給完成者。完成者丟棄其重放緩衝區中該 CplD TLP 的副本;

步驟4a:交換器解碼 CplD TLP 中的請求者 ID 字段,並路由該數據至正確的出端口。請求者接收 CplD TLP,並利用 LCRC 來檢查接收 CplD TLP 中的 CRC 錯誤;

步驟4b:如果沒有錯誤,則請求者返回一個 ACK DLLP 給交換器。交換器丟棄其重放緩衝區中該 CplD TLP 副本。請求者可以利用可選 ECRC 字段中的 CRC 字段確定該 CplD TLP 是否有錯。假設沒有端到端錯誤,請求者檢查 CplD 中的完成錯誤代碼。假設完成代碼是“成功完成”。爲了將完成與原請求關聯起來,請求者將 CplD 中的標記與原 MRd 請求中的標記相匹配,並且接收數據。

數據鏈路層的其他功能:加電或復位後,流控制機制將由數據鏈路層初始化。這一過程是在硬件層次上自動完成的,沒有軟件的參與。

默認虛擬通道 VC0 的流控制首先被初始化。當軟件激活其它 VC 時,對每一新激活的 VC 要重讀流控制初始化過程。

1.2.4.4 物理層

物理層分成兩部分:邏輯物理層和電氣物理層。邏輯物理層包括在鏈路上發送之前,對數據包進行有關處理的數字邏輯,或在發送數據包至數據鏈路層之前,對從鏈路上入站的數據包進行處理的數字邏輯。電氣物理層是連接物理層和鏈路的模擬接口,由各通道的差動驅動器和差動接收器組成。

發送部分:來自數據鏈路層的 TLP 和 DLLP 被定時輸入到邏輯物理層的緩衝區中。物理層在 TLP 和 DLLP 前後分別添加一個開始和結束成幀字符。這一符號時成幀編碼字節,接收設備利用它來監測數據包的開始和結束。附加在一個 TLP 和 DLLP 上的開始和結束字符如下圖所示。

發送邏輯子部分將從數據鏈路層接收的數據包整理成正確的發送格式。數據包被拆分成字節,由鏈路上的可用通道傳送。

然後,用線性反饋移位寄存器類型的擾頻器加擾數據包中的每個字節。通過加擾各個字節,可以消除鏈路上重複的比特模式,從而降低所產生的平均 EMI 噪聲。

得到的字節由 8b/10b 編碼邏輯編碼成 10b 的代碼。將 8b 的字符編碼成 10b 符號的主要目的,是使比特流中有足夠多的 1 到 0 和 0 到 1 的轉換,以便在遠程接收器設備上 PLL 的幫助下很容易地重建接收時鐘。注意,沒有將數據和時鐘一起發送,而是比特流中含有足夠多的轉換,使得接收器設備能夠重建接收時鐘。

並行到串行轉換器用於生成每條通道上數據包的串行比特流。

接收部分:接收設備的電氣物理層會定時輸入差動到達所有鏈路的數據包。利用串行到並行轉換器可將數據包的串行比特流轉換成 10b 的並行流。接收邏輯還有一個彈性緩衝器,可以調節發送時鐘和接收時鐘之間的時鐘頻率變化,發送時鐘是數據包比特流定時輸入接收器時鐘。8b/10b 解碼器此時用於將 10b 符號流解碼回每個符號的 8b 表示。8b 字符時去擾的。字節反拆分邏輯將重建遠程設備發送的原數據包流。

鏈路定向與初始化:物理層的另一個功能是初始化和定向鏈路。鏈路初始化和定向是物理層控制的過程。這一過程配置並初始化正常工作的每條鏈路。該過程是自動的,要確定下面的參數:

鏈路寬度;

鏈路數據速率;

通道反轉;

極性倒置;

每通道比特鎖定;

每通道符號鎖定;

多通道鏈路內通道到通道之間的相位補償。

鏈路寬度:可以連接每鏈路通道數不同的兩臺設備。

通道反轉:可選。通道是編號的,設計者可能沒有正確地連接兩個端口正確通道之間的連線。在這種情況下,鏈路定向會考慮將通道號反過來,以便鏈路各端相鄰端口的通道號相匹配。部分相同的過程可能考慮將多通道鏈路分解成多條鏈路。

極性倒置:兩臺設備的 D+ 和 D- 差動對終端的連接可能不正確。在這種情況下,定向序列接收器會將差動接收器上的極性倒置。

鏈路數據速率:定向期間,各節點通告其最高數據速率能力。將用鏈路兩端對應設備所支持的最大公共頻率來初始化該鏈路。

通道到通道之間的相位補償:由於多通道鏈路上鍊路導線長度變化和驅動器/接收器的特性不同,各通道的比特流到達接收器時相對於其它通道有相位偏移。接收器電路必須通過增加或減小各通道的延遲來補償這一相位偏移。

鏈路電源管理:鏈路的正常加電操作成爲 L0 狀態。低功率的鏈路狀態時 L0s、L1、L2 和 L3 狀態。在這些狀態下,不發送或接收數據包。當鏈路不活動一段時間並出現超時後,鏈路自動進入 L0s 電源狀態。進入和退出這一狀態不設計軟件,且退出延遲最短。L1 和 L2 是比 L0s 還低的電源狀態,但退出 L1 和 L2 的延遲較大。L3 電源狀態是全關閉電源狀態。設備不能由此狀態生成喚醒事件。

復位:支持兩類復位。①冷/熱復位也稱爲基本復位,發生在設備加電後(冷復位)或沒有重新施加電源的復位(熱復位)。②hot 復位有時又成爲協議復位,是一種帶內傳播復位的方法。有序集的發送就是用來發出 hot 復位信號的。軟件發起 hot 復位的生成。

電氣物理層:一臺設備的發送器與鏈路另一端另一臺設備的接收器時 AC 耦合的,如下圖。AC 耦合電容器的大小在 75~200nF 之間。發送器的 DC 共模電壓時在鏈路定向和初始化期間確定的。DC 共模阻抗通常是 50Ω,而差動阻抗通常是 100Ω。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章