彈性緩衝器的出現可以回溯到1963年,Maurice Karnaugh獲得這項技術的專利,只不過當時是應用在脈碼調變(Pulse Code Modulation, PCM)的電話網路上。當高速傳輸轉向串列式形態時,彈性緩衝器的價值再度顯現...
彈性緩衝器的出現可以回溯到1963年,Maurice Karnaugh獲得這項技術的專利,只不過當時是應用在脈碼調變(Pulse Code Modulation, PCM)的電話網路上。當高速傳輸轉向串列式形態時,彈性緩衝器的價值再度顯現。本文則透過PCI-E高速串列傳輸介面,說明彈性緩衝器的功能與應用。
在高速串列傳輸世界裡,從USB、PCI Express(PCI-E)、無線寬頻匯流排(InfiniBand)、光纖通道(Fibre Channel),甚至到超高速乙太網路(Gigabit Ethernet, GbE),在實踐上各個介面一定有個功能迴路,稱為彈性緩衝器(Elasticity Buffer, EB),也有人稱之Elastic Buffer、Synchronization Buffers或是Elastic Stores。
該緩衝器其實就是一個先進先出(First-in First-out, FIFO)元件,資料以某個時脈速率放入,而資料取出卻是用另一個不同的時脈頻率。因此,藉由這個電氣上的特徵,該迴路功能方塊的最主要目的是要確保高速環境下,傳送及接收兩端的時脈差異上的補償作用。如此一來,資料通訊的整合性得以獲得最佳保證。
補償時脈訊號差
以下舉兩個耳熟能詳的介面為例,來尋覓彈性緩衝器究竟座落在控制器中的何處。
第一個案例,以USB2.0的集線器(Hub)元件為例,眾所皆知,集線器裝置的職責就是承上啟下,一進多出,用來擴展連接裝置的數量(圖1)。USB介面最多可以連接127個裝置。而且,USB2.0的集線器有別於USB1.1的做法,它將收進來的封包去頭去尾,純粹擷取資料,然後,會用局部新的乾淨時脈訊號將它載送出去。這個措施就是為何480Mbps還可以連續接五階的集線器裝置,且依然維持480Mbps資料傳送暢通的緣故。
所以,USB2.0集線器內部之中繼器(Repeater)區塊會內含彈性緩衝器,可以用來補償Rcv_Clk以及Xmt_Clk兩個時脈之訊號差(圖2)。
第二個例子,就拿第三代輸入/輸出(I/O)的PCI-E為例。由於PCI-E採用內置時脈的8b/10b編碼方式,因此,在接收端勢必建構一個時脈資料回復(Clock Data Recovery, CDR)的迴路。當然,其中的彈性緩衝器也是用來補償傳送時脈f1與接收端時脈f2的差異(圖3)。
從邏輯上來思考,因為FIFO兩端的時脈差異,最後很有機會發生溢位(Overflow)或是下溢(Underflow)的現象。為了迴避這個不受歡迎的現象,彈性緩衝器通常會具有一些能力,在特定的時間插入或是移除特殊的符號(Symbol)。如此一來,用來補償兩端時脈的差異,就不須掛慮額外的問題,這也是彈性緩衝器名稱的由來。
PCI-E針對EB 規範SKP指令集
PCI-E運用8b/10b編碼,其傳接端與接收端時序之同步關係可以看成是屬於一種來源同步(Source Synchronous)的方式,也是一種時脈前送(Clock Forwarding)的資料傳輸協定方法。這與過去PCI或PCI-X採用的共通時脈方式,是截然不同的同步策略(圖4)。
為了方便記憶起見,最簡單的方法就是將來源同步的方式,看成時脈與資料的產生都是來自於傳送端的驅動器。
PCI-E的傳輸速率是2.5Gbps(波特率,Baud Rate),所容許的誤差範圍是正負300ppm。將它展開數學運算後,即可發現該匯流排傳送端所允許的頻率範圍就是2.49925~2.50075GHz。如果用單元間隔 (Unit Interval, UI)來計算,2.5Gbps的一個單元間隔是400ps,由於有正負300ppm的餘域,因此,最壞的情況下應該是399.88~400.12ps,600ppm的兩端時脈差。換句話說,經過1,666個週期,有可能位移一個時脈。
既然,資料的放入與取出是有差異時脈之存在,因此,勢必要追蹤緩衝器裡的資料裝填狀態,才能避免錯誤發生。PCI-E為了彈性緩衝器,可以在適當的時間插入或移除符號,且特意規範SKP指令集(Ordered-sets),由「COM+SKP+SKP+SKP」四個編碼後之符號所組成。
傳送端就必須在最大的容許範圍,也就是600ppm的最壞情況下,送出SKP指令集,用來補償兩端時脈差異。600ppm的最壞情況意味著,每1666個週期有可能位移一個時脈。
根據PCI-E的規範,傳送端在1180~1538的符號時間內(請留意,不是位元時間)送出SKP指令集。而彈性緩衝器在所接收到的SKP指令集,最多可以插入或是移除兩個SKP符號,藉以補償兩端的時脈差。至於為何不是位元時間,最主要的原因是SKP符號的插入或是移除,每次都是整個符號在處理,也就是4ns的時間。
然而,不難想像,有一種機會存在,不能讓SKP指令集在依據規定的時間間隔內送出。那就是當資料交易層封包(Transaction Layer Packet, TLP)很大時,就必須等候整個TLP傳完之後,才能夠立即將所應該丟出去的累積SKP指令集傳送出去。
PCI-E PHY三大區塊決定EB座落位置
由於PCI-E的實體(PHY)層的構成元素頗多,以下分析最為重要的三個功能區塊與彈性緩衝器之間的連接關係。這三個重要的要素即是解串器(De-serializer)、8b/10b解碼器以及解偏移電路(Deskew)。
如前面所提,彈性緩衝器針對SKP指令集中SKP符號的插入或移除,是以符號的層次來處理。所以,彈性緩衝器是在解串器的後面。
再來,彈性緩衝器擺在8b/10b解碼器之前或之後,似乎都合理。但是,PCI-E有規定一樣機能,那就是迴路從屬端(Loopback Slave)。大意是說,PCI-E裝置有義務將主控端所送過來的1/0位元符號,原封不動地傳送回去,不能有任何修改。但是,時脈補償還是必須維持。因此,不難了解彈性緩衝器是放在8b/10b解碼器之前。規格中清楚記載,所有PCI-E裝置必須支援迴路從屬端的機能,而作為迴路主控端(Loopback Master)的扮演,則是列為選項。這個機能對於測試提供莫大方便。
最難直接體會就是彈性緩衝器與解偏移電路的前後關係。先來回顧PCI-E匯流排的一項重要特徵—允許多條傳輸巷道(Lane)的構成,也就是x1/x2/x4/x8/x16/x32的構成。
但是,偏偏PCI-E允許資料可以在分割多條傳輸巷道上載送,即位元等量(Byte Striping)(圖5)。
此時便會產生問題,因驅動器或各個傳輸巷道跑線長度不同或其他因素,各個傳輸巷道的接收端有機會提前或落後,因而有時序不對稱(Lane-to-lane Skew)時間差的存在(圖6)。因此,也才需要解偏移電路的存在,而彈性緩衝器位於其後,也就順理成章。
計算符號位移與實踐EB
接著,最為精彩的地方,就是彈性緩衝器的實踐方式與空間大小的拿捏。一般而言,彈性緩衝器的大小至少取決於底下三個因素,分別是傳送SKP指令集的時間間隔、裝置支援的最多資料承載量(Payload)以及連結寬度。儘管規格明文指出,每1,180~1,538個符號須送出SKP指令集。但是,TLP傳到一半時可能也是該丟SKP指令集的時間點,必須耐心等候完全載送TLP出去,這就是為何一定要鄭重考量最多資料承載量的主要原因。
可以試著考量最壞的情況,當兩端的PCI-E裝置以x1的連接型態存在時,而且,當傳送端送出最大承載量的封包之後,剛好也是必須規畫送出SKP指令集之際,因此,可以藉由一個數學公式來展現(圖7)。
圖7公式中的TLP_Overhead是可以定性定量算出其最高值,總共是28個符號值。逐項列之如下:
‧資料框的開始符號(1個符號)
‧封包次序號碼(2個符號)
‧封包標頭(16個符號)
‧ECRC(4個符號)
‧LCRC(4個符號)
‧資料框的結束符號(1個符號)
由於PCI-E所能夠允許的資料最大承載量是4096個位元組。根據圖7數學式就可以輕易算出,最多的符號位移是3.4個。若是承載量是2,048個位元組,符號位移是2.17個(表1)。
至於彈性緩衝器的實踐方法,一般有兩種策略。第一種方式是將彈性緩衝器始終維持在半滿的狀態。正常情況下,彈性緩衝器維持在半滿的狀態下。因為,SKP指令集中的SKP符號可以移除或是填入,來補償兩端的時脈差。當一個裝置能夠應付4,096位元組的承載量時,其彈性緩衝器的深度該為8。
舉例來說,當局部端的時脈比較慢,也就是拿取的速度比不上符號裝填的速度,為了防止溢位的發生,就可以在所接收到的SKP指令集當中移走兩個SKP符號。盡可能讓彈性緩衝器維持在半滿的狀態。
另外一種實踐策略是流程控制,此種方式並非將彈性緩衝器維持在半滿狀態,而是將彈性緩衝器的正常情況僅維持在一個底端進入點的狀態。
當局部端的時脈比較快時,允許下溢(Underflow)的發生,這一點沒有什麼大問題。但是,當局部端的時脈比較慢時,方法就與前面的方式一樣,可以在SKP指令集當中移走SKP符號。盡可能讓彈性緩衝器維持在正常狀態。
上述兩種方式,各有其優點。比如說,採用流程控制方式時,其緩衝器深度可以較少。其等待時間(Latency)也比較短。在4,096位元組的承載量時,其彈性緩衝器的深度為5。因為必須加上一個底端的進入點。但是,無可否認地,在實踐上線路就更為複雜。
綜合以上所言,彈性緩衝器的深度與資料承載量息息相關,而彈性緩衝器寬度就要思考編碼的方式。
(詳細圖表請見新通訊62期4月號)