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