郭 佳,張 淵,馮 偉,吳 駿
(中國船舶集團有限公司 第七二二研究所,湖北 武漢 430205)
RapidIO 總線協(xié)議[1]經(jīng)過20 多年的發(fā)展,已成為基于數(shù)據(jù)分組交換的高性能系統(tǒng)互聯(lián)[2]首選解決方案之一,廣泛應(yīng)用于無線通信、軍事、超算、醫(yī)學(xué)圖像處理和工業(yè)控制等多個領(lǐng)域,而這些領(lǐng)域無一例外地關(guān)系到國計民生和國家安全。目前,提供RapidIO 總線接口的芯片主要來自美國恩智浦公司的PowerPC、德州儀器公司的C6000 系列DSP、瑞薩公司的TSI 系列RapidIO 交換芯片和PCIe 轉(zhuǎn)RapidIO 橋片,以及賽靈思公司的RapidIO IP 軟核,而國內(nèi)則鮮見對標上述芯片的國產(chǎn)化替代方案。
本文提出一種基于龍芯2K1000 處理器[3]和復(fù)旦微FPGA 的全國產(chǎn)RapidIO 解決方案,并結(jié)合具體項目驗證該方案的可行性。
復(fù)雜的嵌入式設(shè)備,如核心網(wǎng)高端交換機、路由器、5G 基站、飛機航電系統(tǒng)等,一般采用多子卡機架式設(shè)計,這些子卡由機架背板布線信號聯(lián)通,從而實現(xiàn)相互間的通信。子卡間的通信一般包括數(shù)據(jù)平面通信和控制平面通信。數(shù)據(jù)平面通信一般要求實現(xiàn)高可靠、高帶寬、低延遲的全雙工通信,相應(yīng)的數(shù)據(jù)平面系統(tǒng)互聯(lián)方案包括RapidIO 總線、以太網(wǎng)和PCIe 總線等,而RapidIO總線以其傳輸帶寬高、互聯(lián)信號線少、抗干擾性強、易于擴展等優(yōu)勢成為如飛機航電系統(tǒng)等復(fù)雜系統(tǒng)的首選子卡數(shù)據(jù)平面高速互聯(lián)方案。
龍芯2K1000 處理器(下文簡稱CPU)是中科院計算所研發(fā)的面向網(wǎng)絡(luò)應(yīng)用、工業(yè)控制等領(lǐng)域的嵌入式SoC處理器。片內(nèi)集成兩個64位的雙發(fā)射超標量GS264處理器核,兼容MIPS64 體系結(jié)構(gòu),主頻為1 GHz,集成64 位DDR3控制器、SATA3控制器、2個x4的PCIe 2.0控制器、2 個千兆以太網(wǎng)控制器等多種外設(shè)。龍芯2K1000 處理器具有豐富的外設(shè)資源,適合作為控制子卡的處理器,但由于片上沒有集成RapidIO 控制器,比較可行的替代方案是使用復(fù)旦微JFM7K325T FPGA配合RapidIO IP軟核來實現(xiàn)RapidIO 總線接口,再選取PCIe 2.0總線接口作為龍芯2K1000 處理器與復(fù)旦微FPGA 之間交換數(shù)據(jù)的通路。FPGA 端RapidIO 總線采用LP-Serial x1 物理層接口,工作頻率為3.125 GHz,數(shù)據(jù)帶寬為2.5 Gb/s。軟件方面,在龍芯2K1000處理器上運行國產(chǎn)銳華實時操作系統(tǒng),并研發(fā)銳華系統(tǒng)下的PCIe 驅(qū)動程序和RapidIO 驅(qū)動程序;硬件方面,使用中航通用公司自行研發(fā)的國產(chǎn)RapidIOIP 軟核。以龍芯2K1000 處理器和復(fù)旦微電JFM7K325T FPGA 為核心構(gòu)建最小子系統(tǒng),系統(tǒng)總體設(shè)計方案[4]如圖1所示。
圖1 系統(tǒng)總體方案設(shè)計示意圖
CPU 與FPGA 之間通過PCIe 總線和LPC 總線相連,其中高速信號使用PCIe 總線傳輸,控制信號使用LPC總線傳輸。RapidIO 差分信號由FPGA 引出。CPU 和FPGA 均使用基于SPI 總線的NOR FLASH 存儲啟動固件,CPU 的大容量文件存儲使用并行的Nand FLASH,CPU 外接4 片x16 的國產(chǎn)DDR3 顆粒,CPU片上集成的兩路GMAC 以太網(wǎng)控制器通過RGMII 接口外接88E1111 千兆以太網(wǎng)PHY。FPGA 除引出RapidIO 信號外,還實現(xiàn)了HDLC 同步串口信號和RS 422 高速串口信號。子系統(tǒng)的外圍均使用國產(chǎn)化芯片,例如兆易創(chuàng)新公司研發(fā)的FLASH 芯片、長江存儲公司研發(fā)的DDR3 芯片和中電32 所研發(fā)的88E1111 以太網(wǎng)PHY 芯片等。
FPGA 與CPU 之間通過PCIe 總線[5]交換數(shù)據(jù)的方式主要有兩種,分別是PIO 方式和DMA 方式。PIO 方式的原理是:FPGA 在PCIe BAR 區(qū)間劃出一定范圍,實現(xiàn)數(shù)據(jù)寄存器、控制寄存器和狀態(tài)寄存器,CPU 使用MMU 映射PCIe BAR 空間,并基于簡單的數(shù)據(jù)拷貝算法實現(xiàn)數(shù)據(jù)交換[6]。使用PIO 方式進行PCIe 數(shù)據(jù)傳輸時,CPU 每次讀、寫數(shù)據(jù)寄存器都會觸發(fā)PCIe 的TLP 事務(wù)包,當(dāng)數(shù)據(jù)寄存器為4 B 時,凈荷數(shù)據(jù)只占到TLP 事務(wù)包的4 256,加上PCIe 每次TLP 事務(wù)建立開銷,容易得出PIO方式效率低的結(jié)論,因此不適合作為高速RapidIO 總線的數(shù)據(jù)通路。
DMA 方式使用FPGA 中的DMA 通道,在CPU 內(nèi)存和FPGA 內(nèi)存間搬運數(shù)據(jù),每次搬運時盡可能保證TLP事務(wù)包中的凈荷數(shù)據(jù)最大,且搬運過程不需要CPU 參與。當(dāng)CPU 向FPGA 發(fā)送數(shù)據(jù)時,CPU 僅向FPGA 告知需要發(fā)送數(shù)據(jù)的地址和長度,由DMA 通道負責(zé)搬運數(shù)據(jù),數(shù)據(jù)搬運完成后,F(xiàn)PGA 以PCIe MSI 中斷的異步方式通知CPU 數(shù)據(jù)搬運完成;當(dāng)CPU 從FPGA 接收數(shù)據(jù)時,CPU 首先告知FPGA 寫入數(shù)據(jù)的內(nèi)存地址,當(dāng)FPGA數(shù)據(jù)就緒時,DMA 通道將數(shù)據(jù)搬運到該內(nèi)存地址中,然后向CPU 發(fā)送PCIe MSI 中斷,通知CPU 數(shù)據(jù)搬運完成,CPU 可以通過讀取FPGA 特定的寄存器來獲取搬運數(shù)據(jù)的實際長度。
本方案采納的是一種改進的XDMA 方式[7],該方法的核心思想是使用數(shù)據(jù)描述符鏈表來控制CPU 與FPGA 之間的PCIe 數(shù)據(jù)收發(fā)與同步。XDMA 數(shù)據(jù)描述符如圖2 所示,數(shù)據(jù)描述的長度為固定的32 B,存儲數(shù)據(jù)描述符的緩沖區(qū)地址要保持與CPU 緩存行對齊,保證內(nèi)存吞吐效率最優(yōu)。描述符中存儲了DMA 通道需要搬運數(shù)據(jù)的長度、數(shù)據(jù)的源地址(從CPU 向FPGA 搬運數(shù)據(jù)時使用)/目的地址(從FPGA 向CPU 搬運數(shù)據(jù)時使用);控制字字段包括數(shù)據(jù)搬運完成標志位,用于標識數(shù)據(jù)搬運的狀態(tài)。描述符之間通過下一個相鄰描述符地址字段連接成單向鏈表,鏈表中最后一個描述符的該字段為空,作為鏈表尾部標識。CPU 在接收和發(fā)送數(shù)據(jù)前按需準備好數(shù)據(jù)描述符鏈表,并把鏈表首個描述符的地址設(shè)置到FPGA 的XDMA 寄存器中。
圖2 XDMA 數(shù)據(jù)描述符
基于XDMA 的數(shù)據(jù)傳輸方向包括CPU 到FPGA 方向和FPGA 到CPU 方向,兩個方向上數(shù)據(jù)傳輸?shù)脑砘鞠嗤?,都是由CPU 使用數(shù)據(jù)描述符隊列控制FPGA 的DMA 通道進行數(shù)據(jù)搬運。二者區(qū)別在于:PCIe MSI 中斷的含義不盡相同,前者代表DMA 通道完成從CPU 到FPGA 的數(shù)據(jù)搬運,后者代表DMA 通道完成FPGA 到CPU 的數(shù)據(jù)搬運。共同點在于中斷總是代表DMA 操作的結(jié)束。圖3 以CPU 搬運數(shù)據(jù)到FPGA 為例描述了XDMA 的具體過程,F(xiàn)PGA 到CPU 的數(shù)據(jù)搬運如前所述,過程大致相同,這里不做贅述。
圖3 XDMA 流程
當(dāng)數(shù)據(jù)由CPU 搬運到FPGA 后,F(xiàn)PGA 通過AXI 總線把數(shù)據(jù)路由到RapidIO IP 軟核[7-8],該IP 軟核經(jīng)過處理,把數(shù)據(jù)重新打包成符合RapidIO 協(xié)議的邏輯層和傳輸層幀格式,并最終通過SerDes 接口實現(xiàn)8B/10B 編碼和數(shù)據(jù)串行化,最后把數(shù)據(jù)送到RapidIO 物理鏈路上。當(dāng)RapidIO 物理鏈路上的數(shù)據(jù)到達FPGA 時,SerDes 接口對數(shù)據(jù)進行串并轉(zhuǎn)換和8B/10B 解碼,解析并提取RapidIO 幀的數(shù)據(jù)部分,并通過AXI 總線傳遞給DMA 模塊,然后使用1.2 節(jié)描述的方法,把數(shù)據(jù)搬運到CPU 的內(nèi)存中,并以PCIe MSI 中斷的方式通知CPU 數(shù)據(jù)搬運完成。RapidIO IP 軟核的功能模塊結(jié)構(gòu)如圖4 所示。
圖4 RapidIO IP 軟核的功能模塊結(jié)構(gòu)
為了論證本文提出的RapidIO 國產(chǎn)化方案,選取某國產(chǎn)通信系統(tǒng)[9]的主控子卡和接入控制子卡,用龍芯2K1000 處理器和復(fù)旦微FPGA 組成的最小子系統(tǒng)替換原有的基于美國恩智浦公司PowerPC 8569E 方案。
如圖5 所示,該通信系統(tǒng)是由多張子卡組成的復(fù)雜機架式系統(tǒng),該系統(tǒng)的子卡可劃分成三類,分別是控制子卡、業(yè)務(wù)子卡和業(yè)務(wù)輔助子卡。圖5 中的兩個灰色方塊分別代表主控子卡和接入控制子卡,二者硬件組成上基本一致,接入交換芯片的RapidIO 信號均工作在x1 3.125 GHz 模式。業(yè)務(wù)子卡采用國防科大研發(fā)的M6678國產(chǎn)DSP 芯片,片上集成2 個RapidIO 端口。控制子卡與業(yè)務(wù)子卡均由RapidIO 差分信號通過連接器引出并經(jīng)由背板布線信號接入國產(chǎn)TSI578RapidIO 交換芯片。按照本通信系統(tǒng)設(shè)計,控制子卡與業(yè)務(wù)子卡間有大批量、高實時性的業(yè)務(wù)數(shù)據(jù)傳遞需求。采用本國產(chǎn)化RapidIO 方案替換恩智浦公司的進口方案后,按照系統(tǒng)原有的設(shè)計用例進行回歸測試顯示,國產(chǎn)化方案在功能和性能上均滿足設(shè)計要求。
圖5 某國產(chǎn)通信系統(tǒng)
采用數(shù)據(jù)回環(huán)的方法測試CPU 與DSP 之間RapidIO 通信的性能[10],即CPU 通過RapidIO 接口發(fā)送不同長度的數(shù)據(jù)報文給DSP,DSP 收到數(shù)據(jù)后立即回環(huán)給CPU,CPU 通過記錄數(shù)據(jù)發(fā)送時的時間戳和收到回環(huán)數(shù)據(jù)時的時間戳,計算回環(huán)數(shù)據(jù)時延。記錄時間戳的方法[11]采用龍芯2K1000 處理器內(nèi)部的125 MHz 的HPET 高精度定時器,理論計算精度為8 ns。為了計算方便,假設(shè)CPU 通過RapidIO 發(fā)送數(shù)據(jù)給DSP 的時間與DSP 通過RapidIO 發(fā)送數(shù)據(jù)給CPU 的時間大致相同,取回環(huán)數(shù)據(jù)時延的1 2 為CPU 到DSP 的數(shù)據(jù)發(fā)送時延。依據(jù)該方法測試,得到時延與帶寬數(shù)據(jù)如表1所示。
表1 時延和帶寬統(tǒng)計
CPU 發(fā)送RapidIO 數(shù)據(jù)給DSP 的時延可大致分解成4 個階段[12]。記這4 個階段分別為T1~T4,如圖6 所示。
圖6 時延組成的4 個階段
圖6 中:T1表示數(shù)據(jù)從CPU 應(yīng)用層緩沖區(qū)拷貝到驅(qū)動緩沖區(qū)的時延;T2表示DMA 通道將CPU 驅(qū)動緩沖區(qū)的數(shù)據(jù)通過PCIe 接口搬運到FPGA 中的時延;T3表示數(shù)據(jù)在RapidIO 線路上的時延;T4表示數(shù)據(jù)到達DSP RapidIO 控制器硬件緩沖區(qū)后,DSP 驅(qū)動將硬件緩沖區(qū)的數(shù)據(jù)拷貝到應(yīng)用程序緩沖區(qū)的時延。
表2 是依據(jù)上述4 個階段,CPU 發(fā)送RapidIO 數(shù)據(jù)給DSP 時延的理論最優(yōu)估算值。
表2 T1~T4 階段時延估算值 μs
表2 中:T1和T4是內(nèi)存拷貝時延;T2是PCIe 總線傳輸時延;而T3是RapidIO 總線傳輸時延。龍芯2K1000 處理器和M6678 國產(chǎn)DSP 的工作主頻均為1 GHz,均外接4 片DDR3 內(nèi)存顆粒,總線寬度為64、內(nèi)存工作頻率為400 MHz;PCIe 接口符合PCIe 2.0 標準,由4 條差分信號對組成的x4 鏈路,單條鏈路的速度為5.0 GT/s;RapidIO總線工作在3.125 GHz,考慮到物理層采用8B/10B 編碼,有效帶寬為2.5 Gb/s。
針對內(nèi)存拷貝時延的估算,忽略DDR3 信號的建立保持時間,得到T1和T4時延估算公式為:
忽略協(xié)議幀開銷,僅考慮凈荷數(shù)據(jù),忽略物理層協(xié)議應(yīng)答幀的時間開銷,得到T2和T3的時延估算公式分別為:
表2 中的數(shù)據(jù)僅僅是一個粗略的估計[13],真實的時延計算需要考慮的問題比上述簡化估算公式要多得多,為了計算方便,估算公式僅考慮各時間階段最耗時的操作,且均以最優(yōu)方式為衡量。不難看出,在發(fā)送數(shù)據(jù)長度大于等于32 KB 時,理論估計時延和實測時延吻合得較好,而數(shù)據(jù)長度小于等于6.4 KB 時,二者的誤差則較大,原因在于:數(shù)據(jù)量較小時,CPU 時間戳計時的精度、CPU 數(shù)據(jù)緩存、CPU 時鐘中斷的粒度、CPU 任務(wù)上下文切換和中斷上下文切換的時間、FPGA 封包RapidIO 協(xié)議幀以及SerDes 編碼和串并轉(zhuǎn)換的時間等因素給總時延帶來的影響不可忽略。
本文闡述的基于龍芯2K1000 處理器和復(fù)旦微FPGA 的國產(chǎn)RapidIO 解決方案可以實現(xiàn)與其他支持RapidIO器件(如飛騰M6678國產(chǎn)DSP)互通,本方案應(yīng)用在2.1 節(jié)介紹的某通信系統(tǒng)中,可以實現(xiàn)原位替換原有的進口方案主控子卡和接入控制子卡。使用本國產(chǎn)RapidIO 方案替代后,該通信系統(tǒng)運行穩(wěn)定,在進行大量數(shù)據(jù)傳輸?shù)南到y(tǒng)實驗中,丟包率、誤碼率滿足原系統(tǒng)設(shè)計要求。龍芯2k1000 處理器在運行主控子卡和接入控制子卡的業(yè)務(wù)邏輯代碼中也展現(xiàn)了比較好的性能[14]。
綜上,國產(chǎn)自主可控替代方案,一方面要考慮到性能指標是否能達標或者基本達標,另一方面也要考慮國產(chǎn)芯片的產(chǎn)能等一系列的問題。龍芯2K1000 處理器作為中科院計算所自主研發(fā)的國產(chǎn)CPU,制造工藝為28 nm,該制程在國內(nèi)芯片制造廠家可以實現(xiàn)量產(chǎn),不受美國實體清單的制約。因此,本文方案所涉及的芯片選取、FPGA 邏輯開發(fā)、操作系統(tǒng)的選取、驅(qū)動開發(fā)等多個方面都能實現(xiàn)自主可控、性能達標,具有一定的現(xiàn)實價值。