4. 異步FIFO(先進先出)
圖<6>是深度(depth)為8的異步FIFO的示意圖。其中,0~7代表8個寄存器,他們組成了一個環。
綠色的外圈代表寫操作,按照順時針方向(地址遞增),依次寫入不同的寄存器;寫完所有的寄存器,再從寄存器#0開始,循環不斷;寫指針(wrtie pointer)代表當前寫入寄存器的地址;寫操作是寫時鐘的同步電路。
橙色的內圈代表讀操作,按照順時鐘方向(地址遞增),依次讀取不同的寄存器,讀完所有8個寄存器,再從寄存器#0開始,循環不斷;讀指針(read pointer)代表當前讀取寄存器的地址;寫操作是讀時鐘的同步電路。
圖<6>
對于特定寄存器,FIFO必然是先寫后讀;FIFO內部,讀指針在不斷追趕寫指針。當寫指針跑的太快,比如已經超越讀指針一圈,這種狀態就是寫滿(FIFO full),這時候繼續寫入就會把覆蓋(overwrite)未被讀取的寄存器(上溢,overflow),造成數據的丟失;另一種情況,讀指針等于寫指針,這種狀態就是讀空(FIFO empty),指向的寄存器還沒有被寫入,這時候繼續讀,讀出來的是空的或者是上一個循環已經讀取過的數據(下溢,underflow)。
寫滿(Full):讀指針 = 寫指針 + FIFO深度;
讀空(Empty):讀指針 = 寫指針;
寫滿和讀空是兩種邊界狀態,更多情況下,FIFO處于寫滿和讀空之間的中間狀態。讀指針和寫指針之間的差值形成了水位圖(watermark),代表著FIFO的實際使用率。
異步FIFO的實現有很多技術考量,最重要的是跨時鐘域(CDC)問題:寫指針和寫滿信號屬于寫時鐘的時鐘域;讀指針和讀空信號屬于讀時鐘的時鐘域。有很多文獻討論異步FIFO的實現細節,有興趣的可以參考文獻<1>。
異步FIFO的設計已然成熟,經過封裝后成為異步FIFO模塊(或者IP),比如圖<7>。我們可以直接調用而不必顧慮內部的細節。
圖<7>
圖<7>中,左側是寫操作,右側是讀操作,讀寫操作工作在各自的時鐘域,互不影響。只要沒有寫滿信號,寫操作就可以一直持續;只要沒有讀空信號,讀操作也可以一直持續。數據源源不斷從左側流向右側。
5. RX彈性緩存(Elastic Buffer)
在以太網的接收端,PCS層使用彈性緩存來補償時鐘的PPM頻率差異。
10b編碼經過異步FIFO,從RX時鐘的時鐘域轉換到本地時鐘域。
802.3標準沒有提供異步FIFO的實現細節,老戚從Xilinx的用戶手冊找了一個1000Base-X設計例子做為參考。
這是一個深度為32的異步FIFO。計算讀指針和寫指針的差距,形成了圖<8>的水位圖。
圖<8>
當水位上升時,意味著FIFO讀取的速度大于寫入的速度;反之,則意味著FIFO讀取的速度小于寫入的速度。
上篇說到,PCS和PMA之間(TBI)的10b編碼是連續的。讀寫時鐘(本地時鐘 VS RX時鐘)的頻率差異會導致水位或者上升到上溢,或者下降到下溢。
RX彈性緩存能夠識別10b碼型,然后根據水位來相應的插入或者刪除特定的10b碼型。
當水位上升到上半部灰色區間時,就刪除IDLE碼;
當水位下落到下半部灰色區間時,就插入IDLE碼;
當水位處于中間區域時,既不刪除也不插入。
圖<9>
MAC層的以太網幀之間的間隙(IPG)最小是12字節(Octets);而在PCS層,最小IPG轉換成10b碼型:/T/,/R/,5/I/*。(見上篇)
由于不能刪除幀內數據,MAC幀越長,頻差積累的影響就會越大。
假設RX時鐘頻率為正偏100PPM,本地時鐘頻率為負偏100PPM,考慮最長的Jumbo幀:
9216 Byte * (1.0001 / 0.9999 - 1) = 1.84 Byte
或者說,刪除一個/I/(/I2/ = /K28.5/D16.2/)就足以補償最大時鐘PPM偏差。
如果RX的時鐘慢于本地時鐘,那么就需要插入IDLE碼。
理想的水位是中間,比如16,這也意味著數據經過FIFO的時候會有16x 10b (128ns)的延時。
6. 為什么還會丟包?
RX時鐘慢于本地時鐘的情況下,在RX的10b數據中插入IDLE碼,IPG變大,不會造成問題;反過來,會刪除部分的/I/,結果可能導致以太網幀的IPG被削減到標準之下,雖然并不損失正常數據,但是在MAC層可能成為問題。
圖<10>
通常而言,交換芯片(點擊進入:可編程交換芯片)的內部帶寬會大于接口的帶寬,所以入口(Ingress)側也不會丟包;在出口(Egress)側,MAC卻必須嚴格按照802.3標準恢復12字節的最小幀間隙,這會減緩發送的速度??梢韵胂?,長時間的飽和流量會導致出口側的緩存(packet buffer)越積越滿。這種情況持續發生,最終會導致出口丟包。
圖<11>
對于交換機產品,端口之間互相打包(轉發包)是最基本的驗證測試項目(圖<11>)。我們期望線速(line rate,utilization 100%,最小IPG)不丟包,然而,經常會看到99.9999%就丟包了,丟的數量不多,短時間甚至看不出來;調到99.99%變好了;或者下調發包儀器(traffic generator)的參考時鐘,比如-10PPM,丟包問題就消失了。當然,也有很多交換機按照100%速率轉發包沒有任何問題。究其原因,就是PPM時鐘頻率偏差引起的。
一個有意思的推論就是,雖然PCS能夠補償時鐘的頻率差異,同步以太網(Synchronized Ethernet)時鐘驅動的時鐘域,至少要包含MAC層,而不僅僅是PCS PHY。(SYNC-E下次聊)
部分以太網交換機的廠商會使用中心頻率正偏25PPM的參考時鐘,使得交換機的本地時鐘處在相對高位,從而避免頻差引起的丟包。但是,交換機之間的背對背連接呢?只要頻率是本地產生的,總是會有高有低,這樣做不能從根本上解決問題。
實際上,對于以太網的應用來說,PPM時鐘偏差的影響并不大。不像SDH/SONET這種時分復用的系統,以太網包交換(packet switching)的優勢在于帶寬動態復用(或者統計復用,Statistical Multiplexing),企業級交換機(Enterprise Class Ethernet Switch)使用大緩存(packet buffer)來起到削峰填谷的作用。在MAC層,802.3X流控(flow control)協議定義了Pause Frame,可以用來通知對端暫停發送一段時間。更上層,TCP支持出錯重傳,還有QoS等等。
以上的討論都是基于1000Base-X。當以太網的端口速率上升到10G以上,8b10b編碼就被64b66b替代了,降低了額外帶寬開銷,前提是PMA層的CDR的技術提升(僅僅要求66b保證最少一次01轉換);PCS層的IDLE碼換了形式繼續存在;8b10b檢錯變成了AM控制碼攜帶的BIP(Bit Interleaving Parity)??偟膩碚f,形式變了,原理沒有變。而且,不僅是以太網,PCIe、SAS、SATA、USB等等也有類似的功能。
小結一下:物理層(physical layer)的物理編碼子層(PCS - Physical Coding Sublayer)對解決時鐘PPM問題起了關鍵作用,PCS借助FIFO處理跨時鐘域,通過刪除或插入IDLE碼組,來補償接收數據和本地時鐘的有限頻差,這就是彈性緩存(Elastic buffer)。彈性緩存加上包緩存,對突發(burst)數據流量有完美的效果,卻不能解決長時間線速(line rate)流量下的丟包問題。當然,通過802.3X流控或者更上層協議避免長時間線速。
-
以太網
+關注
關注
40文章
5381瀏覽量
171141 -
寄存器
+關注
關注
31文章
5322瀏覽量
120024 -
fifo
+關注
關注
3文章
387瀏覽量
43556 -
時鐘
+關注
關注
10文章
1720瀏覽量
131374 -
PPM
+關注
關注
0文章
46瀏覽量
16960
發布評論請先 登錄
相關推薦
評論