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