確保資料傳送完整性 揭開PCIe介面重送緩衝器的奧秘

2006-05-22
依據PCIe規格,為了確保資料在傳送過程中的完整性,傳送端的收發器必須具備一個「重送緩衝器」,用來預先複製儲存傳送器所送出的資料交易層封包。而這個緩衝器大小的規畫即是重要課題,緩衝器空間若太小,高速應用的性能勢必受影響...
PCIe的出現,就是為了PCI匯流排的世代交替,並且完全取代AGP 8x繪圖卡介面。從英特爾(Intel)9xx系列晶片組的進化,可看出該公司的企圖。雖然PCIe x16取代AGP 8x的任務,無論在桌上型或筆記型電腦(圖1~2)皆能圓滿達成,但在周邊裝置上的應用,則尚未開花結果,不僅殺手級應用尚未出現,產品種類也少得可憐。目前在賣場能看到一些Gigabit乙太網路卡,或PCIe-SATA II轉接卡,但是這些畢竟都只是過渡產品。  

先來看看英特爾搭載975X Express晶片組的主機板「D975XBX」,藉此尋找一些蛛絲馬跡。在D975XBX主機板上,可以看見1,066MHz的FSB之Pentium Extreme Edition 955處理器。這是採用Netburst雙核心Presler架構的末代產品,特殊的地方就在於採用了65奈米的先進半導體製程。另一個令人眼睛為之一亮的,是安置了三個PCIe x16插槽(圖3),目的應該是支援可擴充鏈結介面(SLI)。  

PCIe是典型的點對點連接型態,資料交換通訊是以三段階層式架構來傳送,依序由應用程式傳遞到資料交易層,再到資料連結層,再到實體層,直到目的地。接收端理所當然也是對應的階層式架構,只是資料的處理與傳送端相反。此種架構可滿足晶片與晶片的互連(Interconnect)應用,例如北橋晶片與南橋晶片的接續。  

眾所周知的,PCIe具有高度資料整合性的服務品質(QoS)功能,可確保資料在傳送過程中的完整性。依據PCIe規格,在傳送端的收發器,為了因應ACK/NAK流程控制協定的需要,必須具備一個「重新播送緩衝器(Replay Buffer)」,其實就是「重送緩衝器(Retry Buffer)」。顧名思義,就是用來預先複製儲存傳送器所送出的資料交易層封包(Transaction Layer Packet, TLP)。  

一旦確定封包已被接收端所接收進去,該封包就可從接收端的緩衝器中刪除。若是傳送過程中有所失誤,例如發生CRC錯誤的狀況,接收端以NAK訊號回應。那麼,傳送端就可直接從緩衝器中重新再送,無須重新建構一個TLP封包,如此就可確保點對點資料傳送的完整性。因此,這個緩衝器架構的大小,不僅攸關零件設計成本,更對於性能有絕對的影響力。  

舉例說明,假設傳送端A裝置丟失了資料交易層封包TLP 3/4/5/6/7,這些封包當然就會備份,放置在重送緩衝器裡。若接收端的流程控制器送出ACK訊號,告知傳送端資料交易封包TLP 3/4/5已經安全接收完畢,傳送端就可將TLP 3/4/5封包從緩衝器裡清除(圖4)。  

了解重送緩衝器的重要性之後,接下來的課題就是這個緩衝器大小的規畫。緩衝器空間若太小,高速應用的性能勢必受影響,但如果空間太大,晶片裡的閘數(Gate Account)會變的太多,也會影響晶片面積與成本。因此,這個重送緩衝器的適當空間大小,對於上游元件設計人員來說,必須細心規畫,忽視不得。  

從邏輯上推敲,重送緩衝器(Retry Buffer)的大小與ACK回應政策有密切關係。PCIe規格中對於ACK的送出準則有所規範。在接收到TLP封包之後,多久之後必須回應ACK,也就是「ACK延遲(ACK Latency)」的等待時間數值。然而,影響到這個「ACK延遲」的因素不少,包括連結寬度(Link Width)、最大的資料承載量大小(Max Payload Size),以及連結效率等。以實際應用的經驗而言,重送緩衝器的大小設計,若以最大資料承載量的3~4倍,是不錯的設計準則。為何是3~4倍?這是考慮ACK的回應在最糟糕的延遲情況下來推算,說明如圖5。  

先假設節點A是傳送端,節點B是接收端。如果節點B在即將收到節點A的TLP A1封包時,也將送出一個「MMax Payload Size」的TLP B1封包時,此舉就意味著,節點B對於TLP A1封包的ACK回應必須再越過「Max Payload Size」的時間槽(Time Slot)。因此,節點A起碼要保留兩個「Max Payload Size」的封包。而「Max Payload Size」這個欄位就在「Device Control Register」裡面。  

再來考量對於ACK的處理、釋放重送緩衝器所需的時間,以及處理的時間點等細微因素,必須再補足一個時間槽,使得設計重送緩衝器的空間需要「Max Payload Size」的3倍。為了設計上謹慎起見,建議採用4倍的設計方式,可以給予額外的預留空間,以上是初步的邏輯推算。  

由於當初PCIe在電源管理機能上有定義L0s的省電模式狀態,而L0s的喚醒(Wake Up)也需要一段等待時間(L0s Wake Latency)。可能是60ns到幾個微秒的時間範圍。若是L0s的喚醒時間太長,就不能處理ACK並釋放緩衝器空間的動作。從上層來的TLP封包的流動就會停止,傳輸性能自然大受影響(圖6)。  

因此,重送緩衝器太小或是太大都不是好的設計。接下來,可深入探索緩衝器大小的精緻計算與考量之道。  

第一步驟,就是先理解一個TLP封包的來回旅程時間(Round-trip Time)。這個參數牽連的變數,主要是TLP封包放入重送緩衝器所需的時間、何時可以被接收端確認,以及何時可從重送緩衝器中釋放出來等。  

由於PCIe的連接是可以空間延伸的傳輸型態,又是8b/10b編碼的機制。因此,10個位元的構成就稱之為一個「符號(Symbol)」。一個x1的連結可在一個符號的時間傳送一個符號,一個x2的連結可以在一個符號的時間傳送兩個符號,而一個x8的連結可以在一個符號的時間傳送8個符號,依此類推。  

雖然「Max Payload Size」欄位已經用來標明封包的資料承載量,但是不可忽略的是,PCIe是階層式處理架構,封包還有各層的開銷負擔,例如封包標頭(Header)、實體層追加的分框(Framing)資訊等,姑且以「TLP-Overhead」來表示。在規格中,這個「TLP-Overhead」是以28個符號的固定長度來看待。建立這個基本概念之後,傳送端TLP封包符號的傳輸時間就可藉由一個簡易的數學式來呈現(式1)。  

封包符號傳送時間(式1) (詳細方程式請見當期雜誌)  

之所以必須將資料承載量加上額外的開銷資訊,再除以連結寬度(Link Width),是因為在實際載送時,會透過「位元組拆開(Byte Striping)」的處置,請參考圖7。  

而從接收端資料連結層所回應相反方向的認可ACK封包,從組成架構的元素來解析,是一個8個符號的封包:STP(1)+DLLP(4)+ CRC(2)+END(1),請參考圖8。而ACK封包乃是DLLP封包的一個項目。  

但是,請仍不要忽略ACK封包符號的回應所需時間值,與連結寬度也是相關的(式2)。  

ACK封包的傳送時間(式2) (詳細方程式請見當期雜誌)  

因此「ACK Latency」的等待時間數值,要用數學式來量化就不會太困難了。再將「ACK Latency」的含意敘述一次,它是指接收端在接收到TLP封包最後一個符號,到回應ACK封包第一個符號必須等待的時間,該參數也能利用數學式來表現(式3)。  

「ACK Latency」的數學式表現(式3) (詳細方程式請見當期雜誌)  

式3最有趣之處,在於「AckFactor」這個數字。規格對此參數有所描述,它是一個附加因素(Fudge Factor),意味著在送出ACK之DLLP封包之前所能接收到最大的TLP大小。為了在連結頻寬效率以及重送緩衝器的大小之間取得好的平衡點,這個數字的理想範圍介於1~3之間。畢竟,若是這個數字太大,重送緩衝器的空間就會變的很大,然而連結效率卻很高。  

其中的原因是PCIe允許利用一個ACK封包來認可多筆TLP資料交易封包。相同的道理,若是這個數字過小,雖可節省重送緩衝器的空間,ACK封包的回應就必然頻繁,而犧牲了連結效率。因此,折衷點的取決相當重要。  

「內部延遲(Internal Dealy)」自然就是指接收端的延遲,當接收到TLP封包之後,必須向上丟給資料連結層(Data Link Layer),然後才會ACK或是NAK交握封包。這段時間必須確認資料正確與否、更新內部暫存器與旗幟等,技術規格將它當成19個符號時間的常數。PCIe規格中就針對「Max Payload Size」以及「Link Width」為表格的欄列,做出一個表格,仔細分析了「ACK Latency」的數值(表1),其中每個數值的單位是符號時間(Symbol Time),AF則是「Ack Factor」的簡寫。  

PCIe在電源管理機能上追加了一個新模式:動態電源管理(Active State Power Management, ASPM),定義了L0s的省電模式狀態,恢復到正常營運的時間在傳送與接收兩端都要列入考量,分別以「Tx L0s Adjustment」與「Rx L0s Adjustment」來表述。  

「Tx L0s Adjustment」參數可從字面得知,就是指傳送端從L0s狀態回復之後,直到能開始傳達TLP或DLLP的整體時間。這個時序其實有兩段,第一段是傳送端的實體層收發器傳送FTS(Fast Training Sequence)指令集的時間。之後,開始與接收端建立位元以及符號鎖定(Bit & Symbol Lock)的動作。前者這段時間在PIPE規格中,定義為P0s到P0的轉換時間(Transition Time)。  

「Tx L0s Adjustment」的經驗值約是在16~32符號時間(Symbol Time)。在此是以20個符號時間為參考值,這個數值是如此計算出來的:「P0s到P0的4個符號時間加上3個FTS指令集的12個符號時間,再加上一個SKP指令集的4個符號時間」。一樣的思維,接收端也有如此考量,用「RxL0sAdjustment」來描述,依然是採用20個符號時間的參考值。  

Joe Winkles在一篇名為「Sizing of the Replay Buffer in PCI Express Devices」文章中,提出一個頗為實用的數學式(式4)可供參考。請留意,此數學式並無定義在規格中。  

重送緩衝器大小的簡易工程數學式(式4)(詳細方程式請見當期雜誌)  

其中的「Safety Factor」給予一個容忍度的餘裕空間,介於1~3之間。至於「Link Utilization Factor」則是指頻寬的使用程度,正常情況下當然是100%,算出的數字單位即是位元組。  

舉例試算,假設「Max Payload Size」為2048,連結寬度為x4,「Safety Factor」與「Link Utilization Factor」均為1的情況下:[20+(2048+28)/4+(538+20+2)×1×4]=4472位元組。依據上式,各個重送緩衝器空間大小如表2。總之,重送緩衝器在PCIe介面的重要性在本文已可看出端倪。即使在系統單晶片與電路IP盛行的今日,還是有了解的必要。  

(詳細圖表請見新通訊63期5月號)  

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!