賈 婷,胡 斌,劉 臺
(武漢中原電子集團(tuán)有限公司,湖北 武漢 430205)
千兆以太網(wǎng)技術(shù)是目前局域網(wǎng)的主流解決方案。千兆以太網(wǎng)交換芯片是該技術(shù)得以實現(xiàn)的關(guān)鍵芯片。
本文介紹的FPGA實現(xiàn)的千兆以太網(wǎng)二層交換芯片,按照IEEE802.3標(biāo)準(zhǔn)實現(xiàn)了4個獨立千兆端口之間的MAC幀交換。以太網(wǎng)二層交換是基于MAC地址工作的,基本工作原理可以概括為“學(xué)習(xí)查找”和“存儲轉(zhuǎn)發(fā)”。
設(shè)計支持以下功能項:
(1)支持4個10/100/1 000 Mb/s自適應(yīng),全雙工RGMII端口間的MAC幀線速轉(zhuǎn)發(fā);
(2)每個出端口支持4種優(yōu)先級隊列;
(3)支持基于IEEE802.3xPause幀的全雙工流量控制;
(4)支持簡單生成樹協(xié)議;
(5)支持4 096個MAC地址表項和基于Hash算法的自學(xué)習(xí)和查找。
(6)提供128 kB的MAC幀共享緩沖空間。
本文首先給出FPGA實現(xiàn)千兆以太網(wǎng)二層交換芯片的結(jié)構(gòu)框圖;其次,詳細(xì)介紹設(shè)計中關(guān)鍵模塊的實現(xiàn)原理;最后,給出設(shè)計的功能仿真,驗證該設(shè)計的可行性。
FPGA實現(xiàn)千兆二層交換芯片的功能框圖,如圖1所示。芯片內(nèi)部核心部分工作時鐘為125 MHz,端口可工作在1 000/100/10 Mb/s速率,端口時鐘可為125/25/2.5 MHz,因此需要端口幀收發(fā)緩存單元來緩存MAC幀。各端口接收到MAC幀后,向共享緩存控制單元發(fā)出請求。共享緩存單元公平輪詢各端口的請求,為MAC幀分配存儲空間,并將MAC幀從端口緩存單元分片存儲到共享緩沖區(qū),同時提取幀頭信息,進(jìn)行MAC地址的查找和自學(xué)習(xí)。將幀存儲的起始地址、優(yōu)先級信息、幀轉(zhuǎn)發(fā)類型和目的端口號生成描述符信息,寫入目的端口相應(yīng)優(yōu)先級的發(fā)送描述符隊列中。描述符調(diào)度單元從各端口發(fā)送描述符隊列中的調(diào)度描述符,按其攜帶的起始地址,從共享緩沖區(qū)讀取MAC幀,寫入目的端口的幀發(fā)送緩存單元,并釋放空閑地址;最后,由MAC發(fā)送控制器完成802.3 MAC幀的封裝和發(fā)送。交換芯片結(jié)構(gòu)框圖中還包括寄存器單元。用戶通過SPI接口訪問寄存器單元,可以通過讀取寄存器的值了解芯片的工作狀態(tài),并通過配置寄存器改變芯片的工作模式。
圖1 FPGA實現(xiàn)千兆交換芯片功能
模塊化設(shè)計是FPGA設(shè)計中的一個重要技巧。它可以將大規(guī)模復(fù)雜系統(tǒng)按照一定規(guī)則劃分成若干模塊,然后對每個模塊進(jìn)行設(shè)計輸入與綜合,并將實現(xiàn)結(jié)果約束在預(yù)先設(shè)置好的區(qū)域內(nèi),最后將所有模塊的實現(xiàn)結(jié)果有機(jī)組織起來,完成整個系統(tǒng)的設(shè)計。每個模塊本身又可以通過多個子模塊來實現(xiàn),因此模塊化設(shè)計不僅層次清晰,還有利于模塊的復(fù)用、移植,更有利于日后的代碼升級、維護(hù)以及設(shè)計的綜合優(yōu)化。根據(jù)FPGA設(shè)計中的模塊化設(shè)計思想,結(jié)合FPGA軟件的功能需求特點,基于以功能為主的原則,對FPGA程序進(jìn)行如圖2所示的模塊劃分。
圖2 模塊劃分
圖3是IEEE802.3規(guī)定的MAC幀格式。前兩個字段分別是目的MAC地址和源MAC地址,第三個字段是長度/類型字段。
圖3 IEEE802.3 MAC幀格式
數(shù)據(jù)字段是對上層IP數(shù)據(jù)報的直接封裝,IP頭部包含優(yōu)先級信息。IEEE802.3規(guī)定有效的MAC幀長為64~1 518 Byte,因此數(shù)據(jù)字段長度應(yīng)為46~1 500 Byte。MAC幀尾部是4 Byte的FCS,即幀檢驗序列。它采用CRC-32校驗碼,用以檢驗收到的幀是否存在差錯。
802.3 標(biāo)準(zhǔn)規(guī)定,凡出現(xiàn)下列情況之一的即為無效的MAC幀:
(1)第三字段表示長度時,MAC數(shù)據(jù)字段的長度與長度字段的值不一致;
(2)幀長度不是整數(shù)個字節(jié);
(3)用收到的幀檢驗序列FCS查出有差錯;
(4)收到的MAC幀長度不在64~1 518 Byte范圍內(nèi)。
當(dāng)目的MAC地址為x“FFFFFFFFFFFF”時,是廣播包;當(dāng)目的MAC地址為x“0180C2000000”時,是BPDU報文,用于實現(xiàn)生成樹協(xié)議;當(dāng)目的MAC地址為x“0180C2000001”時,是Pause幀,用于實現(xiàn)流量控制。
MAC幀收發(fā)控制器主要依賴MAC幀接收狀態(tài)機(jī)和MAC幀發(fā)送狀態(tài)機(jī)。根據(jù)IEEE802.3 MAC幀格式,MAC幀收發(fā)狀態(tài)機(jī)如圖4所示。
圖4 MAC幀收發(fā)狀態(tài)機(jī)
FPGA軟件對接收到的MAC幀進(jìn)行CRC校驗判斷,校驗錯誤的幀直接丟棄,只對校驗通過的幀進(jìn)行存儲轉(zhuǎn)發(fā)。
存儲轉(zhuǎn)發(fā)控制單元主要包括端口幀緩存單元、地址表查找單元、共享緩存管理單元和描述符調(diào)度單元。
2.2.1 端口幀緩存單元
FPGA軟件為每個端口設(shè)置MAC幀收發(fā)FIFO各1個。FIFO寬36 bit,深4 096。MAC幀在端口收發(fā)FIFO中的存儲格式,如圖5所示。
圖5 MAC幀數(shù)據(jù)存儲格式
端口完成數(shù)據(jù)幀的緩存后,會向共享緩存交換單元發(fā)出請求,請求為包分配存儲空間[1]。
2.2.2 地址表查找單元
本設(shè)計中,MAC地址表共支持4 096個MAC地址表項,地址表由1 000個Bucket組成,每個Bucket包含4個地址,組織結(jié)構(gòu)如圖6所示。地址表中,MAC地址的存儲位置是由48 bit MAC地址計算出來的Hash值的低10位決定的。Hash算法采用CRC-CCITT多項式(X16+X12+X5+1)實現(xiàn),根據(jù)MAC地址生成16位的Hash值,取其低10位,索引1 000個bucket。因Hash算法不是完美的,為防止出現(xiàn)碰撞,一個Hash值定位1個Bucket,每個Bucket包含4個MAC地址,第一個周期內(nèi)讀出bin0和bin1與DA比較;第二個周期內(nèi)讀出bin2和bin3。
圖6 基于hash算法的MAC地址表查找
2.2.3 共享緩存交換單元
FPGA軟件提供128 kB的共享緩存空間,并采用基于鏈表的控制機(jī)制對MAC幀分片存儲,每片128 Byte,共支持1 024片。實質(zhì)上,共享緩存式交換機(jī)是時分復(fù)用的,緩存在一個時鐘周期內(nèi),只能允許一個端口讀寫。本設(shè)計以輪循方式為各端口分配空閑地址。共享緩存管理單元負(fù)責(zé)完成MAC幀的分片處理,也就是以128 Byte為一個單位從端口緩存FIFO中讀取數(shù)據(jù),然后為每個分片分配存儲空間,并把第一個分片的存儲地址記錄在描述符中。每個分片除了記錄數(shù)據(jù)外,還記錄下一個分片的存儲地址。當(dāng)分片轉(zhuǎn)發(fā)出去后,共享緩存管理單元完成片地址的釋放。采用分片存儲數(shù)據(jù)包,一個數(shù)據(jù)包的所有分片形成一個鏈表。這種結(jié)構(gòu)使得發(fā)送描述符隊列相對簡單。每個描述符代表一個數(shù)據(jù)包,但只需要存儲第一個分片的地址。這種結(jié)構(gòu)可以自然實現(xiàn)數(shù)據(jù)包之間的分界,不需要設(shè)專門的定界符。空閑的片地址存儲在空閑地址隊列中,先進(jìn)先出,有效實現(xiàn)了空閑地址的分配和釋放。共享緩存管理單元的實現(xiàn)邏輯框,如圖7所示。
圖7 共享緩存管理單元實現(xiàn)邏輯框
2.2.4 描述符調(diào)度單元
RFC1349中定義的IP報文頭部ToS字段高3 bit標(biāo)識優(yōu)先級,可使數(shù)據(jù)包具有8種優(yōu)先級,其中0為最低優(yōu)先級,7為最高優(yōu)先級。FPGA軟件為每個端口設(shè)置4個優(yōu)先級隊列,根據(jù)數(shù)據(jù)攜帶的ToS信息將其描述符映射到相應(yīng)的優(yōu)先級隊列中排隊[2],映射關(guān)系和調(diào)度示意圖如圖8所示。它的優(yōu)先級關(guān)系為Cos0>Cos1>Cos2>Cos3。
圖8 描述符調(diào)度
每個端口4個描述符隊列之間的調(diào)度算法采用嚴(yán)格優(yōu)先級的方式進(jìn)行調(diào)度。只有當(dāng)高優(yōu)先級隊列為空時,才調(diào)度低優(yōu)先級隊列中的描述符。4個端口之間采用公平的輪詢機(jī)制進(jìn)行調(diào)度。描述符32 bit,具體格式如圖9所示。
圖9 描述符格式
當(dāng)很多個交換機(jī)形成一個網(wǎng)絡(luò)時,極有可能產(chǎn)生環(huán)路。此時若網(wǎng)絡(luò)上有廣播報文時,因為交換機(jī)對廣播報文的處理是所有端口復(fù)制轉(zhuǎn)發(fā),而環(huán)路的形成就會導(dǎo)致廣播報文永遠(yuǎn)無法消除,且被復(fù)制的越來越多而形成廣播風(fēng)暴,最終導(dǎo)致網(wǎng)絡(luò)崩潰。生成樹的作用是對網(wǎng)絡(luò)進(jìn)行自動拓?fù)?,防止環(huán)路的產(chǎn)生[3]。
FPGA實現(xiàn)的二層交換芯片具備以下功能,可以支持生成樹的運行:
(1)可以通過寄存器配置交換模式,選擇是否使能生成樹協(xié)議;
(2)可以識別以01.80.c2.00.00.00為目標(biāo)地址的MAC層網(wǎng)橋協(xié)議數(shù)據(jù)單元BPDU報文,并通過IMP口將其轉(zhuǎn)發(fā)且只轉(zhuǎn)發(fā)給CPU;
(3)可以處理生成樹標(biāo)簽,對于轉(zhuǎn)發(fā)給CPU的報文,在標(biāo)簽中添加接收端口;從CPU接收的報文可以按照CPU在標(biāo)簽中指定的端口轉(zhuǎn)發(fā);
(4)CPU可以通過寄存器配置各端口的生成樹狀態(tài),交換芯片能在下面5種狀態(tài)里控制轉(zhuǎn)發(fā):
①Disabled(禁止態(tài)),不能接收和發(fā)送任何MAC幀;
②Blocking(阻塞態(tài)),只能接收BPDU,不能傳輸數(shù)據(jù),也不能發(fā)送BPDU;
③Listening(監(jiān)聽?wèi)B(tài)),不能接收或者發(fā)送數(shù)據(jù),但可以接收和發(fā)送BPDU;
④Learning(學(xué)習(xí)態(tài)),不能傳輸數(shù)據(jù),可以發(fā)送和接收BPDU,可以學(xué)習(xí)MAC地址。
⑤Forwarding(轉(zhuǎn)發(fā)態(tài)),能夠發(fā)送和接收數(shù)據(jù)和BPDU。
IEEE802.3x中定義了全雙工鏈路上流量控制的PAUSE機(jī)制,使用MAC Control幀攜帶PAUSE命令。PAUSE命令的MAC Control幀格式如圖10所示,幀長度為64 Byte。多播地址01-80-C2-00-00-01保留給PAUSE幀專用。
圖10 PAUSE幀格式
PAUSE幀中包含了PAUSE操作碼和要求的暫停時間間隙。這些信息以兩個字節(jié)整數(shù)形式表示,其中包含請求接收站點停止發(fā)送數(shù)據(jù)的時間長度。暫停時間以暫?!皅uanta”為單位,每個“quanta”等于512位時間。暫停時間的范圍為0~65 535個單位。通過利用MAC Control幀傳送PAUSE請求,全雙工鏈路一端的站點能夠請求另一端的站點在一段時間內(nèi)停止發(fā)送數(shù)據(jù)。當(dāng)暫停發(fā)送的端口收到時間因子為0的pause幀時,則停止等待,恢復(fù)發(fā)送。
本設(shè)計實現(xiàn)的千兆二層交換芯片,首先各端口是否使能pause幀機(jī)制的流量控制,是CPU通過寄存器配置的。若是端口未使能pause幀的流控,則共享緩存剩余空間不足時,直接丟棄數(shù)據(jù)包,避免緩存溢出,包處理出錯。若端口使能了pause幀的流控機(jī)制,則在共享緩存剩余空間低于下限時,發(fā)送時間因子為x“FFFF”的pause幀,讓對端等待,停止發(fā)送;當(dāng)共享緩存剩余空間高于上限時,發(fā)送時間因子為x“0000”的pause幀時,讓對方停止等待,恢復(fù)發(fā)送。這種方式又稱為Xon/Xoff喚醒機(jī)制的流控方式。
僅僅采用基于Pause幀的流量控制,并不能保證高優(yōu)先級數(shù)據(jù)的實時轉(zhuǎn)發(fā)。假如某端口同時有多種優(yōu)先級的數(shù)據(jù)需要發(fā)送,為了避免低優(yōu)先級的數(shù)據(jù)積壓占用共享緩存而引發(fā)pause幀的流控,造成高優(yōu)先級的數(shù)據(jù)也暫停傳輸,F(xiàn)PGA程序中還加入了低優(yōu)先級數(shù)據(jù)包的丟棄機(jī)制,即當(dāng)共享緩存剩余空間低于下限時,若當(dāng)前端口只有一種優(yōu)先級的數(shù)據(jù),則啟動pause幀的流控;若當(dāng)前端口有兩種及以上優(yōu)先級的數(shù)據(jù)時,則首先丟棄最低優(yōu)先級的數(shù)據(jù),釋放緩存空間。
本設(shè)計的軟件開發(fā)平臺是Xilinx ISE 13.3,利用其自帶仿真工具進(jìn)行功能仿真。圖11給出了MAC幀從端口2接收,然后交換至端口1發(fā)送的仿真結(jié)果。
從仿真圖11可以看出,從端口2接收到的MAC幀,先寫入端口接收FIFO中,完成幀的存儲后產(chǎn)生rxfifo_req請求信號。然后,共享緩存單元響應(yīng)請求,先從freecellfifo空閑片地址FIFO中讀取一個空閑片地址x“38”,把數(shù)據(jù)從接收FIFO中寫入共享緩存,并產(chǎn)生一個描述符,將描述符寫入信號descriptor_valid。當(dāng)描述符寫入目的端口相應(yīng)優(yōu)先級的描述符隊列后,共享緩存調(diào)度描述符,按照描述符中攜帶的起始地址從共享緩存中讀取數(shù)據(jù),并釋放了x“38”的片地址。端口1的發(fā)送FIFO中有數(shù)據(jù)后,便開始通過發(fā)送控制器往鏈路上發(fā)送數(shù)據(jù)。
本文的設(shè)計對象是千兆以太網(wǎng)二層交換芯片。通過上述分析和仿真驗證,可以證明FPGA體系結(jié)構(gòu)和功能的正確性。目前,設(shè)計的可管理性主要包括鏈路配置、生成樹配置以及流控配置。相比于市場上成熟的交換芯片,該設(shè)計可以滿足千兆自適應(yīng)二層交換的基本功能,但是尚存在需要完善和豐富的地方,也是后期繼續(xù)研究的方向。