唐文武 袁子喬
(西安電子工程研究所 西安 710100)
隨著信息化時代的深入發展,信號處理系統往往需要具備極高的數據處理能力和傳輸能力,以滿足信息的有效性與實時性。針對信號處理系統的傳輸性能要求,本文將著重介紹一種高速IO口——串行高速IO口(Serial Rapid I/O,SRIO)。RapidIO主要是一種基于數據包交換的互聯體系結構[1],在處理器互連、存儲子系統、通用計算平臺等場合得到廣泛應用。自2001年3月發布RapidIO1.1規范以來,RapidIO規范在不斷迭代更新,傳輸速率也在不斷提高,如今的RapidIO2.x規范已支持最高達6.25GHz的傳輸速率。RapidIO能夠滿足高性能嵌入式系統中板內多DSP與FPGA高速數據傳輸的技術要求,并克服傳統互連模式存在的局限性,其在高性能嵌入式系統中的表現已得到業界的廣泛認可。
本文旨在介紹SRIO接口及其協議,并重點介紹封裝SRIO工程的必要性及自定義SRIO工程IP核使用問題,為此本文將按照如下章節安排進行論述:
1)第一節:對SRIO技術及其應用作簡要概述,指出NREAD與SWRITE包包頭格式。
2)第二節:介紹了本文對SRIO工程改進之處并進行仿真驗證,最后介紹封裝后的用戶IP及其調用方法。
3)第三節:總結本次改進工作,提出待改善的問題。
串行高速IO口(Serial Rapid I/O,SRIO)是RapidIO標準的一種,其物理層數據傳輸過程是串行的。本文著重介紹串行RapidIO標準,即串行高速IO口(Serial Rapid I/O,SRIO)。串行RapidIO在數據傳輸中使用了串行差分信號傳輸的方式。這樣的傳輸方式能有效地抑制干擾,提高傳輸距離,如圖1所示,每個tx或rx代表一對差分信號線,數據包通過兩根串行差分信號線進行傳輸。

圖1 SRIO傳輸示意圖
除了物理層之外,RapidIO還包含邏輯層和傳輸層,此三層協議共同構成RapidIO協議,對RapidIO協議有所了解有助于用戶理解和使用,下面對SRIO協議做簡要介紹。
RapidIO協議由邏輯層、傳輸層和物理層構成,為此互連技術提供相關的規范標準。RapidIO協議中邏輯層位于最高層,規定了包格式和所有的協議,為端點器件發起、完成事務提供了必要的信息。RapidIO支持直接IO/DMA和消息傳遞兩類事務,其中直接IO/DMA事務又可分為NREAD(帶響應的讀事務)和SWRITE(流寫事務)等。RapidIO協議規定在傳輸有效數據之前,需先傳包頭,包頭包含了數據傳輸需要的相關信息,如定義格式類型的FTYPE字段,定義傳輸類型的TTYPE字段,一個完整的請求包和響應包包頭格式分別如圖2(a)和圖2(b)所示。

圖2 HELLO包包頭格式
在工程應用中,用戶只需了解邏輯層的各個字段含義即可。其中不同的FTYPE字段和TTYPE字段可唯一確定事務功能,下表1給出了工程中用到的NREAD模式和SWRITE模式HELLO包包頭格式。

表1 邏輯層HELLO格式包包頭
在高性能的嵌入式系統中,數據處理的快慢不僅取決于數字信號處理器(Digital Signal Processor,DSP)與FPGA處理能力[2-3],數據傳輸線路的傳輸性能也會影響到整個系統的效率。采用多通道并行傳輸的方式,可有效地提高數據傳輸速率、降低延時[4]。基于上述需求,本文提出以多通道(4X模式)SRIO互連技術作為作為數據傳輸方式,并采用其NREAD模式及SWRITE模式實現數據的有序分發,通過對FPGA中SRIO工程的模塊化改進,實現更為高效的編程使用。
在雷達信號處理中,通常每秒需要幾十至幾百次運算[5],這無疑對數據吞吐量提出巨大挑戰。為了提高傳輸效率,在本次改進工作中,我們規定SWRITE事務每次傳輸256字節數。其次,本文以簡化雙口RAM存儲方式替代原先的FIFO存儲,其優勢在于與FIFO存儲方式相比,RAM對存儲單元是可尋址的,便于實現每寫32個8字節數自動發送的功能,用戶只需按照一定時序將數據寫入RAM即可,不需要考慮何時發送及與發送相關的問題,極大地簡化了使用過程。改進后的SRIO工程傳輸原理如圖3所示。

圖3 基于RAM的SRIO工程數據傳輸原理
SWRITE模式具有打包效率高、傳輸穩定的特點[6],對模塊化設計的SRIO工程進行仿真時設立my_ireq_tlast信號,在每次傳輸至最后一個數據時將其拉高,因此兩個相鄰my_ireq_tlast脈沖的時間間隔即為完成一次數據包傳輸所消耗的時間。經過改進的SWRITE事務的用戶數據寫入時序如仿真圖4所示。
仿真圖時序關系為,當srio_init_done拉高時,表明SRIO初始化完成;此時用于時序控制的寫使能控制計數器dv_cnt在RAM寫時鐘ram_wr_clk下開始累加。由圖4可知,發送復位信號rst_send隨著dv_cnt累加至一定值作周期性拉高數個ram_wr_clk;rst_send脈沖后延時2個寫時鐘,寫使能dv_data_send拉高,8字節數data_send按照ram_wr_clk節拍寫入RAM中;每寫入32個data_send時,程序自動觸發SRIO讀取RAM數據并發送操作。

圖4 SWRITE事務時序圖
仿真中將SRIO的發送總線與接收總線相連,因此在正確傳輸數據時,數據接收總線data_send應接收到與數據發送總線val_treq_tdata_out上的數據。本次仿真中,發送數據按字節累加寫入data_send,如圖5(a)所示,data_send為一按字節遞增數。在數據接收端val_treq_tdata_out上接收到與data_send相同的數據,如圖5(b)所示,說明本此改進后的SRIO工程能正確地傳輸數據。

圖5 仿真發送與接收的數據包
再觀察數據包包頭,按照協議,在每次傳輸256字節情況下SWRITE模式邏輯層包頭應為0060_xffx_xxxx_xxxx,這里x代表未定數,各字段含義參照表1所示。根據仿真結果,如圖6所示,發送數據第一包為包頭,其值為0060_2ff0_0c30_0000,可知FTYPE字段的值為6,表明這是一個SWRITE事務。

圖6 SWRITE請求事務包頭信息
為了對比不帶響應的SWRITE事務與帶響應的NREAD事務,本節將分析NREAD事務數據交換流程,確定兩者差異,為工程應用提供參考。NREAD請求事務僅包含HELLO格式包頭,包頭提供了必要的信息,仿真結果顯示其包頭數據為xx24_2ff0_00c3_0000,x代表未定數,按照表1對應關系可知FTYPE字段為2,TTYPE字段為4,說明這是一個NREAD事物包,仿真結果如圖7所示,val_ireq_tvalid與val_ireq_tready同時為高時,val_ireq_tdata上的數據即為包頭數據。

圖7 NREAD請求事務包頭信息
NREAD事務的發起方提供數據交流所需的必要信息,目標方則需要對此進行響應,按發起方的要求將數據發送給發起方。響應事務HELLO格式包頭類似于表1,響應事務的FTYPE=13,TTYPE=8。
在FPGA向DSP進行雷達數據分發時,若采用SWRITE事務類型,FPGA主動向DSP發送數據,數據分發效率較高,需要DSP進行及時處理;若采用NREAD事務類型,DSP主動向FPGA請求數據,在DSP處理性能較低或處理任務量巨大時可采用此事務類型。
原SRIO工程可全面測試SRIO各項功能,并生成一些報告信息,其源文件較多,且源代碼較混亂,不適用于實際工程。針對工程應用,在確保仿真各項邏輯無誤且編譯通過的情況下,本文改進工作簡化了SRIO工程,去除冗余代碼及模塊,達到了提升工程模塊化設計和提高應用效率的預期效果,工程包含了四個模塊,分別為:
1)top_srio_app.v模塊:工程的頂層模塊,負責本地設備與遠端設備進行信息交互,用戶可通過該模塊給SRIO核與RAM提供時鐘、系統復位、數據寫入與接收等操作;
2)srio_gen.v模塊:工程的中間模塊,作為頂層模塊top_srio_app.v與底層請求/響應模塊的數據與控制交換中心,并例化了SRIO IP核;
3)srio_request_gen.v模塊:底層模塊,用于接收srio_gen.v模塊下傳的數據與控制信號,并按照RapidIO協議產生與請求包相應的數據與控制信號;
4)srio_response_gen.v模塊:底層模塊,模塊功能與srio_request_gen.v模塊相似,只是其產生的是響應包的數據與控制信號。如前文所述,本次改進工作在SWRITE事務數據緩存上,采用了一個寬度64bit,深度512的RAM代替FIFO。
為進一步提高該工程的便捷性、可移植性,遵循“三化”原則,本文將改進后的SRIO工程在vivado環境下封裝成用戶IP核,封裝后的IP核仿真工程結構如圖8所示,對比封裝前工程,封裝后工程得到大幅簡化,并且封裝內部變量與模塊,引出輸入輸出引腳供用戶使用,實現了工程模塊化設計。封裝后的SRIO工程即為用戶自定義IP核,其引腳圖如圖9所示,左側信號是輸入,右側信號是輸出。

圖8 封裝后的SRIO工程結構

圖9 封裝后的用戶自定義IP核
本用戶IP核控制邏輯與時序見2.2節,各引腳說明見表2所示。

表2 用戶IP核引腳說明
使用本用戶IP核時,需先將IP核拷貝到個人計算機,然后在vivado工程管理界面中添加該IP核至個人工程中,最后即可在IP目錄下找到該用戶IP核,雙擊調用即可。在使用中,為了避免丟包情況發生,在可接受范圍內應盡可能降低寫使能信號占空比。
本文按照“三化”要求,緊密結合工程應用現狀,對FPGA中的SRIO工程進行改進,改進工作主要圍繞以RAM存儲方式取代FIFO以及SWRITE事務下每次寫入32×8字節數自動觸發發送過程,最后對改進的SRIO工程實行封裝用戶自定義IP核,致力于解決SRIO工程中信號定義及控制邏輯不統一,移植效率較低的問題。實際驗證表明,本次改進工作取得良好的預期效果,但仍存在待解決的問題,如發送帶寬從時序上及存儲上有待優化,特別是在避免丟包漏包的問題上,可能存在更優的處理方案,以實現寫使能信號占空比的最大化,進一步提高帶寬。