1. PCIe基礎知識
PCI-Express(peripheral component interconnect express)是一種高速串行計算機擴展總線標準,它原來的名稱為“3GIO”,是由英特爾在2001年提出的,旨在替代舊的PCI,PCI-X和AGP總線標準。
與大多數(shù)總線一樣,PCIe總線也包括電氣屬性和協(xié)議組成兩部分。完整地了解PCIe是相對復雜的,所以從應用角度來講,我先從基本的協(xié)議入手,對PCIe有個初步的認識。拓展學習可以參考官方協(xié)議規(guī)范文檔《PCI Express Base Specification》。
PCIe 規(guī)范對于設備的設計采用分層的結構,有事務層、數(shù)據(jù)鏈路層和物理層組成,各層有都分為發(fā)送和接收兩功能塊。
在發(fā)送端,應用程序(設備核A)在事務層形成事務層包(TLP——Transaction Layer Package),儲存在發(fā)送緩沖器里,等待推向下層。在數(shù)據(jù)鏈路層,在TLP 包上再串接一些附加信息,這些信息是對方接收TLP 包時進行錯誤檢查要用到的,形成數(shù)據(jù)鏈路層包(DLLP——Data Link Layer Package);在物理層,對DLLP 包進行編碼,占用鏈路中的可用通道,從發(fā)送器發(fā)送出去。
在接收端,實際上是發(fā)送端的“逆”過程。如果說發(fā)送端是在不斷組包,那么接收端就是不斷的拆包,最后提取出有用的數(shù)據(jù)信息供B設備的應用程序使用。
整個過程實際上和以太網(wǎng)的過程很相似,都是在不同層級上進行數(shù)據(jù)的擴展。在FPGA的開發(fā)過程中,實際上從事務層到物理層都是封裝好了的,組成標準IP核。用戶通過IP核要求的總線協(xié)議(如AXI4-Stream)與之進行數(shù)據(jù)交換。
2. 事務層協(xié)議
2.1 數(shù)據(jù)包結構
有了IP核之后,實際上我們最關心的就是事務層包的數(shù)據(jù)格式。
事務層數(shù)據(jù)包(TLP)主要由:一個或多個可選的前綴(TLP Prefixes)、一個幀頭(TLP Header)、一個數(shù)據(jù)有效負載(Data Payload)和一個可選的摘要(TLP Dignest)組成,下面簡單介紹一下各部分。
前綴(TLP Prefixes)
有PCIe V2.1總規(guī)范引入,主要起擴展幀頭的作用。如果用不到,可以省去該字段。
幀頭(TLP Header)
TLP Header是TLP中最重要的標志,不同的TLP其頭的定義并不相同。TLP 頭標長3 或者4 個DW(DW = double word——雙字,32位),格式和內(nèi)容隨事物類型變化;
數(shù)據(jù)有效負載(Data Payload)
即主設備要傳輸?shù)臄?shù)據(jù)。數(shù)據(jù)的長度最小為0,最大為1024DW,視具體情況而定。該字段也是一個可選項,因為有些TLP并不需要傳遞數(shù)據(jù),如存儲器讀請求、配置和I/O寫完成TLP也不需要。
摘要(TLP Dignest)
摘要是一個可選項,長度為1DW。一個TLP是否需要Dignes是由Header中TD字段決定。如果接受設備支持ECRC校驗的功能的話,則該字段用來防止TLP中的數(shù)據(jù)校驗碼ECRC。
2.2 幀頭含義詳述
TLP Header長3 DW或者4 DW,格式和內(nèi)容隨事務類型的不同而不同。但是對于所有TLP Header來講,都擁有相同的第一個DW定義,如下圖所示(R:Reserved,為0)。
Fmt([31:29])——Format of TLP
Fmt是關于頭標長度和該TLP是否有數(shù)據(jù)(字段)的信息,如下圖所示。實際上是3 DW還是4 DW是根據(jù)要訪問目標的地址位寬有關。
Type([28:24])
Type的5位編碼與Fmt字段一起用于規(guī)定事務類型、頭標長度和是否有數(shù)據(jù)負載,如下圖所示,只列舉了一部分常用的類型,完整版可以查閱官方協(xié)議規(guī)范。
TC([22:20])
Traffic Class,傳輸類型也代表優(yōu)先級,優(yōu)先級高的先得到服務。這里是3比特,說明可以分為8個等級,0-7,TC默認是0,數(shù)字越大,優(yōu)先級越高。
Attr([18]、[13:12])
該字段表述TLP的屬性,由3位組成,注意不是連續(xù)的。具體含義見規(guī)范。
TH([16])
位為 1 表示當前 TLP 中含有 TPH(TLP Processing Hint)信息,TPH 是 PCIe V2.1 總線規(guī)范引入的一個重要功能。TLP 的發(fā)送端可以使用 TPH 信息,通知接收端即將訪問數(shù)據(jù)的特性,以便接收端合理地預讀和管理數(shù)據(jù)。
TD([15])
表示 TLP 中的 TLP Digest(之前說ECRC可選)是否有效,如果這個這個bit置起來,說明該TLP包含ECRC,接收端應該做CRC校驗;
EP([14])
表示當前 TLP 中的數(shù)據(jù)是否有效,為 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位尋址的寄存器讀的完整報文(上節(jié)只介紹了第一個DW)。首先解釋一下多的幾個字段的含義。
Requester ID
該字段字段包含生成TLP報文的PCIe設備的總線號(Bus Number)、設備號(Device Number)和功能號(Function Number)。唯一的找到目標設備,那是因為不同的Endpoint設備空間會映射到Host內(nèi)存空間的不同位置。
Tag
Requester ID、Tag合起來組成Transaction ID,在同一時間段內(nèi),PCIe設備發(fā)出的每一個Non-Posted數(shù)據(jù)請求TLP,其Transaction ID必須唯一。也就是Tag必須唯一。
Last DW BE和1st DW BE
在PCIe 總線以字節(jié)為基本單位迕行數(shù)據(jù)傳遞,但是 Length 字段以 DW 為最小單位。為此TLP 使用 Last DW BE 和 First DW BE 返兩個字段迕行字節(jié)使能,使得在一個 TLP中,有效數(shù)據(jù)以字節(jié)為單位。
Address
對一個PCIe設備來說,它開放給Host訪問的設備空間首先會映射到Host的內(nèi)存空間,Host如果想訪問設備的某個空間,TLP Header當中的地址應該設置為該訪問空間在Host內(nèi)存的映射地址。
值得注意的是:報文是以DW劃分來進行說明,但實際過程中,頂層應用與PCIe IP核采用64位數(shù)據(jù)的AXI4通信,所以在發(fā)送TLP所需字段數(shù)據(jù)時,主要大小端的問題。
3.2 完成報文
有non-posted request TLP,才有Completion TLP。有因才有果。前面看到,Requester 的TLP當中都有Requester ID和Tag,來告訴接收者發(fā)起者是誰。那么響應者的目標地址就很簡單,照抄發(fā)起者的源地址就可以了。因此,Completion TLP的Header如下:
compl Status
完成情況指示。000--成功完成;001--不支持該請求。其余情況可查閱規(guī)范。
Byte Count
是指還剩下多少字節(jié)的數(shù)據(jù)需要讀取。其余字段可自行查閱規(guī)范。
4. 機制簡述
4.1 Non-Posted和Posted
PCIe總線規(guī)定了兩類數(shù)據(jù)傳送方式,分別是Non-Posted和Posted數(shù)據(jù)傳送方式。
在PCIe總線中,Non-Posted總線事務分兩部分進行,首先是發(fā)送端向接收端提交總線讀寫請求,之后接收端再向發(fā)送端發(fā)送完成(Completion)報文。PCIe總線使用Split傳送方式處理所有Non-Posted總線事務,存儲器讀、I/O讀寫和配置讀寫這些Non-Posted總線事務都使用Split傳送方式。簡單的說就是“一問一答”的方式。
而Posted總線事務,是只向終端發(fā)送報文,而終端無需反饋完成報文,所以是一種“單向發(fā)送”的機制。
評論
查看更多