PCIe總線(協議簡述)

 

1. PCIe基礎知識
PCI-Express(peripheral component interconnect express)是一種高速串行計算機擴展總線標準,它原來的名稱爲“3GIO”,是由英特爾在2001年提出的,旨在替代舊的PCI,PCI-X和AGP總線標準。
與大多數總線一樣,PCIe總線也包括電氣屬性和協議組成兩部分。完整地瞭解PCIe是相對複雜的,所以從應用角度來講,我先從基本的協議入手,對PCIe有個初步的認識。拓展學習可以參考官方協議規範文檔《PCI Express Base Specification》。
PCIe 規範對於設備的設計採用分層的結構,有事務層、數據鏈路層和物理層組成,各層有都分爲發送和接收兩功能塊。
發送端,應用程序(設備核A)在事務層形成事務層包(TLP——Transaction Layer Package),儲存在發送緩衝器裏,等待推向下層。在數據鏈路層,在TLP 包上再串接一些附加信息,這些信息是對方接收TLP 包時進行錯誤檢查要用到的,形成數據鏈路層包(DLLP——Data Link Layer Package);在物理層,對DLLP 包進行編碼,佔用鏈路中的可用通道,從發送器發送出去。
在接收端,實際上是發送端的“逆”過程。如果說發送端是在不斷組包,那麼接收端就是不斷的拆包,最後提取出有用的數據信息供B設備的應用程序使用。

 整個過程實際上和以太網的過程很相似,都是在不同層級上進行數據的擴展。在FPGA的開發過程中,實際上從事務層到物理層都是封裝好了的,組成標準IP核。用戶通過IP核要求的總線協議(如AXI4-Stream)與之進行數據交換。

 

2. 事務層協議
2.1 數據包結構
有了IP核之後,實際上我們最關心的就是事務層包的數據格式。
事務層數據包(TLP)主要由:一個或多個可選的前綴(TLP Prefixes)、一個幀頭(TLP Header)、一個數據有效負載(Data Payload)和一個可選的摘要(TLP Dignest)組成,下面簡單介紹一下各部分。

  • 前綴(TLP Prefixes)

有PCIe V2.1總規範引入,主要起擴展幀頭的作用。如果用不到,可以省去該字段

  • 幀頭(TLP Header)

TLP Header是TLP中最重要的標誌,不同的TLP其頭的定義並不相同。TLP 頭標長3 或者4 個DW(DW = double word——雙字,32位),格式和內容隨事物類型變化;

  • 數據有效負載(Data Payload)

即主設備要傳輸的數據。數據的長度最小爲0,最大爲1024DW,視具體情況而定。該字段也是一個可選項,因爲有些TLP並不需要傳遞數據,如存儲器讀請求、配置和I/O寫完成TLP也不需要。

  • 摘要(TLP Dignest)

摘要是一個可選項,長度爲1DW。一個TLP是否需要Dignes是由Header中TD字段決定。如果接受設備支持ECRC校驗的功能的話,則該字段用來防止TLP中的數據校驗碼ECRC。

2.2 幀頭含義詳述

TLP Header長3 DW或者4 DW,格式和內容隨事務類型的不同而不同。但是對於所有TLP Header來講,都擁有相同的第一個DW定義,如下圖所示(R:Reserved,爲0)。

  • Fmt([31:29])——Format of TLP

Fmt是關於頭標長度和該TLP是否有數據(字段)的信息,如下圖所示。實際上是3 DW還是4 DW是根據要訪問目標的地址位寬有關。

  • Type([28:24])

    Type的5位編碼與Fmt字段一起用於規定事務類型、頭標長度和是否有數據負載,如下圖所示,只列舉了一部分常用的類型,完整版可以查閱官方協議規範。

  • TC([22:20])

    Traffic Class,傳輸類型也代表優先級,優先級高的先得到服務。這裏是3比特,說明可以分爲8個等級,0-7,TC默認是0,數字越大,優先級越高。

  • Attr([18]、[13:12])

    該字段表述TLP的屬性,由3位組成,注意不是連續的。具體含義見規範。

  • TH([16])

    位爲 1 表示當前 TLP 中含有 TPH(TLP Processing Hint)信息,TPH 是 PCIe V2.1 總線規範引入的一個重要功能。TLP 的發送端可以使用 TPH 信息,通知接收端即將訪問數據的特性,以便接收端合理地預讀和管理數據。

  • TD([15])

    表示 TLP 中的 TLP Digest(之前說ECRC可選)是否有效,如果這個這個bit置起來,說明該TLP包含ECRC,接收端應該做CRC校驗;

  • EP([14])

    表示當前 TLP 中的數據是否有效,爲 1 表示無效,爲 0 表示有效。

  • AT([11:10])

    Address Type,地址種類,與 PCIe 總線的地址轉換相關,可暫時不考慮。

  • Length([9:0])

    用來描述 TLP 的有效負載(Data Payload)大小。PCIe 總線設置 Length 字段的目的是提高總線的傳送效率。Length 字段以 DW 爲單位,其最小單位爲 1 個 DW。

3. 報文舉例

因爲PICe的報文種類非常多,只舉兩個進行舉例說明。

3.1 寄存器讀報文

如下圖所示,是一個32位尋址的寄存器讀的完整報文(上節只介紹了第一個DW)。首先解釋一下多的幾個字段的含義。

  • Requester ID

       該字段字段包含生成TLP報文的PCIe設備的總線號(Bus Number)、設備號(Device Number)和功能號(Function Number)。唯一的找到目標設備,那是因爲不同的Endpoint設備空間會映射到Host內存空間的不同位置。

  • Tag

      Requester ID、Tag合起來組成Transaction ID,在同一時間段內,PCIe設備發出的每一個Non-Posted數據請求TLP,其Transaction ID必須唯一。也就是Tag必須唯一。

  • Last DW BE和1st DW BE

      在PCIe 總線以字節爲基本單位迕行數據傳遞,但是 Length 字段以 DW 爲最小單位。爲此TLP 使用 Last DW BE 和 First DW BE 返兩個字段迕行字節使能,使得在一個 TLP中,有效數據以字節爲單位。

  • Address

      對一個PCIe設備來說,它開放給Host訪問的設備空間首先會映射到Host的內存空間,Host如果想訪問設備的某個空間,TLP Header當中的地址應該設置爲該訪問空間在Host內存的映射地址。

      值得注意的是:報文是以DW劃分來進行說明,但實際過程中,頂層應用與PCIe IP核採用64位數據的AXI4通信,所以在發送TLP所需字段數據時,主要大小端的問題。

3.2 完成報文

有non-posted request TLP,纔有Completion TLP。有因纔有果。前面看到,Requester 的TLP當中都有Requester ID和Tag,來告訴接收者發起者是誰。那麼響應者的目標地址就很簡單,照抄發起者的源地址就可以了。因此,Completion TLP的Header如下:

  • compl Status

      完成情況指示。000--成功完成;001--不支持該請求。其餘情況可查閱規範。

  • Byte Count

      是指還剩下多少字節的數據需要讀取。其餘字段可自行查閱規範。

4. 機制簡述

4.1 Non-Posted和Posted

PCIe總線規定了兩類數據傳送方式,分別是Non-Posted和Posted數據傳送方式。

在PCIe總線中,Non-Posted總線事務分兩部分進行,首先是發送端向接收端提交總線讀寫請求,之後接收端再向發送端發送完成(Completion)報文。PCIe總線使用Split傳送方式處理所有Non-Posted總線事務,存儲器讀、I/O讀寫和配置讀寫這些Non-Posted總線事務都使用Split傳送方式。簡單的說就是“一問一答”的方式。

而Posted總線事務,是隻向終端發送報文,而終端無需反饋完成報文,所以是一種“單向發送”的機制。

 

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