連載目錄篇:http://blog.chinaaet.com/justlxy/p/5100053251
前面的一系列文章簡要地介紹了PCIe總線的結構、事務層、數據鏈路層和物理層。下面我們用一個簡單地的例子來回顧並總結一下。
如下圖所示,Requester的應用層(軟件層)首先向其事務層發送如下信息:32位(或者64位)的Memory地址,事務類型(Transaction Type),數據量(以DW為單位),TC(Traffic Class,即優先級),字節使能(Byte Enable)和屬性信息(Attributes)等。

然后接收端的事務層使用這些信息創建了一個Mrd TLP(Memory Read的事務層包),並將Requester的ID(BDF,Bus & Device & Function)寫入到該TLP的Header中,以便Completer根據這一BDF將Completion信息返回給Requester。然后這個TLP會根據其TC的值被放到對應的VC Buffer中,Flow Control邏輯便會檢車接收端的對應的接收VC Buffer空間是否充足。一旦接收端的VC Buffer空間充足,TLP便會准備被向接收端發送。
注:TLP的Header實際上有兩種,32位的地址對應的是3DW的Header,64為的地址對應的是4DW的Header。這在后續的文章中會詳細介紹。
當TLP到達數據鏈路層(Data Link Layer)時候,數據鏈路層會為其添加上12位的序列號(Sequence Number)和32位的LCRC。並將添加上這些信息之后的TLP(即DLLP)在Replay Buffer中做一個備份,並隨后將其發送至物理層。
物理層接收到DLLP之后,為其添加上起始字符(Start & End Characters,又叫幀字符,Frame Characters),然后依次進行解字節(Strip Byte)、擾碼(Scramble)、8b/10b編碼並進行串行化,隨后發送至相鄰的PCIe設備的物理層。
接收端PCIe設備(即Completer)的物理層接收到數據之后,依次執行與發送端相反的操作。並從數據中恢復出時鍾,然后將恢復出來的DLLP發送至數據鏈路層。
Completer的數據鏈路層首先檢查DLLP中的LCRC,如果存在錯誤,則向Requester發送一個Nak類型的DLLP,該DLLP包含了其接受到的DLLP中的序列號(Sequence Number)。Requester的數據鏈路層接收到來自Completer的Nak DLLP之后,從中找到序列號(Sequence Number),並根據序列號在Replay Buffer找到對應的DLLP,然后將其重新發送至Completer。如果Completer的數據鏈路層沒有檢查到LCRC的錯誤,也會向Requester發送一個Ack類型的DLLP,該DLLP同樣包含了其接收到的DLLP中的序列號。Requester的數據鏈路層接收到之一Ack DLLP之后,便會根據其中的序列號在Replay Buffer中找到對應的DLLP的備份,並將其丟棄(Discard)。
當接收端PCIe涉筆(即Completer)的數據鏈路層正確的接收到了來自Requester的DLLP(包含TLP的)時,隨后將其進一步發送至事務層,事務層檢查ECRC(可選的),並對TLP進行解析,然后將解析后的信息發送至應用層(軟件層)。
如下圖所示,Completer的應用層會根據接受到的信息進行相應的處理,處理完成后會將數據發送至事務層,事務層根據這一信息創建一個新的TLP(即CplD,Completion with data)。並根據先前接收到的TLP中的BDF信息,找到原來的Requester,然后將CplD發送至該Requester。這一發送過程與Requester向Completer發送TLP(Mrd Request)的過程基本是一致的。所以這里就不在重復了。
注:如果Completer不能夠返回有效數據給Requester,或者遇到錯誤,則其返回的就不是CplD了,而是Cpl(Completion without data),Requester接收到Cpl的TLP之后便會知道發生了錯誤,其應用層(軟件層)會進行相應的處理。

轉載:http://blog.chinaaet.com/justlxy/p/5100053263
本文為PCIe掃盲系列博文連載目錄篇(第一階段),所謂第一階段就是說后面還有第二階段和第三階段……第一階段主要是介紹PCIe總線的發展歷史與展望,PCI總線和PCI-X總線的簡要回顧,PCIe總線的體系結構入門,PCIe總線的事務層、數據鏈路層,物理層入門;最后以一個簡單的例子進行總結與回顧。
目錄如下:
1、前言篇:PCIe掃盲——PCIe簡介:http://blog.chinaaet.com/justlxy/p/5100053066
2、PCIe掃盲——PCI總線基本概念:http://blog.chinaaet.com/justlxy/p/5100053077
3、PCIe掃盲——一個典型的PCI總線周期:http://blog.chinaaet.com/justlxy/p/5100053078
4、PCIe掃盲——PCI總線中的Reflected-Wave Signaling:http://blog.chinaaet.com/justlxy/p/5100053079
5、PCIe掃盲——PCI總線的三種傳輸模式:http://blog.chinaaet.com/justlxy/p/5100053095
6、PCIe掃盲——PCI總線的中斷和錯誤處理:http://blog.chinaaet.com/justlxy/p/5100053096
7、PCIe掃盲——PCI總線的地址空間分配:http://blog.chinaaet.com/justlxy/p/5100053219
8、PCIe掃盲——PCI總線配置周期產生和配置寄存器:http://blog.chinaaet.com/justlxy/p/5100053220
9、PCIe掃盲——66MHz的PCI總線與其技術瓶頸:http://blog.chinaaet.com/justlxy/p/5100053221
10、PCIe掃盲——PCI-X總線基本概念:http://blog.chinaaet.com/justlxy/p/5100053224
11、PCIe掃盲——PCIe總線基本概念:http://blog.chinaaet.com/justlxy/p/5100053225
12、PCIe掃盲——PCIe總線怎樣做到在軟件上兼容PCI總線:http://blog.chinaaet.com/justlxy/p/5100053245
13、PCIe掃盲——PCIe總線體系結構入門:http://blog.chinaaet.com/justlxy/p/5100053246
14、PCIe掃盲——PCIe總線事務層入門(一):http://blog.chinaaet.com/justlxy/p/5100053247
15、PCIe掃盲——PCIe總線事務層入門(二):http://blog.chinaaet.com/justlxy/p/5100053248
16、PCIe掃盲——PCIe總線事務層入門(三):http://blog.chinaaet.com/justlxy/p/5100053249
17、PCIe掃盲——PCIe總線數據鏈路層入門:http://blog.chinaaet.com/justlxy/p/5100053250
18、PCIe掃盲——PCIe總線物理層入門:http://blog.chinaaet.com/justlxy/p/5100053261
19、PCIe掃盲——一個Memory Read操作的例子:http://blog.chinaaet.com/justlxy/p/5100053263
