在當前大數據網絡環境下,基于FPGA的云主機技(ji)術對單FPGA板卡實現PCIe PF和PCIe VF的規(gui)模(mo)以及更新的靈活度有更高的需求(qiu),而當前技(ji)術中PCIe PF和PCIe VF規模受限(xian)于FPGA資源,擴展難度大,迭代周期長。本文提出將Host的PCIe PF和PCIe VF枚(mei)舉過(guo)程的交互(hu)由SOC來實現,FPGA僅透傳相關的配置包,從而達到可靈活擴展PCIe PF和PCIe VF規模(mo)的目標,同(tong)時FPGA資源可以更有效的專注于(yu)數據(ju)通道(dao)的加速。
  在(zai)該(gai)架(jia)構中,管理軟件(jian)運行在(zai)SoC上(shang),用于實現PCIe PF和PCIe VF的(de)(de)配置。Host通過(guo)PCIe接口檢測(ce)FPGA板卡,FPGA將config tlp包(bao)透傳至SoC,由(you)(you)SoC來實際處理枚舉流程(cheng),FPGA負責Host和SoC之間的(de)(de)包(bao)傳輸(shu)。由(you)(you)于SoC的(de)(de)軟(ruan)件更(geng)新更(geng)靈活,資源比FPGA更(geng)豐富,使得(de)該方案可以更(geng)靈活的(de)(de)擴充PCIe PF和PCIe VF,更(geng)好的(de)(de)應用于當前大(da)數據背景。圖一是系(xi)統架構圖。

圖一 系統架構圖
       該方案的核心在于FPGA透傳通道將Host下發的完整的config tlp包作為payload封裝成一個Memory Write的tlp包寫入SoC內存,SoC解析該tlp包并完成相關處理后,將需要返回Host的tlp包存入另一塊內存空間并通知FPGA,FPGA讀回該tlp包并將其轉為CPL或者CPLD包返回給Host側,這樣就完成了一次Host和SoC之間的數據交互。多次重復直至完成一個完整的枚舉流程,SoC將最終的配置結果下發給FPGA,用于后續數據通道的處理。透傳通道完成一次完整的Host和SoC的數據交互流程如下:
(1)FPGA對Host側rx方向的tlp包進行分流,控制通道的包進入透傳通道;
(2)控制通道分流,并將相關信息進行信用存取;
(3)完整的config tlp包作為payload封裝成一個Memory Write的tlp包寫入SoC內存;
(4)SoC解析該tlp包并完成相關處理后,將需要返回Host的tlp包存入另一塊內存空間并通知FPGA,FPGA讀回該tlp包;
(5)FPGA對FPGA將SoC側讀回的包進行分流;
(6)FPGA將SoC側讀回的包進行信用查詢管理;
(7)FPGA根據信用查詢結果轉為CPL或者CPLD包返回給Host側。
        FPGA透傳通道和SoC依托ring機制實現FPGA和SoC之間的數據交互。對于單個控制通道,由rx 方向的trans block ring和trans cpl ring、tx方向的trans block ring和trans cpl ring組成。其中,tx trans block用于存儲FPGA傳送的Host側完整的tlp包,tx trans cpl用于FPGA寫入當前已寫tx trans block的指針tail和tlp包長度信息,而rx trans block用于存儲SoC處理后需要回傳給Host的tlp包,rx trans cpl用于FPGA寫入當前已讀取rx trans block的指針tail和tlp包長度信息。FPGA寄存器內部維護SoC的指針header和FPGA的指針tail,其中SoC側的指針header由SoC通過寫入寄存器方式更新。具體流程如下:
(1)SoC和FPGA啟動后,SoC進行初始化流程,申請4塊連續內存空間用于trans block ring和trans cpl ring,并將ring的pointer、size、header、tail等信息寫入FPGA寄存器,完成后,FPGA的SIOE rdy信號拉高,代表透傳通道可用;
(2)當透傳通道工作時,FPGA將封裝了config tlp作為payload的Memory write包寫入SoC tx trans block;
(3)FPGA更新FPGA tx tail,并將FPGA tx tail和(2)寫入的包length寫入SoC tx trans cpl;
(4)SoC檢測到tx trans cpl的更新,讀取tx trans block中的tlp包并進行解析處理,處理完成后將需要回傳Host的tlp包寫入rx trans block;
(5)SoC更新SoC tx header和SoC rx header,并將SoC rx header寫入FPGA寄存器;
(6)FPGA檢測到SoC rx header的更新,會對SoC發起一次Memory Read讀rx trans block操作;
(7)FPGA接收SoC返回的rx trans block的tlp包并處理;
(8)FPGA更新FPGA rx tail,并將FPGA rx tail寫入SoC rx trans cpl;
(9)SoC檢測到rx trans cpl的更新,釋放對應的rx trans block。

圖二 FPGA透傳通道和SoC交互流程