前面的一系列文章簡要地介紹了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之后便會知道發生了錯誤,其應用層(軟件層)會進行相應的處理。
-
總線
+關注
關注
10文章
2903瀏覽量
88397 -
PCIe
+關注
關注
15文章
1260瀏覽量
83193
原文標題:【博文連載】PCIe掃盲——一個Memory Read操作的例子
文章出處:【微信號:ChinaAET,微信公眾號:電子技術應用ChinaAET】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論