潘金龍,李德建,王于波,馮 曦,董長征,馮文楠
(北京智芯微電子科技有限公司,北京 100192)
隨著現(xiàn)代處理器技術(shù)的飛速發(fā)展,使用高速差分總線替代并行總線的應用場景越來越多。與單端信號相比,高速差分信號可以使用更高的時鐘頻率,使用更少的信號線,完成之前需要很多單端并行數(shù)據(jù)信號才能達到的總線帶寬[1]。如何高效地利用總線帶寬,通過何種配置達到最優(yōu)應用,給設計者帶來了挑戰(zhàn)。
PCI-Express(Peripheral Component Interconnect Express)是一種高速串行計算機擴展總線標準,簡稱PCIe。PCIe屬于高速串行點對點雙通道高帶寬傳輸,互聯(lián)設備之間獨立傳輸,主要有主動電源管理、錯誤報告、端對端的可靠性傳輸、熱插拔以及服務質(zhì)量等功能。PCIe 是一種分層協(xié)議,由傳輸層、數(shù)據(jù)鏈路層和物理層組成[1-3],層級結(jié)構(gòu)如圖1 所示[4-5]。PCIe A 設備與B 設備之間通過發(fā)送端與接收端進行互聯(lián)。
圖1 PCIe 層級結(jié)構(gòu)圖
數(shù)據(jù)在PCIe 總線各層級傳輸所產(chǎn)生的開銷主要在以下幾個方面。
數(shù)據(jù)編碼開銷主要是PCIe 的物理層產(chǎn)生的,GEN(generation)1/2使用8b/10b編碼,GEN3/4/5使用128b/130b 編碼,編碼的目的是保持直流平衡(DC balance)[6-7]。
PCIe 各版本傳輸速率如表1 所示(Xn 表示存在n 條物理鏈路,例如X4 表示存在4 條物理鏈路)。
表1 PCIe 傳輸速率
例如 PCIe 1.0 使用8b/10b 編碼方案,導致占用了20%(2/10)的原始信道帶寬。那么PCIe 1.0 實際上單通道的有效帶寬就是2.5 Gb/s×80%/8=250 MB/s。
PCIe 報文為分層封裝協(xié)議的報文。數(shù)據(jù)報文在Device A 產(chǎn)生之后,在事務層(Transaction Layer) 報文由數(shù)據(jù)頭(Header)、報文凈荷(Payload)、端到端的CRC(ECRC)組成,經(jīng)過數(shù)據(jù)鏈路層(Data Link Layer)后增加序列號(Sequence Number)、鏈路層CRC(LCRC)、開始(Start)、結(jié)束(End)數(shù)據(jù)塊,然后通過物理層(Physical Layer)發(fā)出[8-9]。PCIe Gen1/2報文格式如圖2所示[2],PCIe Gen3/4/5/報文格式如圖3 所示[2]。
圖2 PCIe Gen1/2 報文格式
圖3 PCIe Gen3/4/5 報文格式
PCIe Gen3/4/5 的報文結(jié)構(gòu)開始(Start)標識是4 B,且沒有結(jié)束(End)標識,這是與Gen1/2 報文結(jié)構(gòu)上的區(qū)別。
在TLP 傳輸過程中,相關(guān)的報文標識就增加了20~30B的開銷[10-11]。
控制報文來自于數(shù)據(jù)鏈路層,報文長度為6 B,主要功能是保證來自事務層的TLP 在PCIe 鏈路中正確傳遞。報文的類型主要有應答Ack(Acknowledge)、非應答Nak(No acknowledge)、功耗管理PM(Power Manage)、流控FC(Flow Control)等[12]。
2.3.1 Ack與Nak報文開銷
發(fā)送端發(fā)出TLP 報文之后,需要接收端回應Ack 或者Nak 報文,來確認發(fā)送的TLP 是否被成功接收。發(fā)送端在發(fā)送TLP 的同時需要將TLP 復制一份保存在TLP retry buffer(TLP 重傳緩存)中,直到收到Ack 即表示成功接收的回應[13-14]。如果收到了Nak 則表示未成功接收的回應,需要將存儲在TLP retry buffer 中的TLP 再次發(fā)送,直到被正確接收。Ack 不需要與TLP 一一對應,可以設置一個計數(shù)器N,發(fā)送N 個TLP 之后,接收端回應一個Ack。接收端會對報文進行錯誤檢查(Error Check),如果查詢到接收的報文序號不正確或有其他的錯誤,則回應一個Nak,發(fā)送端將會重新發(fā)送TLP。數(shù)據(jù)傳輸結(jié)構(gòu)如圖4 所示[1]。
圖4 PCIe 數(shù)據(jù)鏈路層傳輸結(jié)構(gòu)示意圖
2.3.2 PM 報文開銷
PCIe 設備進入L0 狀態(tài) (PCIe 設備的正常工作狀態(tài))后,物理層為了解決接收時鐘與本地時鐘之間漂移所帶來的頻差問題,每一個鏈路(Lane)需要在傳輸1 180~1 538個字符后發(fā)送一個SKP(PCIe 鏈路層傳輸?shù)囊环N報文)請求來進行時鐘補償,在TLP 的傳輸過程中不會插入時鐘補償[1]。
2.3.3 流量控制報文開銷
流量控制的主要作用是在發(fā)送端和接收端進行數(shù)據(jù)傳遞時,通過FC 報文傳遞本端存儲空間的使用狀態(tài),避免因為接收端緩沖區(qū)由于存儲空間不足導致丟棄來自發(fā)送端的數(shù)據(jù)。如果FC 報文沒有及時發(fā)送,會導致本地存儲空間不夠而丟棄報文,反之FC 報文發(fā)送太過頻繁,就會導致PCIe 傳輸?shù)男阅芟陆?,帶寬利用率低[1]。
系統(tǒng)配置參數(shù)如下:
有效負載最大值:MPS(Maximum Payload Size)。PCIe設備所傳送所有類型報文的數(shù)據(jù)大小不能超過MPS。MPS支持的大小有6種:128B、256 B、512 B、1 024 B、2 048 B、4 096 B。當PCIe 設備所傳送的數(shù)據(jù)大小超過MPS 參數(shù)時,數(shù)據(jù)將被分割為多個TLP 進行發(fā)送了。
最大讀請求數(shù)據(jù):MRRS(Maximum Read Request Szie),PCIe 設備一次能從目標設備讀取的最大數(shù)據(jù),如果一次存儲器讀操作需要讀取的數(shù)據(jù)范圍大于MRRS 時,該PCIe 設備需要向目標設備發(fā)送多個存儲器讀操作。MRRS 的大小同樣有6 種:128 B、256 B、512 B、1 024 B、2 048 B、4 096 B。
RCB(Read Completion Boundary):RCB 可配置為64 B或者128 B,RCB 的大小與完成報文的有效負載相關(guān)。在PCIe 總線中,一個存儲器讀請求TLP 可能收到目標設備發(fā)出的多個讀完成報文后,才能完成一次存儲器讀操作[15-16]。
報文在PCIe 總線傳輸過程中,實際的有效帶寬和物理帶寬之間的關(guān)系是如何呈現(xiàn)的?下面以存儲器寫請求TLP 和存儲器讀請求TLP 傳輸為例來分析PCIe 總線的性能。
(1)應用場景
①PCIe 物理層為Gen2,2Lane;
②發(fā)送的報文數(shù)目Num 為200 個,每個報文的長度和MPS 相同;
③MPS 設置為1 024 B;
④Ack 功能配置為傳輸10 個TLP 報文回復1 個Ack;
⑤FC 功能配置為傳輸5 個報文回復1 個FC;
⑥傳輸層數(shù)據(jù)的報文頭為4DW,再加上其他開銷共計28 B。
(2)帶寬計算
①需要傳遞的報文總長度:200×1 024=204 800 B。
②實際傳遞的報文總長度
不含有PM 報文開銷的長度:(1 024+28)×200+(6+2)×200/10+(6+2)×200/20=210 640 B。
PM 報文開銷,定義1 200 bit 插入1 個PM 報文。210 640×8/1 200=1 404 個,注意在TLP 每個報文發(fā)送過程中不能插入PM 報文,所以在TLP 發(fā)送間隔時會插入多個PM 報文。
總傳遞報文長度為:210 640+1 404×(6+2)=221 872 B。
③有效帶寬
需要傳遞的報文總長度/總傳遞報文長度=204 800/221 872=92.31%。
PCIe Gen2 的物理有效帶寬為80%,所以最終2 個Lane 的傳輸性能為:92.31%×0.8=73.84%,帶寬為5 Gb/s×2×73.84%=7.384 Gb/s,即10 Gb/s 的物理傳輸通道有效帶寬為7.384 Gb/s。
(3)導出公式
根據(jù)以上計算結(jié)果,可以推到出如下公式:
(4)延伸拓展
報文在總線傳輸過程中,配置都是固化好的,通過對有效帶寬的計算公式可以看出在報文實際傳輸?shù)倪^程中,報文的有效數(shù)據(jù)長度和MPS 參數(shù)越接近越好,這樣可以減少傳輸?shù)拇螖?shù)。另外MPS 參數(shù)的值越大,有效帶寬就越高。將MPS 參數(shù)設置為128 B、256 B、512 B、1 024 B、2 048 B、4 096 B,TLP報文的有效數(shù)據(jù)長度同MPS參數(shù),存儲器寫請求TLP 的不同MPS 配置的帶寬效率結(jié)果如表2 所示。
表2 不同MPS 配置帶寬效率表
從計算結(jié)果來看,隨著MPS 的增大,帶寬有效利用率在提高,但是增加幅度在變小。
(5)其他說明
在上面第4 點中對帶寬的利用率做了表格的描述,但是實際上還應該算上PCIe Gen2 物理帶寬8b/10b 解碼的開銷,即實際的帶寬效率還應在上面計算的基礎(chǔ)上乘以0.8 才是最終的帶寬效率。
(1)應用場景
①PCIe 物理層為Gen2,2Lane;
②發(fā)送的報文數(shù)目Num 為200 個;
③MRRS 設置為1 024 B;
④Ack 功能配置為傳輸10 個TLP 報文回復1 個Ack;
⑤FC 功能配置為傳輸5 個報文回復1 個FC;
⑥傳輸層數(shù)據(jù)的報文頭為4DW,再加上其他開銷共計28 B;
⑦RCB 設置為64 B。
(2)帶寬計算
①需要傳遞的報文總長度:200×1 024=204 800 B。
②實際傳遞的報文總長度
每個存儲器讀請求TLP 需要傳輸?shù)拇螖?shù):MRRS/RCB=1 024 B/64 B=16,即需要返回16 個TLP 讀完成報文才能將此次讀的數(shù)據(jù)全部獲取。
不含有PM 報文開銷的長度:(1 024+28×16)×200+(6+2)×200/10+(6+2)×200/20=294 640 B。
PM 報文開銷,定義1 200 bit 插入1 個PM 報文。210 640×8/1 200=2 個,注意在TLP 每個報文發(fā)送過程中不能插入PM 報文,所以在TLP 發(fā)送間隔時會插入多個PM 報文。
總傳遞報文長度為:294 640+1 964×(6+2)=310 354 B。
③有效帶寬
需要傳遞的報文總長度/總傳遞報文長度=204 800/310 354=65.99%。
PCIe Gen2 的物理有效帶寬為80%,所以最終的2 個Lane 的傳輸性能為:65.99%×0.8=52.79%,帶寬為5 Gb/s×2×52.79%=5.279 Gb/s,即10 Gb/s 的物理傳輸通道,有效帶寬為5.279 Gb/s。
(3)導出公式
根據(jù)以上計算結(jié)果,可以推到出如下公式:
(4)延伸拓展
將MRRS 參數(shù)設置為128 B、256 B、512 B、1 024 B、2 048 B、4 096 B,存儲器讀請求TLP 的不同MRRS 帶寬效率如表3 所示。
表3 不同MRRS(RCB/64 B)配置帶寬效率結(jié)果
從計算結(jié)果來看,隨著MRRS 的增大,帶寬有效利用率并沒有顯著提高,基本上沒有明顯的變動。將RCB的參數(shù)由64 B 修改為128 B 的結(jié)果如表4 所示。
對比表3 和表4,相同的MRRS 配置,RCB 的值由64 B 變成了128 B,帶寬有效利用率有了明顯的提升。例如MRRS 配置為128 B,RCB 配置為64 B,帶寬有效率是65.62%;而當RCB 配置為128 B,帶寬有效率是77.30%,帶寬提升了12.04%。
表4 不同MRRS(RCB/128 B)配置帶寬效率結(jié)果
(5)其他說明
與存儲器寫請求TLP 相同,存儲器讀請求TLP 的實際帶寬也需要考慮PCIe Gen2 物理傳輸通道編解碼的開銷。
本文介紹了PCIe 總線的基本結(jié)構(gòu),列舉了影響PCIe總線傳輸效率的多種原因,從實際應用中進行舉例說明并計算。當然上面存儲器寫請求與存儲器讀請求的帶寬有效利用率的計算只是粗略的估算,報文在實際的發(fā)送與接收過程中會涉及軟件、硬件的配合處理與其他多種原因的影響,實際應用中會比理論值要低一些。如何高效地應用PCIe 總線,只有深入理解了總線傳輸?shù)脑恚拍芡ㄟ^合理、有效的配置提高傳輸效率。