編 者 按
續接上文,接續扒一扒PCIe中的Flow Control
鏈路層把TLP分為幾類?
在處理TLP報文時,根據Fmt字段以及Type字段可以將TLP報文分為二十多種,當TLP報文送至數據鏈路層時,數據鏈路層在進行流量控制處理時則不會考慮這么多種情況。數據鏈路層里面的Flow Control,則會將報文分為三類:
Post:不需要Target端返回響應報文的TLP請求。
Non-Post:需要Target端返回響應報文的TLP請求。
Cmpl:響應TLP報文。
而同時,數據鏈路層在進行流量管理時會將TLP的數據報文頭、數據負載分開進行流量控制。也就意味著數據鏈路層的流量控制每個VC分為了六個通道:
Post Header
Post Data
Non-Post Header
Non-Post Data
Cmpl Header
Cmpl Data
這在cocotb-ext中的FcChannelState中可以看出:
Flow Control初始化
Flow Control的初始化在DL_INIT中:
所用到的DLLP報文為:
按照Spec里面的規定,Flow Control的初始化順序為:
InitFC1-NP (second)
InitFC1-Cpl (third)
無論是InitFC1、InitFC2,其報文格式定義基本相同。InitFC1、InitFC2所做的事情也基本相同,就是告知發送端Header、Data的令牌數。看到一段網上的解釋:“FC_Init1和FC_Init2干的活不是差不多嘛,為什么還需要FC_Init2呢?原因是,不同的設備完成FC_Init1的時間可能是不同的,增加FC_Init2是為了保證每個設備都能收到FC初始化DLLP。”
如果FC為0,則表示該通道不受令牌限制,即無流量控制(EP設備以及不支持P2P的RC的Cmpl常設為0,故建議在涉及時對于Cmpl時建議仔細考慮。像Xilinx PCIe IP EP模式的的RC接口,不建議做反壓)。
這里著重看下 Scale和FC域,FC域為12bit,隨著PCIe鏈路速度的提升,Spec規定了Scale域以擴大令牌數:
按照協議里,最大可以支持到16bit。而FC域僅有12bit,協議里規定了FC的定義:
在cocotbext-pcie里,關于FC位寬的定義,Header、Data采用12、16bits:
Flow Control的初始化在cocotbext-pcie中也很明了簡單:
可以看到,由于FC_INIT1、FC_INIT2內容基本一致,FC2基本沒有做什么處理(具體真實的實現不了解)。
》令牌消耗
發送端發送一個TLP報文,在數據鏈路層需消耗Header、Data令牌。每一個TLP報文需消耗一個TLP,而如果有數據負載則每四個DW消耗一個Data令牌:
數據鏈路層進行判定是否能發送該數據出去:
》令牌更新
令牌周期性的更新所用到的DLLP格式為:
接收端按照HdrFC、DataFC中的內容更新其令牌:
這里面看起來有一點不太合適的地方就是沒有考慮Scale,按照DLLP里面的報文解析:
由于FC只有12bit,這里對于16bit的場景支持欠妥。
更新周期
無論是Flow Control還是之前所說到的ACK/NAK,協議中都規定了最大發送間隔時間。在cocotbext-pcie中的計算方式如下:
這里面的計算單位是Symbol Time(物理層發送1Byte數據的時間)。這里面可能乍看懵逼,這部分在PCIe Spec 5.0里對應Appendixes H里:
Flow Control Latency:
ACK Latency:
審核編輯:湯梓紅
-
FPGA
+關注
關注
1629文章
21729瀏覽量
603009 -
PCIe
+關注
關注
15文章
1234瀏覽量
82584 -
TLP
+關注
關注
0文章
32瀏覽量
15625 -
Flow
+關注
關注
0文章
10瀏覽量
8839 -
報文
+關注
關注
0文章
38瀏覽量
4027
原文標題:原來如此—PCIe的Flow Control
文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論