FPGA實(shí)現(xiàn) NIC 100G 網(wǎng)卡,GTY+100G Ethernet Subsystem架構(gòu),純verilog代碼實(shí)現(xiàn),提供2套工程源碼和技術(shù)支持
1、前言
網(wǎng)絡(luò)接口控制器(NIC)是計(jì)算機(jī)與網(wǎng)絡(luò)進(jìn)行交互的網(wǎng)關(guān)。NIC構(gòu)成了軟件協(xié)議棧和網(wǎng)絡(luò)之間的橋梁,該橋梁的功能定義了網(wǎng)絡(luò)接口。網(wǎng)絡(luò)接口的功能以及這些功能的實(shí)現(xiàn)都在迅速發(fā)展。這些變化是由提高線速和支持高性能分布式計(jì)算和虛擬化的NIC功能的雙重要求所驅(qū)動(dòng)的。不斷提高的線速導(dǎo)致許多NIC功能必須在硬件而非軟件中實(shí)現(xiàn)。同時(shí),需要新的網(wǎng)絡(luò)功能,例如對多個(gè)隊(duì)列的精確傳輸控制,以實(shí)現(xiàn)高級協(xié)議和網(wǎng)絡(luò)體系結(jié)構(gòu)。
為了以實(shí)際的線速滿足對新的網(wǎng)絡(luò)協(xié)議和體系結(jié)構(gòu)的開放式開發(fā)平臺的需求,我們正在開發(fā)一種基于FPGA的開源高性能NIC原型平臺。本100G網(wǎng)卡平臺能夠以100Gbps的速度運(yùn)行,連同其驅(qū)動(dòng)程序一起,可以在整個(gè)網(wǎng)絡(luò)協(xié)議棧中使用。該設(shè)計(jì)既便攜式又緊湊,支持許多不同的設(shè)備,同時(shí)即使在較小的設(shè)備上也留有足夠的資源用于進(jìn)一步的自定義。本100G網(wǎng)卡的模塊化設(shè)計(jì)和可擴(kuò)展性允許共同優(yōu)化的硬件/軟件解決方案在現(xiàn)實(shí)的環(huán)境中開發(fā)和測試高級網(wǎng)絡(luò)應(yīng)用程序。
基于FPGA的NIC結(jié)合了基于ASIC的NIC和軟件NIC的功能:它們能夠以線速運(yùn)行并提供低延遲和精確定時(shí),同時(shí)新功能的開發(fā)周期相對較短。市面上也有開發(fā)了高性能、基于FPGA的專有NIC;例如,阿里巴巴開發(fā)了一個(gè)完全定制的基于FPGA的RDMA-onlyNIC,他們用它來運(yùn)行精密擁塞控制協(xié)議(HPCC)的硬件實(shí)現(xiàn)。商業(yè)產(chǎn)品也存在,包括Exablaze和Netcope提供的產(chǎn)品。不幸的是,類似于基于ASIC的NIC,可商用的基于FPGA的NIC往往具有無法修改的基本“黑匣子”功能?;綨IC功能的封閉性嚴(yán)重限制了它們在開發(fā)新的網(wǎng)絡(luò)應(yīng)用程序時(shí)的效用和靈活性。
商業(yè)上可用的高性能DMA組件,例如Xilinx XDMA內(nèi)核和QDMA內(nèi)核,以及Atomic Rules ArkvilleDPDK加速內(nèi)核都沒有提供完全可配置的硬件來控制傳輸數(shù)據(jù)流。Xilinx XDMA內(nèi)核是為計(jì)算卸載應(yīng)用程序而設(shè)計(jì)的,因此提供了非常有限的排隊(duì)功能,并且沒有簡單的方法來控制傳輸調(diào)度。Xilinx QDMA內(nèi)核和Atomic Rules ArkvilleDPDK加速內(nèi)核通過支持少量隊(duì)列并提供DPDK驅(qū)動(dòng)程序而面向網(wǎng)絡(luò)應(yīng)用程序;但是支持的隊(duì)列數(shù)量很少(XDMA內(nèi)核為2K隊(duì)列,而Arkville內(nèi)核為128個(gè)隊(duì)列)而且兩個(gè)內(nèi)核都不提供用于精確控制數(shù)據(jù)包傳輸?shù)暮唵畏椒?。基于FPGA的分組處理解決方案包括實(shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用程序卸載的Catapult和實(shí)現(xiàn)FPGA上可重構(gòu)匹配引擎的FlowBlaze。但是,這些平臺將標(biāo)準(zhǔn)的NIC功能留給了單獨(dú)的基于ASIC的NIC,并且完全作為“線下突擊”進(jìn)行操作,沒有提供對NIC調(diào)度程序或隊(duì)列的明確控制。其他項(xiàng)目使用軟件實(shí)現(xiàn)或部分硬件實(shí)現(xiàn)。Shoal描述了一種網(wǎng)絡(luò)架構(gòu),該網(wǎng)絡(luò)架構(gòu)使用自定義NIC和快速的第1層電交叉點(diǎn)交換機(jī)執(zhí)行小規(guī)模路由。Shoal是用硬件構(gòu)建的,但僅在沒有主機(jī)連接的情況下通過綜合流量進(jìn)行評估。SENIC描述了基于NIC的可擴(kuò)展速率限制。單獨(dú)評估了調(diào)度程序的硬件實(shí)現(xiàn),但是系統(tǒng)級評估是在具有自定義排隊(duì)規(guī)則(qdisc)模塊的軟件中進(jìn)行的。PIEO描述了一種靈活的NIC調(diào)度程序,它是在硬件中單獨(dú)進(jìn)行評估的。NDP是用于數(shù)據(jù)中心應(yīng)用程序的拉模式傳輸協(xié)議。NDP已通過DPDK軟件NIC和基于FPGA的交換機(jī)進(jìn)行了評估。Loom描述了一種有效的NIC設(shè)計(jì),可以使用BESS在軟件中對其進(jìn)行評估。
本100G網(wǎng)卡的開發(fā)與所有這些項(xiàng)目都不同,因?yàn)樗峭耆梢钥吹絭erilog源碼的vivado工程,可以作為實(shí)際NIC網(wǎng)卡,也可以作為開發(fā)NIC網(wǎng)卡芯片的驗(yàn)證。它提供了多個(gè)傳輸隊(duì)列,并帶有可擴(kuò)展的傳輸調(diào)度程序,以實(shí)現(xiàn)對流的細(xì)粒度控制。最后我們建立了一個(gè)強(qiáng)大而靈活的開源平臺,用于開發(fā)結(jié)合了硬件和軟件功能的網(wǎng)絡(luò)應(yīng)用程序。
本設(shè)計(jì)是一個(gè)100G速率的NIC網(wǎng)卡,其架構(gòu)如下:
基于目前市面上主流的FPGA平臺,本博目前移植了2套2022.2版本的vivado工程源碼,具體如下:
本設(shè)計(jì)經(jīng)過反復(fù)大量測試穩(wěn)定可靠,可在項(xiàng)目中直接移植使用,工程代碼可綜合編譯上板調(diào)試,可直接項(xiàng)目移植,適用于在校學(xué)生、研究生項(xiàng)目開發(fā),也適用于在職工程師做項(xiàng)目開發(fā),可應(yīng)用于醫(yī)療、軍工等行業(yè)的數(shù)字通信領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請耐心看到最后;
更新說明
這是第二版,相比之前的版本做了如下優(yōu)化;
1:時(shí)序優(yōu)化,做了細(xì)致的時(shí)序約束,所有工程編譯后都沒有時(shí)序違約,如果存在時(shí)序違約,很影響性能;
2:代碼優(yōu)化,補(bǔ)齊了代碼中基于generate生成的某些沒有被當(dāng)前工程使用的模塊,可讀性更強(qiáng);
3:增加Linux驅(qū)動(dòng),新增了Linux驅(qū)動(dòng)源碼和測試源碼,實(shí)用性更強(qiáng);
4:工程優(yōu)化,新增移植了兩套2022.2版本的工程源碼,使得工程達(dá)到了2套,選擇性更多;
免責(zé)聲明
本工程及其源碼即有自己寫的一部分,也有網(wǎng)絡(luò)公開渠道獲取的一部分(包括CSDN、Xilinx官網(wǎng)、Altera官網(wǎng)等等),若大佬們覺得有所冒犯,請私信批評教育;基于此,本工程及其源碼僅限于讀者或粉絲個(gè)人學(xué)習(xí)和研究,禁止用于商業(yè)用途,若由于讀者或粉絲自身原因用于商業(yè)用途所導(dǎo)致的法律問題,與本博客及博主無關(guān),請謹(jǐn)慎使用。。。
2、相關(guān)方案推薦
我這里已有的以太網(wǎng)方案
目前我這里有大量UDP協(xié)議的工程源碼,包括UDP數(shù)據(jù)回環(huán),視頻傳輸,AD采集傳輸?shù)?,也有TCP協(xié)議的工程,對網(wǎng)絡(luò)通信有需求的兄弟可以去看看:直接點(diǎn)擊前往
本方案的 10G-NIC網(wǎng)卡項(xiàng)目
本方案適用于10G-NIC、25G-NIC、100G-NIC項(xiàng)目,本博文是講述100G-NIC的應(yīng)用,想要了解10G-NIC的應(yīng)用,請移步我之前寫的博文,參考連接如下:點(diǎn)擊直接前往
本方案的 25G-NIC網(wǎng)卡項(xiàng)目
本方案適用于10G-NIC、25G-NIC、100G-NIC項(xiàng)目,本博文是講述100G-NIC的應(yīng)用,想要了解25G-NIC的應(yīng)用,請移步我之前寫的博文,參考連接如下:點(diǎn)擊直接前往
3、100G-NIC 網(wǎng)卡基本性能簡介
本100G網(wǎng)卡是一個(gè)基于Xilinx高端系列FPGA為平臺的,用于高達(dá)100Gbps及更高的網(wǎng)絡(luò)接口的開發(fā)平臺;平臺包括一些用于實(shí)現(xiàn)實(shí)時(shí),高線速操作的核心功能,包括:高性能數(shù)據(jù)路徑,10G/ 25G / 100G以太網(wǎng)MAC,Xilinx 系列FPGA集成的第3代PCIE Express,自定義PCIe DMA引擎以及本機(jī)高精確的 IEEE 1588 PTP時(shí)間戳;本設(shè)計(jì)的一個(gè)關(guān)鍵功能是可擴(kuò)展隊(duì)列管理,它可以支持超過10,000個(gè)隊(duì)列以及可擴(kuò)展的傳輸調(diào)度程序,從而可以對包傳輸進(jìn)行細(xì)粒度的硬件控制;結(jié)合多個(gè)網(wǎng)絡(luò)接口,每個(gè)接口多個(gè)端口以及每個(gè)端口事件驅(qū)動(dòng)的傳輸調(diào)度,這些功能可實(shí)現(xiàn)高級網(wǎng)絡(luò)接口體系結(jié)構(gòu)和協(xié)議的開發(fā);這些硬件功能的軟件接口是Linux網(wǎng)絡(luò)協(xié)議棧的高性能驅(qū)動(dòng)程序。本平臺還支持分散/聚集DMA,校驗(yàn)和卸載,接收流散列和接收端縮放。通過實(shí)現(xiàn)微秒級時(shí)分多址(TDMA)硬件調(diào)度程序,以25Gbps的線速執(zhí)行TDMA調(diào)度,而沒有CPU開銷,證明了該平臺的強(qiáng)大功能和靈活性。
本100G網(wǎng)卡具有幾種獨(dú)特的體系結(jié)構(gòu)特點(diǎn)。首先,將硬件隊(duì)列狀態(tài)有效地存儲在FPGA的BRAM或者Ultra RAM中,從而支持?jǐn)?shù)千個(gè)可單獨(dú)控制的隊(duì)列;這些隊(duì)列與接口相關(guān)聯(lián),每個(gè)接口可以具有多個(gè)端口,每個(gè)端口都有自己的獨(dú)立傳輸調(diào)度程序;這樣就可以對數(shù)據(jù)包傳輸進(jìn)行極其精細(xì)的控制;調(diào)度器模塊的設(shè)計(jì)是為了修改或交換,完全可以實(shí)現(xiàn)不同的傳輸調(diào)度方案,包括實(shí)驗(yàn)調(diào)度器,再加上PTP時(shí)間同步,這樣可以實(shí)現(xiàn)基于時(shí)間的調(diào)度,包括高精度的TDMA;
本100G網(wǎng)卡的設(shè)計(jì)是模塊化且高度參數(shù)化的,可以在綜合時(shí)通過Verilog參數(shù)設(shè)置許多配置和結(jié)構(gòu)選項(xiàng),包括接口和端口計(jì)數(shù),隊(duì)列計(jì)數(shù),內(nèi)存大小,調(diào)度程序類型等;這些設(shè)計(jì)參數(shù)公開在驅(qū)動(dòng)程序讀取以確定NIC配置的配置寄存器中,使同一驅(qū)動(dòng)程序無需修改即可支持許多不同的板卡和配置。
4、詳細(xì)設(shè)計(jì)方案
設(shè)計(jì)框圖
FPGA 100G-NIC 系統(tǒng)設(shè)計(jì)框圖如下:
其中具體到NIC部分詳細(xì)設(shè)計(jì)框圖如下:
架構(gòu)說明
從較高的層次來看,NIC由3個(gè)主要的嵌套模塊組成。頂層模塊主要包含支持和接口組件。這些組件包括PCI Express硬IP內(nèi)核和DMA接口,PTP硬件時(shí)鐘以及包括MAC,PHY和相關(guān)串行器的以太網(wǎng)接口組件。頂層模塊還包括一個(gè)或多個(gè)接口模塊實(shí)例。每個(gè)接口模塊都對應(yīng)于操作系統(tǒng)級別的網(wǎng)絡(luò)接口(例如eth0)。每個(gè)接口模塊都包含隊(duì)列管理邏輯以及描述符和完成處理邏輯。隊(duì)列管理邏輯維護(hù)所有NIC隊(duì)列的隊(duì)列狀態(tài):包括傳輸、傳輸完成、接收、接收完成和事件隊(duì)列。每個(gè)接口模塊還包含一個(gè)或多個(gè)端口模塊實(shí)例。每個(gè)端口模塊都提供一個(gè)到MAC的AXI流接口,并包含一個(gè)傳輸調(diào)度程序、傳輸和接收引擎、傳輸和接收數(shù)據(jù)路徑以及一個(gè)暫存RAM,用于在DMA操作期間臨時(shí)存儲傳入和傳出的數(shù)據(jù)包。對于每個(gè)端口,端口模塊中的傳輸調(diào)度程序決定將哪些隊(duì)列指定用于傳輸;傳輸調(diào)度程序?yàn)榘l(fā)送引擎生成命令,這些命令協(xié)調(diào)傳輸數(shù)據(jù)路徑上的操作。調(diào)度程序模塊是一個(gè)靈活的功能塊,可以對其進(jìn)行修改或替換,以支持任意調(diào)度,這些調(diào)度可以是事件驅(qū)動(dòng)的,調(diào)度程序的默認(rèn)實(shí)現(xiàn)是簡單循環(huán),與同一接口模塊關(guān)聯(lián)的所有端口共享同一組傳輸隊(duì)列,并顯示為操作系統(tǒng)的單個(gè)統(tǒng)一接口。通過僅更改傳輸調(diào)度程序設(shè)置,而不會(huì)影響網(wǎng)絡(luò)協(xié)議棧的其余部分,這可以使流在端口之間遷移或在多個(gè)端口之間實(shí)現(xiàn)負(fù)載平衡;這種動(dòng)態(tài)的、調(diào)度程序定義的隊(duì)列到端口的映射是本25G/100G網(wǎng)卡的獨(dú)特功能,可以使人們能夠研究新的協(xié)議和網(wǎng)絡(luò)體系結(jié)構(gòu),包括并行網(wǎng)絡(luò)(例如P-FatTree和光交換網(wǎng)絡(luò)、RotorNet)和Opera。
接口概述
現(xiàn)在對框圖中的模塊解釋如下:
PCIe HIP:
調(diào)用的Xilinx集成在FPGA內(nèi)部的PCIE資源,該資源已經(jīng)固化在FPGA芯片內(nèi)部,非XDMA這種由LUT和BRAM等資源搭建,這種資源具有速度更高、性能更強(qiáng)、不占用現(xiàn)有邏輯資源等諸多優(yōu)點(diǎn),但也有缺點(diǎn),那就是不帶DMA,需要自己寫DMA與之對接,根據(jù)FPGA型號不同,在UltraScale系列FPGA中是UltraScale FPGA Gen3 Integrated Block for PCI Express;在UltraScale+系列FPGA中是UltraScale+ Integrated Block (PCIE4) Express;在Virtix-7系列FPGA中是Virtix-7 FPGA Gen3 Integrated Block for PCI Express;可根據(jù)自己的FPGA型號確定;
AXIL M:
AXI lite Master接口;主要對接PCIE內(nèi)核、軟件或者SDK的AXI lite Slaver接口,用作三者對網(wǎng)卡的管理、配置、狀態(tài)讀取等;
DMA IF:
DMA接口;由于PCIE內(nèi)核是集成的,不帶DMA,也沒有官方推薦的DMA方案,所以這個(gè)接口就是自寫的DMA與PCIE內(nèi)核的接口;
PTP HC:
純verilog實(shí)現(xiàn)的PTP硬件時(shí)鐘;
TXQ:傳輸隊(duì)列管理器;
TXCQ:傳輸完成隊(duì)列管理器;
RXQ:接收隊(duì)列管理器;
RXCQ:接收完成隊(duì)列管理器;
EQ:事件隊(duì)列管理器;
MAC + PHY:
以太網(wǎng)媒體訪問控制器(MAC)和物理接口層(PHY),即調(diào)用Xilinx GT高速接口資源+手寫的 MAC接口;
以上接口概述只是簡略說明,具體數(shù)據(jù)流向會(huì)在后面的“數(shù)據(jù)路徑以及發(fā)送和接收引擎”章節(jié)中介紹;
傳輸說明
在接收方向,傳入的數(shù)據(jù)包通過流哈希模塊確定目標(biāo)接收隊(duì)列,并為接收引擎生成命令,這些命令協(xié)調(diào)對接收數(shù)據(jù)路徑的操作。由于同一接口模塊中的所有端口共享同一組接收隊(duì)列,因此不同端口上的傳入流將合并到同一組隊(duì)列中。還可以向NIC添加自定義模塊,以在傳入數(shù)據(jù)包通過PCIe總線之前對其進(jìn)行預(yù)處理和過濾。NIC上的組件與多個(gè)不同的接口互連,包括AXI lite,AXI流和用于DMA操作的自定義分段存儲器接口,這將在后面討論。AXI lite用于從驅(qū)動(dòng)程序到NIC的控制路徑。它用于初始化和配置NIC組件,并在發(fā)送和接收操作期間控制隊(duì)列指針。AXI stream接口用于在NIC內(nèi)傳輸打包數(shù)據(jù),包括PCIe傳輸層數(shù)據(jù)包(TLP)和以太網(wǎng)幀。分段存儲器接口用于將PCIe DMA接口連接到NIC數(shù)據(jù)路徑以及描述符和完成處理邏輯。大部分NIC邏輯都運(yùn)行在PCIe用戶時(shí)鐘域中,對于所有當(dāng)前的設(shè)計(jì)變體,名義上為250 MHz。異步FIFO用于與MAC接口,這些MAC在串行器中運(yùn)行,以適當(dāng)?shù)匕l(fā)送和接收時(shí)鐘域-10G為156.25 MHz,25G為390.625 MHz,100G為322.266 MHz。以下各節(jié)描述了NIC中的幾個(gè)關(guān)鍵功能塊。
PCIe 內(nèi)核
NIC網(wǎng)卡與主機(jī)交互的部分為PCIe,調(diào)用的Xilinx集成在FPGA內(nèi)部的PCIE資源,該資源已經(jīng)固化在FPGA芯片內(nèi)部,非XDMA這種由LUT和BRAM等資源搭建,這種資源具有速度更高、性能更強(qiáng)、不占用現(xiàn)有邏輯資源等諸多優(yōu)點(diǎn),但也有缺點(diǎn),那就是不帶DMA,需要自己寫DMA與之對接,根據(jù)FPGA型號不同,在UltraScale系列FPGA中是UltraScale FPGA Gen3 Integrated Block for PCI Express;在UltraScale+系列FPGA中是UltraScale+ Integrated Block (PCIE4) Express;在Virtix-7系列FPGA中是Virtix-7 FPGA Gen3 Integrated Block for PCI Express;可根據(jù)自己的FPGA型號確定;以工程1為例,IP在代碼中的位置和配置如下:
我的FPGA板卡性能很高,所以直接使用PCIE3.0 X8模式,速率直接干到單Line 8G;
高性能 DMA
由于PCIE內(nèi)核是集成的,不帶DMA,也沒有官方推薦的DMA方案,所以這個(gè)接口就是自寫的DMA與PCIE內(nèi)核的接口;純verilog編寫的DMA控制器實(shí)現(xiàn)PCIE數(shù)據(jù)的搬運(yùn)工作;以工程1為例,該模塊在代碼中的位置如下:
AXI總線接口
AXIL M:AXI lite master;即AXI-Lite總線主機(jī),因?yàn)镻CIE IP有AXI-Lite配置接口,這里屬于掛載總線的需求,主要對接PCIE內(nèi)核、軟件或者SDK的AXI lite Slaver接口,用作三者對網(wǎng)卡的管理、配置、狀態(tài)讀取等;;
AXI M:AXI master;即AXI-FULL總線主機(jī),因?yàn)镻CIE IP有AXI用戶接口,這里屬于掛載總線的需求;
以工程1為例,該模塊在代碼中的位置如下:
PTP硬件時(shí)鐘
純verilog實(shí)現(xiàn)的PTP硬件時(shí)鐘;PTP(Precision Time Protocol) 是一個(gè)通過網(wǎng)絡(luò)同步時(shí)鐘的一個(gè)協(xié)議。當(dāng)硬件支持時(shí),PTP 精度能達(dá)到亞微秒,比 NTP(Network Time Protocol)精度更高;本設(shè)計(jì)顯然是支持的;以工程1為例,代碼位置如下:
流水線隊(duì)列管理
本100G網(wǎng)卡NIC和驅(qū)動(dòng)程序之間的數(shù)據(jù)包數(shù)據(jù)通信通過描述符和完成隊(duì)列進(jìn)行調(diào)解。描述符隊(duì)列形成主機(jī)到NIC的通信通道,承載有關(guān)各個(gè)數(shù)據(jù)包在系統(tǒng)內(nèi)存中存儲位置的信息。完成隊(duì)列構(gòu)成了NIC到主機(jī)的通信通道,其中包含有關(guān)已完成的操作和關(guān)聯(lián)的元數(shù)據(jù)的信息。描述符和完成隊(duì)列被實(shí)現(xiàn)為駐留在DMA可訪問的系統(tǒng)內(nèi)存中的環(huán)形緩沖區(qū),而NIC硬件則維護(hù)必要的隊(duì)列狀態(tài)信息。此狀態(tài)信息包括指向環(huán)形緩沖區(qū)DMA地址的指針,環(huán)形緩沖區(qū)的大小,生產(chǎn)者和使用者指針以及對關(guān)聯(lián)的完成隊(duì)列的引用。每個(gè)隊(duì)列所需的描述符狀態(tài)適合128位。
本100G網(wǎng)卡NIC的隊(duì)列管理邏輯必須能夠有效地存儲和管理數(shù)千個(gè)隊(duì)列的狀態(tài)。這意味著隊(duì)列狀態(tài)必須完全存儲在FPGA的Block RAM(BRAM)或Ultra RAM(URAM)中。由于需要128位RAM,并且URAM塊為72x4096,因此存儲4096個(gè)隊(duì)列的狀態(tài)僅需要2個(gè)URAM實(shí)例。利用 URAM 實(shí)例可以將隊(duì)列管理邏輯擴(kuò)展到每個(gè)接口至少處理 32768 個(gè)隊(duì)列。
為了支持高吞吐量,本100G網(wǎng)卡NIC必須能夠并行處理多個(gè)描述符。因此,隊(duì)列管理邏輯必須跟蹤多個(gè)正在進(jìn)行的操作,并在操作完成時(shí)向驅(qū)動(dòng)程序報(bào)告更新的隊(duì)列指針。跟蹤進(jìn)程中操作所需的狀態(tài)比描述符狀態(tài)小得多,因此可以將其存儲在觸發(fā)器和分布式RAM中。
本100G網(wǎng)卡NIC設(shè)計(jì)使用兩個(gè)隊(duì)列管理器模塊:queue_manager用于管理主機(jī)到NIC的描述符隊(duì)列,而cpl_queue_manager用于管理NIC到主機(jī)的完成隊(duì)列。除了指針處理,填充處理和門鈴/事件生成方面的一些細(xì)微差別外,這些模塊相似。由于相似之處,本節(jié)將僅討論queue_manager模塊的操作。
用于存儲隊(duì)列狀態(tài)信息的BRAM或URAM陣列對于每個(gè)讀取操作都需要幾個(gè)延遲周期,因此queue_manager是使用流水線結(jié)構(gòu)構(gòu)建的,以促進(jìn)多個(gè)并發(fā)操作。流水線支持四種不同的操作:寄存器讀取,寄存器寫入,出隊(duì)/入隊(duì)請求和出隊(duì)/入隊(duì)提交。通過AXI lite接口進(jìn)行的寄存器訪問操作使驅(qū)動(dòng)程序可以初始化隊(duì)列狀態(tài),并提供指向已分配的主機(jī)內(nèi)存的指針,以及在正常操作期間訪問生產(chǎn)者和使用者指針。以工程1為例,queue_manager模塊和cpl_queue_manager模塊在代碼中的位置如下:
實(shí)際上,NIC中為了提高數(shù)據(jù)帶寬利用率,幾乎所有的模塊都采用了流水線處理方式來促進(jìn)高并發(fā)。本節(jié)以隊(duì)列管理模塊來介紹基于操作表和操作指針的流水線設(shè)計(jì)思路。
本100G網(wǎng)卡NIC的隊(duì)列管理邏輯必須能夠有效地存儲和管理數(shù)千個(gè)隊(duì)列的狀態(tài)。為了支持高吞吐量,NIC必須能夠并行處理多個(gè)描述符。因此,隊(duì)列管理邏輯必須跟蹤多個(gè)正在進(jìn)行的操作,并在操作完成時(shí)向驅(qū)動(dòng)程序報(bào)告更新的隊(duì)列指針。NIC的操作表項(xiàng)包含激活和提交標(biāo)志、所屬隊(duì)列號、和影子指針,操作指針包括操作表開始指針和操作表提交指針,通過不同的指針對操作表不同字段的索引就可以跟蹤當(dāng)前進(jìn)行中的不同操作項(xiàng)目進(jìn)展到哪一個(gè)步驟,從而可以觸發(fā)流水操作。更詳細(xì)的來說,當(dāng)隊(duì)列管理接收到出隊(duì)請求時(shí)將命令放置到Pipeline同時(shí)觸發(fā)隊(duì)列消息,當(dāng)命令到達(dá)處理周期時(shí),對應(yīng)隊(duì)列的信息已經(jīng)被索引到,此時(shí)可以進(jìn)行處理,如果出隊(duì)被允許,必要的信息會(huì)被記錄到操作表,處理邏輯只需要不斷寫入操作表并更新操作指針,可以認(rèn)為出隊(duì)邏輯在處理操作表的表頭,操作被提交時(shí)會(huì)觸發(fā)提交邏輯,提交邏輯處理操作表末并合理的釋放操作表。需要注意的是,操作表只跟蹤正在進(jìn)行中的處理進(jìn)程,因此不需要設(shè)置太大。它和隊(duì)列管理的信息RAM構(gòu)成了一個(gè)雙向鏈表,即隊(duì)列信息中需要存入為該隊(duì)列服務(wù)的最新的操作表項(xiàng)索引,用于維護(hù)正確的影子指針。其原理框圖如下:
發(fā)送調(diào)度程序
本100G網(wǎng)卡NIC中使用的默認(rèn)傳輸調(diào)度程序是在tx_scheduler_rr模塊中實(shí)現(xiàn)的簡單循環(huán)調(diào)度程序。調(diào)度器向發(fā)送引擎發(fā)送命令,從NIC傳輸隊(duì)列中啟動(dòng)傳輸操作。循環(huán)調(diào)度器包含所有隊(duì)列的基本隊(duì)列狀態(tài),一個(gè)FIFO用于存儲當(dāng)前活動(dòng)隊(duì)列并執(zhí)行循環(huán)調(diào)度,一個(gè)操作表用于跟蹤進(jìn)程中的傳輸操作。與隊(duì)列管理邏輯類似,循環(huán)傳輸調(diào)度程序還將隊(duì)列狀態(tài)信息存儲在FPGA上的BRAM或URAM中,以便可以擴(kuò)展以支持大量隊(duì)列。傳輸調(diào)度程序還使用處理流水線來隱藏內(nèi)存訪問延遲。以工程1為例,tx_scheduler_rr模塊在代碼中的位置如下:
傳輸調(diào)度器模塊具有四個(gè)主要接口:AXI lite寄存器接口和三個(gè)stream接口。AXI lite接口允許驅(qū)動(dòng)程序更改調(diào)度程序參數(shù)并啟用/禁用隊(duì)列。當(dāng)驅(qū)動(dòng)程序?qū)?shù)據(jù)包排隊(duì)發(fā)送時(shí),第一個(gè)流接口從隊(duì)列管理邏輯提供門鈴事件。第二個(gè)流接口將由調(diào)度器生成的傳輸命令攜帶到發(fā)送引擎。每個(gè)命令都包含要發(fā)送的隊(duì)列索引以及用于跟蹤進(jìn)程中操作的標(biāo)簽。最終的流接口將傳輸操作狀態(tài)信息返回給調(diào)度程序。狀態(tài)信息會(huì)通知調(diào)度程序已傳輸數(shù)據(jù)包的長度,或者是否由于隊(duì)列為空或禁用而導(dǎo)致傳輸操作失敗。
傳輸調(diào)度程序模塊可以擴(kuò)展或替換以實(shí)現(xiàn)任意調(diào)度算法。這使本25G/100G網(wǎng)卡可用作評估實(shí)驗(yàn)調(diào)度算法的平臺,包括SENIC、Carousel、PIEO和Loom中提出的算法。還可能向發(fā)射調(diào)度器模塊提供其他輸入,包括來自接收路徑的反饋,這些輸入可用于實(shí)現(xiàn)新協(xié)議和擁塞控制技術(shù),例如NDP和HPCC。將調(diào)度程序連接到PTP硬件時(shí)鐘可用于支持TDMA,TDMA可用于實(shí)現(xiàn)RotorNet 、Opera和其他電路交換體系結(jié)構(gòu)。
端口和接口
本100G網(wǎng)卡的獨(dú)特體系結(jié)構(gòu)特征是端口和網(wǎng)絡(luò)接口之間的分隔,因此多個(gè)端口可以與同一接口關(guān)聯(lián)。當(dāng)前的大多數(shù)NIC每個(gè)接口支持一個(gè)端口,如下圖a所示:
當(dāng)網(wǎng)絡(luò)協(xié)議棧將數(shù)據(jù)包排隊(duì)以便在網(wǎng)絡(luò)接口上傳輸時(shí),數(shù)據(jù)包將通過與該接口關(guān)聯(lián)的網(wǎng)絡(luò)端口注入網(wǎng)絡(luò)。但是,在本設(shè)計(jì)中,每個(gè)接口都可以關(guān)聯(lián)多個(gè)端口,因此可以在出隊(duì)時(shí)由硬件決定將數(shù)據(jù)包注入到網(wǎng)絡(luò)中的哪個(gè)端口,如上圖b所示。
與同一網(wǎng)絡(luò)接口模塊關(guān)聯(lián)的所有端口共享同一組傳輸隊(duì)列,并顯示為操作系統(tǒng)的單個(gè)統(tǒng)一接口。這樣,通過僅更改傳輸調(diào)度程序設(shè)置,就可以在端口之間遷移流或在多個(gè)端口之間實(shí)現(xiàn)負(fù)載平衡,而不會(huì)影響其余的網(wǎng)絡(luò)協(xié)議棧。動(dòng)態(tài)的,由調(diào)度程序定義的隊(duì)列到端口的映射使人們能夠研究新的協(xié)議和網(wǎng)絡(luò)體系結(jié)構(gòu),包括諸如P-FatTree的并行網(wǎng)絡(luò)以及諸如RotorNet和Opera的光交換網(wǎng)絡(luò)。
數(shù)據(jù)路徑以及發(fā)送和接收引擎
本100G網(wǎng)卡在數(shù)據(jù)路徑中同時(shí)使用了內(nèi)存映射接口和流接口。AXI stream用于在端口DMA模塊,以太網(wǎng)MAC,校驗(yàn)和與哈希計(jì)算模塊之間傳輸以太網(wǎng)數(shù)據(jù)包數(shù)據(jù)。AXI stream還用于將PCIe硬IP內(nèi)核連接到PCIe AXI lite主模塊和PCIe DMA接口模塊。定制的分段存儲器接口用于將PCIe DMA接口模塊,端口DMA模塊以及描述符和完成處理邏輯連接到內(nèi)部暫存器RAM。
AXI stream接口的寬度由所需帶寬確定。除以太網(wǎng)MAC外,核心數(shù)據(jù)路徑邏輯完全在250 MHz PCIe用戶時(shí)鐘域中運(yùn)行。因此,到PCIe硬IP內(nèi)核的AXI流接口必須與硬核接口寬度匹配-PCIe Gen 3 x8為256位,PCIe Gen 3 x16為512位。在以太網(wǎng)端,接口寬度與MAC接口寬度匹配,除非250 MHz時(shí)鐘太慢而無法提供足夠的帶寬。對于10G以太網(wǎng),MAC接口是156.25 MHz的64位,可以以相同的寬度連接到250 MHz的時(shí)鐘域。對于25G以太網(wǎng),MAC接口在390.625 MHz時(shí)為64位,因此必須轉(zhuǎn)換為128位才能在250 MHz時(shí)提供足夠的帶寬。對于100G以太網(wǎng),本25G/100G網(wǎng)卡在Ultrascale Plus FPGA上使用Xilinx 100G硬CMAC內(nèi)核。MAC接口在322.266 MHz時(shí)為512位,它以512位在250 MHz時(shí)鐘域上連接,因?yàn)樗枰源蠹s195 MHz的頻率運(yùn)行才能提供100Gbps。
本100G網(wǎng)卡NIC數(shù)據(jù)路徑的框圖如下圖所示:
它是前面的第4章節(jié)詳細(xì)設(shè)計(jì)方案圖的簡化版本。PCIe硬IP內(nèi)核(PCIe HIP)將NIC連接到主機(jī)。兩個(gè)AXI stream接口將PCIe DMA接口模塊連接到PCIe硬IP內(nèi)核。一個(gè)接口用于讀寫請求,一個(gè)接口用于讀取數(shù)據(jù)。然后,PCIe DMA接口模塊通過一組DMA接口多路復(fù)用器連接到描述符獲取模塊,完成寫入模塊,端口暫存RAM模塊以及RX和TX引擎。在朝向DMA接口的方向上,多路復(fù)用器組合了來自多個(gè)源的DMA傳輸命令。在相反的方向上,它們路由傳輸狀態(tài)響應(yīng)。它們還管理分段存儲器接口以進(jìn)行讀取和寫入。頂層多路復(fù)用器將描述符流量與分組數(shù)據(jù)流量結(jié)合在一起,為描述符流量提供更高的優(yōu)先級。接下來,一對多路復(fù)用器組合來自多個(gè)接口模塊的流量。最后,每個(gè)接口模塊內(nèi)的一個(gè)附加多路復(fù)用器將來自多個(gè)端口實(shí)例的分組數(shù)據(jù)流量組合在一起。
發(fā)送引擎和接收引擎負(fù)責(zé)協(xié)調(diào)傳輸和接收數(shù)據(jù)包所需的操作。發(fā)送和接收引擎可以處理多個(gè)正在進(jìn)行的數(shù)據(jù)包,以實(shí)現(xiàn)高吞吐量。如第4章節(jié)詳細(xì)設(shè)計(jì)方案圖所示,發(fā)送和接收引擎連接到發(fā)送和接收數(shù)據(jù)路徑中的幾個(gè)模塊,包括端口DMA模塊以及哈希和校驗(yàn)和卸載模塊,以及描述符和完成處理邏輯以及時(shí)間戳接口模塊、以太網(wǎng)MAC模塊。
發(fā)送引擎負(fù)責(zé)協(xié)調(diào)數(shù)據(jù)包的傳輸操作。發(fā)送引擎處理來自傳輸調(diào)度程序的特定隊(duì)列的傳輸請求。使用PCIe DMA引擎進(jìn)行低級處理后,數(shù)據(jù)包將通過傳輸校驗(yàn)和模塊,MAC和PHY。一旦發(fā)送了數(shù)據(jù)包,發(fā)送引擎將從MAC接收PTP時(shí)間戳,建立完成記錄,并將其傳遞給完成寫入模塊。
與發(fā)送引擎類似,接收引擎負(fù)責(zé)協(xié)調(diào)數(shù)據(jù)包的接收操作。傳入的數(shù)據(jù)包通過PHY和MAC。在包括哈希和時(shí)間戳的底層處理之后,接收引擎將向PCIe DMA引擎發(fā)出一個(gè)或多個(gè)寫請求,以將數(shù)據(jù)包數(shù)據(jù)寫出到主機(jī)內(nèi)存中。寫操作完成后,接收引擎將構(gòu)建一個(gè)完成記錄,并將其傳遞給完成寫模塊。
描述符讀取和完成寫入模塊的操作類似于發(fā)送和接收引擎。這些模塊處理來自發(fā)送和接收引擎的描述符/完成讀/寫請求,向隊(duì)列管理器發(fā)出入隊(duì)/出隊(duì)請求,以獲取主機(jī)內(nèi)存中的隊(duì)列元素地址,然后向PCIe DMA接口發(fā)出請求以傳輸數(shù)據(jù)。完成寫入模塊還負(fù)責(zé)通過將發(fā)送和接收完成隊(duì)列排隊(duì)在適當(dāng)?shù)氖录?duì)列中并寫出事件記錄來處理事件。
分段內(nèi)存接口
對于PCIe上的高性能DMA,本設(shè)計(jì)使用自定義分段存儲器接口。該接口被分成最大128位的段,并且整體寬度是PCIe硬IP內(nèi)核的AXI流接口寬度的兩倍。例如,將PCIe Gen 3 x16與PCIe硬核中的512位AXI流接口一起使用的設(shè)計(jì)將使用1024位分段接口,該接口分成8個(gè)段,每個(gè)段128位。與使用單個(gè)AXI接口相比,該接口提供了改進(jìn)的“阻抗匹配”,從而消除了DMA引擎中的對齊和互連邏輯中的仲裁,從而消除了背壓,從而提高了PCIe鏈路利用率。具體地說,該接口保證DMA接口可以在每個(gè)時(shí)鐘周期執(zhí)行全寬度,未對齊的讀取或?qū)懭搿4送?,使用簡單的雙端口RAM(專用于在單個(gè)方向上移動(dòng)的流量)消除了讀寫路徑之間的爭用。
除了使用三個(gè)接口(而不是五個(gè))之外,每個(gè)網(wǎng)段的運(yùn)行方式均與AXI lite類似。一個(gè)通道提供寫地址和數(shù)據(jù),一個(gè)通道提供讀地址,一個(gè)通道提供讀數(shù)據(jù)。與AXI不同,不支持突發(fā)和重新排序,從而簡化了接口邏輯。互連組件(多路復(fù)用器)負(fù)責(zé)維護(hù)操作的順序,即使在訪問多個(gè)RAM時(shí)也是如此。這些段通過單獨(dú)的流控制連接和互連排序邏輯的單獨(dú)實(shí)例彼此完全獨(dú)立地運(yùn)行。另外,操作是基于單獨(dú)的選擇信號而不是通過地址解碼進(jìn)行路由的。此功能消除了分配地址的需要,并允許使用可參數(shù)化的互連組件,這些組件以最少的配置適當(dāng)?shù)芈酚刹僮鳌?/p>
字節(jié)地址被映射到分段的接口地址上,最低的地址位確定段中的字節(jié)通道,接下來的位選擇段,最高的位確定該段的字地址。例如,在一個(gè)1024位分段接口中,分成8個(gè)128位段,最低的4個(gè)地址位將確定段中的字節(jié)通道,接下來的3位將確定該段。其余位確定該段的地址總線。
100G-PHY 層
本設(shè)計(jì)使用的是QSFP,一個(gè)QSFP包含4路Line,每條Line可跑25G,4條Line線速率共計(jì)100G;PHY層就是有4路GTY組成,每路GTY配置為GTY-CAUI_4*協(xié)議,編解碼類型設(shè)置為Raw;內(nèi)部數(shù)據(jù)位寬為80bit,以工程1為例,PHY層代碼位置如下:這里命名為100G-PHY 層是因?yàn)?路25G的GTY共計(jì)100G;
GTY 配置分別如下:
100G-MAC 層
當(dāng)4 Line線速率共計(jì)100G時(shí),數(shù)據(jù)收發(fā)將變得不可控,一是參考時(shí)鐘很快,而是數(shù)據(jù)對齊變得很難,基于此,我們例化了Xilinx官方的 UltraScale+ 100G Ethernet Subsystem IP核,該IP可以處理100G的高速數(shù)據(jù),其內(nèi)部十分復(fù)雜,用戶不必太過關(guān)心,只需知道其用戶接口時(shí)序和配置接口即可使用,雖如此,對齊使用依然是很難的,但我們已經(jīng)寫好了與之對接的收發(fā)處理模塊;對于接收,需要在100G Ethernet 輸出數(shù)據(jù)口加上PTP硬件時(shí)鐘標(biāo)記,以便于解碼和對齊;對于發(fā)送要對待發(fā)送的數(shù)據(jù)進(jìn)行幀重組;以工程1為例,100G-MAC代碼位置如下:
UltraScale+ 100G Ethernet Subsystem 配置如下:
Linux 下的驅(qū)動(dòng)編譯、加載、測試
本設(shè)計(jì)只能在Linux環(huán)境下運(yùn)行,提供驅(qū)動(dòng)源碼和測試源碼,提供驅(qū)動(dòng)編譯、加載、測試簡潔版教程,資料已經(jīng)打包好,截圖如下:
5、vivado工程1–詳解
開發(fā)板FPGA型號:Xilinx Virtex UltraScale+ XCVU3P–xcvu3p-ffvc1517-2-i;
開發(fā)環(huán)境:Vivado2022.2;
輸入/輸出:PCIE/SFP光口
應(yīng)用:NIC-100G 網(wǎng)卡應(yīng)用
工程代碼架構(gòu)如下:
綜合編譯完成后的FPGA資源消耗和功耗預(yù)估如下:
6、vivado工程2–詳解
開發(fā)板FPGA型號:Xilinx Zynq UltraScale+ XCZU19EG–xczu19eg-ffvd1760-2-e;
開發(fā)環(huán)境:Vivado2022.2;
輸入/輸出:PCIE/QSFP光口
應(yīng)用:NIC-100G 網(wǎng)卡應(yīng)用
工程代碼架構(gòu)如下:
綜合編譯完成后的FPGA資源消耗和功耗預(yù)估如下:
7、工程移植說明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開工程后,點(diǎn)擊文件–>另存為;但此方法并不保險(xiǎn),最保險(xiǎn)的方法是將你的vivado版本升級到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開工程后會(huì)發(fā)現(xiàn)IP都被鎖住了,如下:
此時(shí)需要升級IP,操作如下:
FPGA型號不一致處理
如果你的FPGA型號與我的不一致,則需要更改FPGA型號,操作如下:
更改FPGA型號后還需要升級IP,升級IP的方法前面已經(jīng)講述了;
其他注意事項(xiàng)
1:由于每個(gè)板子的DDR不一定完全一樣,所以MIG IP需要根據(jù)你自己的原理圖進(jìn)行配置,甚至可以直接刪掉我這里原工程的MIG并重新添加IP,重新配置;
2:根據(jù)你自己的原理圖修改引腳約束,在xdc文件中修改即可;
3:純FPGA移植到Zynq需要在工程中添加zynq軟核;
8、上板調(diào)試驗(yàn)證
準(zhǔn)備工作
需要準(zhǔn)備以下物品:
1:FPGA開發(fā)板;
2:QSFP光口、光纖;
3:主機(jī),Linux系統(tǒng),最好用服務(wù)器,普通臺式機(jī)性能太差;
連接如下,然后上電下載bit:
上板調(diào)試需要在Linux系統(tǒng)下進(jìn)行,目前已經(jīng)測試過了,但速率跑不到25G,在14G左右,關(guān)于上板測試方法,請參考前面的“Linux 下的驅(qū)動(dòng)編譯、加載、測試”章節(jié);文章來源:http://www.zghlxwxcb.cn/news/detail-717840.html
9、福利:工程代碼的獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式:私,或者文章末尾的V名片。
網(wǎng)盤資料如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-717840.html
到了這里,關(guān)于FPGA實(shí)現(xiàn) RDMA NIC 100G UDP協(xié)議棧網(wǎng)卡,UltraScale+ 100G Ethernet Subsystem驅(qū)動(dòng),提供工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!