0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

blue-ethernet高性能FPGA網(wǎng)絡(luò)數(shù)據(jù)包處理項目簡介

冬至子 ? 來源:Datenlord ? 作者:Datenlord ? 2023-11-13 10:44 ? 次閱讀

01、簡介

blue-ethernet項目使用Bluespec SystemVerilog(BSV)硬件描述語言實現(xiàn)了一系列在FPGA上加速網(wǎng)絡(luò)數(shù)據(jù)包處理的硬件模塊。具體來說,其提供了用于生成和解析Ethernet/IP/UDP網(wǎng)絡(luò)報文的硬件模塊。此外,還提供了一個具有非阻塞高速緩存的APR報文處理單元,用于自動解析設(shè)備的物理MAC地址。

除了構(gòu)建標準的UDP/IP/Ethernet協(xié)議棧,blue-ethernet還增加了對RoCE(RDMA over Converged Ethernet)協(xié)議的支持,具體包括:

1)在UDP/IP報文處理流程中集成 ICRC校驗碼的生成和驗證功能;

2)提供對Priority Flow Control(PFC)協(xié)議的支持,實現(xiàn)無損網(wǎng)絡(luò)傳輸。

最后,本項目還實現(xiàn)了與 Xilinx 100G以太網(wǎng)子系統(tǒng)(CMAC)進行交互的單元。

02、文件目錄概覽

本項目關(guān)鍵目錄的介紹如下:

├── lib               # 外部庫
│   ├── blue-crc      # 高性能CRC硬件實現(xiàn)
│   └── blue-wrapper  # BSV接口封裝模塊
├── scripts           # 腳本
├── src               # 設(shè)計源文件
│   └── includes
├── syn               # 綜合腳本
└── test              # 測試源文件
    ├── bluesim       # 基于bluesim的測試源文件
    ├── cocotb        # 基于python的測試源文件
    └── vivado        # 和CMAC IP進行聯(lián)合仿真的測試文件

以下是部分源文件的介紹:

./src
├── ArpCache.bsv               # Cache implementation storing MAC addresses got from ARP
├── ArpProcessor.bsv           # processing unit handling ARP requests and responses
├── includes                   
│   ├── CompletionBuf.bsv      
│   ├── ContentAddressMem.bsv  
│   ├── EthernetTypes.bsv      # numeric and struct types about protocol definition
│   ├── PortConversion.bsv     # interface conversion modules used to generate ready-to-use Verilog
│   ├── Ports.bsv              # numeric and struct types about in/output ports of modules
│   ├── RFile.bsv
│   ├── StreamHandler.bsv      # modules implemented for manipulating data stream
│   └── Utils.bsv              # utility functions and modules
├── MacLayer.bsv               # generator and parser for Ethernet packet
├── PfcUdpIpArpEthRxTx.bsv     # generator and parser for UDP/IP/Ethernet packet with PFC
├── PriorityFlowControl.bsv    # modules handling PFC
├── UdpIpArpEthRxTx.bsv        # generator and parser for UDP/IP/Ethernet packet 
├── UdpIpEthRx.bsv             # parser for UDP/IP/Ethernet packet
├── UdpIpEthTx.bsv             # generator for UDP/IP/Ethernet packet
├── UdpIpLayer.bsv             # parser and generator for UDP/IP packet
├── UdpIpLayerForRdma.bsv      # parser and generator for UDP/IP packet with support for RoCE
└── XilinxCmacRxTxWrapper.bsv  # bridge modules between parser/generator and Xilinx CMAC

03、組件

本節(jié)將詳細介紹blue-ethernet實現(xiàn)的一些重要組件,包括其功能、接口定義和硬件架構(gòu)等內(nèi)容。

數(shù)據(jù)流處理模塊

硬件網(wǎng)絡(luò)報文處理本質(zhì)上是對數(shù)據(jù)流的各種操作。報文生成模塊實際上是將報頭數(shù)據(jù)流插入發(fā)送內(nèi)容數(shù)據(jù)流的頭部,以生成完整的報文數(shù)據(jù)流。相反,解析模塊則是從報文數(shù)據(jù)流中提取出報頭數(shù)據(jù)流和發(fā)送信息數(shù)據(jù)流。為報文添加校驗和,則是先將報文數(shù)據(jù)流傳入CRC計算單元,然后將輸出的CRC校驗值附加到報文流的尾部。這里提到的數(shù)據(jù)流,其對應(yīng)的硬件實體是由valid-ready握手信號控制的一組數(shù)據(jù)信號。在基于valid-ready握手的交互協(xié)議下,valid信號表示主端(Source)發(fā)起了數(shù)據(jù)傳輸請求,ready信號則表示從端(Sink)準備好接收來自主端的數(shù)據(jù)。只有當(dāng)valid和ready同時為高電平時,即主從雙方同時準備好后,才成功完成一次傳輸。如果需要傳輸?shù)臄?shù)據(jù)量大于一次傳輸?shù)娜萘?,則需要對數(shù)據(jù)進行分段,并通過多次握手傳遞。在對數(shù)據(jù)流的處理中最棘手以及最容易出錯的部分是多個數(shù)據(jù)流交互時如何處理不同流的valid-ready控制信號。在BSV中,控制信號的處理由編譯器實現(xiàn),在語法層面上是不可見的,這更有助于設(shè)計人員專注于不同數(shù)據(jù)流之間的交互邏輯,而不用處理底層復(fù)雜的控制信號。

blue-ethernet提供的用于數(shù)據(jù)流處理的模塊包括:

  • DataStream結(jié)構(gòu)體定義了blue-ethernet中基本的數(shù)據(jù)流格式,其包括256位數(shù)據(jù)信號、32位字節(jié)使能信號和兩個布爾信號isFirst和isLast,分別表示本次傳輸是否是數(shù)據(jù)包的最早/后一幀。
typedef 256 DATA_BUS_WIDTH;
typedef TDiv#(DATA_BUS_WIDTH, 8) DATA_BUS_BYTE_WIDTH;
typedef Bit#(DATA_BUS_WIDTH) Data;
typedef Bit#(DATA_BUS_BYTE_WIDTH) ByteEn;
typedef struct {
    Data data;
    ByteEn byteEn;
    Bool isFirst;
    Bool isLast;
} DataStream deriving(Bits, Bounded, Eq, FShow);
  • mkAppendDataStreamHead模塊將appendDataIn數(shù)據(jù)流附加到dataStreamIn數(shù)據(jù)流的頭部。通過設(shè)置swapDataStream和swapAppendData參數(shù),可以分別轉(zhuǎn)換這兩個數(shù)據(jù)流的字節(jié)序。該模塊可用于合并報頭流和發(fā)送數(shù)據(jù)流,生成完整的報文流。
module mkAppendDataStreamHead#(
    IsSwapEndian swapDataStream,
    IsSwapEndian swapAppendData,
    PipeOut#(DataStream) dataStreamIn,
    PipeOut#(dType) appendDataIn
)(PipeOut#(DataStream));
  • mkAppendDataStreamTail模塊將appendDataIn數(shù)據(jù)流附加到dataStreamIn數(shù)據(jù)流的尾部。在合并前,它還需要接收一個攜帶數(shù)據(jù)流長度的輸入信號streamLengthIn。
module mkAppendDataStreamTail#(
    IsSwapEndian swapDataStream,
    IsSwapEndian swapAppendData,
    PipeOut#(DataStream) dataStreamIn,
    PipeOut#(dType) appendDataIn,
    PipeOut#(Bit#(streamLenWidth)) streamLengthIn
)(PipeOut#(DataStream));
  • mkExtractDataStreamHead模塊提取出數(shù)據(jù)流dataStreamIn的頭部并通過extractDataOut輸出,dataStreamOut接口輸出剩余部分的數(shù)據(jù)。
interface ExtractDataStream#(type dType);
    interface PipeOut#(dType) extractDataOut;
    interface PipeOut#(DataStream) dataStreamOut;
endinterface
module mkExtractDataStreamHead#(
    PipeOut#(DataStream) dataStreamIn
)(ExtractDataStream#(dType));
  • mkAxiStream512ToDataStream模塊將512位AXI-Stream總線接口轉(zhuǎn)換為blue-ethernet中定義的256位數(shù)據(jù)傳輸格式DataStream。
  • mkDataStreamToAxiStream512模塊將256位DataStream數(shù)據(jù)轉(zhuǎn)換為512位AXI-Stream總線。

UdpIpLayer

UdpIpLayer包中的定義的模塊用于生成和解析基于UDP/IP協(xié)議的報文:

  • UdpIpMetaData結(jié)構(gòu)體封裝了每次生成UDP和IP報文時需要動態(tài)更新的信息,具體包括:
typedef struct {
    UdpLength  dataLen;   # The Length of payload data
    IpAddr     ipAddr;    # Desitnation IP address
    IpDscp     ipDscp;    # DSCP field used for PFC
    IpEcn      ipEcn;     # ECN field
    UdpPort    dstPort;   # Destination port number
    UdpPort    srcPort;   # Source port number
} UdpIpMetaData;
  • UdpConfig結(jié)構(gòu)體封裝了UDP/IP報文的某些字段,包括源MAC/IP地址、子網(wǎng)掩碼和網(wǎng)關(guān),這些字段在一段時間內(nèi)都是固定的,通過一次統(tǒng)一的配置即可,而不需要每次生成報文時都動態(tài)地更新。
typedef struct {
    EthMacAddr macAddr;  # Source MAC address
    IpAddr     ipAddr;   # Source IP address
    IpNetMask  netMask;  # IP netmask
    IpGateWay  gateWay;  # IP gateway
} UdpConfig;
  • mkUdpIpStream模塊負責(zé)生成完整的UDP/IP報文流。實例化該模塊時需要指定一個報頭生成函數(shù)genHeader,該函數(shù)的輸入包括UdpIpMetaData和UdpConfig結(jié)構(gòu)體以及IpID字段,輸出完整的UDP/IP報頭。在模塊開始工作前,需要先通過udpConfig接口配置源MAC/IP地址等靜態(tài)信息。每次生成報文的詳細流程如下: 1)從udpIpMetaDataIn接口獲得報頭信息并通過genHeader函數(shù)生成完整的報頭數(shù)據(jù)流;2)計算IP報頭的校驗和并更新到報頭流中;3) 將報頭流插入到發(fā)送信息數(shù)據(jù)流dataStreamIn的頭部后輸出完整報文流。
module mkUdpIpStream#(
    UdpConfig udpConfig,
    PipeOut#(DataStream) dataStreamIn,
    PipeOut#(UdpIpMetaData) udpIpMetaDataIn,
    function UdpIpHeader genHeader(UdpIpMetaData meta, UdpConfig udpConfig, IpID ipId)
)(PipeOut#(DataStream));
  • mkUdpIpMetaDataAndDataStream模塊負責(zé)解析UDP/IP報文流。該模塊的具體工作流程為:1)從報文流udpIpStreamIn中提取出報頭流和信息數(shù)據(jù)流;2) 檢查報頭的地址信息以及IP校驗和是否匹配; 3)若校驗出錯,丟棄提取出的報頭和信息流;4)若校驗通過, 則由dataStreamOut輸出信息數(shù)據(jù)流,并根據(jù)extractMetaData函數(shù)從報頭結(jié)構(gòu)體中提取出相關(guān)報頭信息后通過udpIpMetaDataOut接口輸出。在模塊開始工作前,同樣需要先通過udpConfig接口配置源MAC/IP地址等靜態(tài)信息。
interface UdpIpMetaDataAndDataStream;
    interface PipeOut#(UdpIpMetaData) udpIpMetaDataOut;
    interface PipeOut#(DataStream) dataStreamOut;
endinterface
module mkUdpIpMetaDataAndDataStream#(
    UdpConfig udpConfig,
    PipeOut#(DataStream) udpIpStreamIn,
    function UdpIpMetaData extractMetaData(UdpIpHeader hdr)
)(UdpIpMetaDataAndDataStream);

UdpIpLayerForRdma

UdpIpLayerForRdma包在UdpIpLayer的基礎(chǔ)上提供了對RoCE(RDMA over Converged Ethernet)協(xié)議的支持。為支持RoCE協(xié)議,需要在報文生成和解析模塊中分別添加生成和檢查RoCE數(shù)據(jù)包ICRC校驗和的功能。RoCE數(shù)據(jù)包的格式定義如下,和標準的UDP/IP協(xié)議相比,RoCE協(xié)議需要額外計算整個IP報文的CRC校驗和并附加到尾部。

功能模塊詳解:

  • mkUdpIpStreamForRdma模塊提供與mkUdpIpStream相同的接口和功能。主要區(qū)別在于,它在輸出報文流的尾部附加了額外的ICRC校驗和,以生成符合RoCE協(xié)議的UDP/IP報文。為實現(xiàn)這一功能,該模塊在mkUdpIpStream的基礎(chǔ)上又集成了另外三個組件:(1) mkUdpIpStreamForICrcGen生成用于計算ICRC的報文流;(2) mkCrcStream模塊由blue-crc提供,用于計算CRC校驗和;(3) mkAppendDataStreamTail將CRC校驗和附加到原UDP/IP報文流的尾部;

  • mkUdpIpMetaDataAndDataStreamForRdma模塊在mkUdpIpMetaDataAndDataStream的基礎(chǔ)上提供了校驗RoCE協(xié)議定義的ICRC的功能。為實現(xiàn)這一附加功能,輸入報文流需要經(jīng)過mkUdpIpStreamForICrcChk模塊生成用于ICRC計算的報文流,然后傳遞到mkCrcStream模塊進行ICRC校驗和的計算。如果驗證失敗,mkUdpIpMetaDataAndDataStream模塊提取出的信息流和報頭流將被丟棄。如果驗證通過,提取出的信息流還需要通過mkRemoveICrcFromDataStream模塊,移除尾部附加的ICRC后輸出。

MacLayer

MacLayer中提供的模塊用于生成和解析鏈路層的Ethernet報文: 生成以太網(wǎng)數(shù)據(jù)包需要的報頭信息被定義在MacMetaData結(jié)構(gòu)體中,包括目標物理地址macAddr和報文類型ethType:

typedef struct {
    EthMacAddr macAddr; # Destination MAC address
    EthType    ethType; # Type of Ethernet frame
} MacMetaData deriving(Bits, Eq, FShow);

需要注意的是,在目前的實現(xiàn)中,MacLayer處理的Ethernet報文只包括下圖中紅色矩形框內(nèi)的字段。其他字段由Xilinx提供的CMAC模塊處理。

  • mkMacStream模塊負責(zé)生成Ethernet報文流。其基于以太網(wǎng)報頭信息macMetaDataIn生成Ethernet報頭數(shù)據(jù)流(包括MAC destination/source和EtherType字段),然后將報頭流插入UDP/IP報文流的頭部生成完整的Ethernet報文流。在生成報文前,需要通過udpConfig配置源MAC地址等信息。
module mkMacStream#(
    PipeOut#(DataStream)  udpIpStreamIn,
    PipeOut#(MacMetaData) macMetaDataIn,
    UdpConfig udpConfig
)(PipeOut#(DataStream));
  • mkMacMetaDataAndUdpIpStream模塊從Ethernet報文流macStreamIn中提取出報頭流和UDP/IP報文流,進行地址匹配的檢查后,從報頭流中提取出MacMetaData結(jié)構(gòu)體并從macMetaDataOut接口輸出,而UDP/IP報文流從udpIpStreamOut接口輸出。
interface MacMetaDataAndUdpIpStream;
    interface PipeOut#(MacMetaData) macMetaDataOut;
    interface PipeOut#(DataStream)  udpIpStreamOut;
endinterface

module mkMacMetaDataAndUdpIpStream#(
    PipeOut#(DataStream) macStreamIn,
    UdpConfig udpConfig
)(MacMetaDataAndUdpIpStream);

ARP Processor

地址解析協(xié)議(ARP)用于解析給定IP地址對應(yīng)的MAC物理地址。在blue-ethernet中,mkArpProcessor模塊負責(zé)ARP協(xié)議的處理,其集成了ARP報文生成器、解析器以及緩存MAC地址信息的mkArpCache等模塊。

mkArpCache

mkArpCache模塊用于緩存解析得到的MAC物理地址。在ARP的應(yīng)用場景下,緩存地址為32-bit的IP地址,緩存數(shù)據(jù)為48-bit的MAC物理地址。mkArpCache存儲陣列的組織形式為4路組相聯(lián),每路包含64行,每行包括1-bit有效位、26-bit標記位以及48-bit數(shù)據(jù)。在該默認配置下存儲容量的總大小約為1.2KB,同時設(shè)計也支持改變行數(shù)和路數(shù)進一步提升緩存空間。在此內(nèi)存陣列的基礎(chǔ)上,緩存還支持outstanding模式以及偽LRU(Least Frequently Used)行替換算法。

mkArpCache模塊的接口定義和結(jié)構(gòu)圖如下所示。ArpCache可以分成兩個子接口:cacheServer接口與Ethernet報文生成模塊進行交互,接收并響應(yīng)其發(fā)起的MAC地址檢索請求;arpClient接口與ARP報文生成和解析模塊交互,處理緩存未命中的情況。mkArpCache模塊的工作流程如下:

當(dāng)收到Ethernet報文生成模塊檢索MAC地址的請求后,首先根據(jù)給定IP地址搜索緩存陣列,檢查所需的MAC地址是否已經(jīng)存儲在緩存陣列中。如果緩存命中,則將獲取的MAC地址發(fā)送到hitBuf。若未命中,則將IP地址發(fā)送到arpReqBuf以向外發(fā)起ARP請求。當(dāng)ARP響應(yīng)返回時,將解析得到的MAC地址同時寫入cacheWrBuf和missHitBuf,更新緩存陣列內(nèi)的數(shù)據(jù),同時響應(yīng)Ethernet報文生成器檢索MAC地址的請求。

interface ArpCache;
    interface Server#(CacheAddr, CacheData) cacheServer;
    interface Client#(CacheAddr,   ArpResp) arpClient;
endinterface

mkArpProcessor

mkArpProcessor集成了MAC地址信息緩存單元mkArpCache以及對ARP報文的解析和生成模塊。在處理ARP請求和響應(yīng)時,mkArpProcessor既可作為請求端,在Cache Miss時發(fā)出ARP請求報文并接收從目標設(shè)備返回的ARP響應(yīng)報文。同時也可作為被請求端,接收其他設(shè)備發(fā)出的ARP請求報文并將自己的MAC地址信息通過ARP響應(yīng)返回給請求端。

interface ArpProcessor;
    interface PipeOut#(DataStream) arpStreamOut;
    interface PipeOut#(MacMetaData) macMetaDataOut;
    interface Put#(UdpConfig) udpConfig;
endinterface

module mkArpProcessor#(
    PipeOut#(DataStream) arpStreamIn,
    PipeOut#(UdpIpMetaData) udpIpMetaDataIn
)(ArpProcessor);

UdpIpEthRx

UdpIpEthRx包提供的模塊用于接收并解析UDP/IP/Ethernet報文流:

  • mkGenericUdpIpEthRx模塊從UDP/IP/Ethernet報文數(shù)據(jù)流axiStreamIn中提取出Ethernet報頭信息流macMetaDataOut、UDP/IP報頭數(shù)據(jù)流udpIpMetaDataOut和有效信息數(shù)據(jù)流dataStreamOut。在開始接收并解析報文前,需要先通過udpConfig接口配置源IP/MAC地址等信息。模塊參數(shù)isSupportRdma指定是否提供對RoCE協(xié)議的支持。下圖展示了該模塊在開啟對RoCE協(xié)議的支持后對應(yīng)的電路結(jié)構(gòu)。如果禁用對RoCE協(xié)議的支持,整個 mkUdpIpMetaDataAndDataStreamForRdma模塊將由mkUdpIpMetaDataAndDataStream所替代。
interface UdpIpEthRx;
    interface Put#(UdpConfig) udpConfig;
    
    interface Put#(AxiStream512) axiStreamIn;
    
    interface PipeOut#(MacMetaData) macMetaDataOut;
    interface PipeOut#(UdpIpMetaData) udpIpMetaDataOut;
    interface PipeOut#(DataStream)  dataStreamOut;
endinterface

module mkGenericUdpIpEthRx#(Bool isSupportRdma)(UdpIpEthRx)

  • mkGenericRawUdpIpEthRx模塊使用blue-wrapper中提供的組件對mkGenericUdpIpEthRx進行封裝,目的是為了在生成的Verilog代碼里提供直接可用的接口。

UdpIpEthTx

UdpIpEthTx包提供的模塊用于生成并輸出UDP/IP/Ethernet報文流。

  • mkGenericUdpIpEthTx模塊接收Ethernet報頭信息數(shù)據(jù)流macMetaDataOut、UDP/IP報頭信息數(shù)據(jù)流udpIpMetaDataOut,以及發(fā)送信息數(shù)據(jù)流dataStreamOut,生成完整的UDP/IP/Ethernet報文流并通過 axiStreamOut接口輸出。模塊的配置參數(shù)isSupportRdma指定在報文處理過程中是否支持RoCE協(xié)議。下圖展示了啟用對RoCE協(xié)議的支持后模塊的整體結(jié)構(gòu):
interface UdpIpEthTx;
    interface Put#(UdpConfig) udpConfig;
    interface Put#(UdpIpMetaData) udpIpMetaDataIn;
    interface Put#(MacMetaData) macMetaDataIn;
    interface Put#(DataStream) dataStreamIn;
    interface AxiStream512PipeOut axiStreamOut;
endinterface

module mkGenericUdpIpEthTx#(Bool isSupportRdma)(UdpIpEthTx);

  • mkGenericRawUdpIpEthTx基于blue-wrapper倉庫提供的組件對mkGenericUdpIpEthTx模塊進行封裝,以在生成的Verilog代碼中提供直接可用的接口。

UdpIpArpEthRxTx

UdpIpArpEthRxTx包中的模塊集成了生成和解析UDP/IP/Ethernet報文,以及處理ARP請求和響應(yīng)等功能,提供對UDP/IP/Ethernet協(xié)議棧完整的支持:

  • mkGenericUdpIpArpEthRxTx模塊可劃分為兩個方向相反的數(shù)據(jù)流通路,分別是發(fā)送通路和接收通路。對于發(fā)送通路,其接收發(fā)送信息數(shù)據(jù)流dataStreamInTx和UDP/IP報頭流udpIpMetaDataIn,生成并輸出UDP/IP/Ethernet報文流axiStreamOutTx。對于接收通路,其工作方式正好相反,從UDP/IP/Ethernet報文流axiStreamInRx中提取出發(fā)送信息數(shù)據(jù)流dataStreamOutRx和UDP/IP報頭流udpIpMetaDataOutRx。模塊配置參數(shù)isSupportRdma指定該模塊是否支持RoCE協(xié)議。下圖展示了啟用對RoCE協(xié)議的支持后硬件電路的整體結(jié)構(gòu)。
interface UdpIpArpEthRxTx;
    interface Put#(UdpConfig)  udpConfig;
    // Tx
    interface Put#(UdpIpMetaData) udpIpMetaDataInTx;
    interface Put#(DataStream)    dataStreamInTx;
    interface AxiStream512PipeOut axiStreamOutTx;
    // Rx
    interface Put#(AxiStream512)   axiStreamInRx;
    interface PipeOut#(UdpIpMetaData) udpIpMetaDataOutRx;
    interface PipeOut#(DataStream)    dataStreamOutRx;
endinterface

module mkGenericUdpIpArpEthRxTx#(Bool isSupportRdma)(UdpIpArpEthRxTx);

  • mkGenericRawUdpIpArpEthRxTx模塊使用 blue-wrapper中提供的組件對mkGenericUdpIpArpEthRxTx進行封裝,從而生成方便對接的Verilog接口。

PriorityFlowControl

PriorityFlowControl包中的模塊用于實現(xiàn)PFC協(xié)議,以確保無損網(wǎng)絡(luò)數(shù)據(jù)傳輸。

  • mkPriorityFlowControlTx負責(zé)報文發(fā)送端的PFC控制,其接收八路發(fā)送數(shù)據(jù)流dataStreamInVec和八路報頭信息流udpIpMetaDataInVec,對這兩組八路數(shù)據(jù)流進行仲裁后分別通過udpIpMetaDataOut和dataStreamOut接口輸出仲裁結(jié)果。仲裁采用Round Robin策略,給予八個通道相同的優(yōu)先級。同時,該模塊還負責(zé)根據(jù)PFC報文中提供的流控信息flowControlReqVecIn,暫?;蚧謴?fù)每個通道的數(shù)據(jù)發(fā)送。
interface PriorityFlowControlTx;
    interface Get#(UdpIpMetaData) udpIpMetaDataOut;
    interface Get#(DataStream) dataStreamOut;
endinterface

module mkPriorityFlowControlTx#(
    PipeOut#(FlowControlReqVec) flowControlReqVecIn,
    Vector#(VIRTUAL_CHANNEL_NUM, DataStreamPipeOut) dataStreamInVec,
    Vector#(VIRTUAL_CHANNEL_NUM, UdpIpMetaDataPipeOut) udpIpMetaDataInVec
)(PriorityFlowControlTx);

  • mkPriorityFlowControlRx負責(zé)報文接收端的PFC控制。其接收報頭信息流udpIpMetaDataIn和發(fā)送信息數(shù)據(jù)流 dataStreamIn,然后根據(jù)報頭信息中包含的通道索引值分別路由至udpIpMetaDataOutVec和dataStreamOutVec中的某個輸出通道。此外,該模塊需要監(jiān)控每個通道的中間緩沖區(qū)中存儲的報文數(shù)量。當(dāng)某個通道緩沖區(qū)內(nèi)的報文數(shù)量達到閾值pfcThreshold時,就會發(fā)送PFC報文至發(fā)送端以暫停該通道的報文傳輸。
interface PriorityFlowControlRx#(
    numeric type bufPacketNum, 
    numeric type maxPacketFrameNum,
    numeric type pfcThreshold
);
    interface PipeOut#(FlowControlReqVec) flowControlReqVecOut;
    interface Vector#(VIRTUAL_CHANNEL_NUM, Get#(DataStream)) dataStreamOutVec;
    interface Vector#(VIRTUAL_CHANNEL_NUM, Get#(UdpIpMetaData)) udpIpMetaDataOutVec;
endinterface

module mkPriorityFlowControlRx#(
    DataStreamPipeOut dataStreamIn,
    UdpIpMetaDataPipeOut udpIpMetaDataIn
)(PriorityFlowControlRx#(bufPacketNum, maxPacketFrameNum, pfcThreshold));

04、性能和面積

基于Xilinx xcvu9p FPGA,使用Vivado對blue-ethernet中的主要模塊mkGenericUdpIpArpEthRxTx進行綜合和實現(xiàn)。結(jié)果表明,電路的工作頻率可達 500MHz,峰值吞吐量為 128Gbps。硬件資源使用情況如下:

CLB Logic
+----------------------------+-------+-------+------------+-----------+-------+
|          Site Type         |  Used | Fixed | Prohibited | Available | Util% |
+----------------------------+-------+-------+------------+-----------+-------+
| CLB LUTs                   | 63886 |     0 |          0 |   1182240 |  5.40 |
|   LUT as Logic             | 41242 |     0 |          0 |   1182240 |  3.49 |
|   LUT as Memory            | 22644 |     0 |          0 |    591840 |  3.83 |
|     LUT as Distributed RAM | 22644 |     0 |            |           |       |
|     LUT as Shift Register  |     0 |     0 |            |           |       |
| CLB Registers              | 44099 |     0 |          0 |   2364480 |  1.87 |
|   Register as Flip Flop    | 44099 |     0 |          0 |   2364480 |  1.87 |
|   Register as Latch        |     0 |     0 |          0 |   2364480 |  0.00 |
| CARRY8                     |    73 |     0 |          0 |    147780 |  0.05 |
| F7 Muxes                   |   194 |     0 |          0 |    591120 |  0.03 |
| F8 Muxes                   |    28 |     0 |          0 |    295560 | < 0.01 |
| F9 Muxes                   |     0 |     0 |          0 |    147780 |  0.00 |
+----------------------------+-------+-------+------------+-----------+-------+

BLOCKRAM
+-------------------+------+-------+------------+-----------+-------+
|     Site Type     | Used | Fixed | Prohibited | Available | Util% |
+-------------------+------+-------+------------+-----------+-------+
| Block RAM Tile    |  4.5 |     0 |          0 |      2160 |  0.21 |
|   RAMB36/FIFO*    |    4 |     0 |          0 |      2160 |  0.19 |
|     RAMB36E2 only |    4 |       |            |           |       |
|   RAMB18          |    1 |     0 |          0 |      4320 |  0.02 |
|     RAMB18E2 only |    1 |       |            |           |       |
| URAM              |    0 |     0 |          0 |       960 |  0.00 |
+-------------------+------+-------+------------+-----------+-------+

05、入門教程

本節(jié)將介紹如何開始使用此項目。在進行其他步驟前,首先需要參照根目錄下的setup.sh腳本配置開發(fā)環(huán)境。以下列出了開發(fā)環(huán)境依賴的軟件包:

  • Bluespec 編譯器
  • Docker
  • Vivado
  • Python 軟件包:cocotb、cocotb-test、netifaces、scapy、cocotbext-axi
  • 硬件模擬器:iverilog/verilator 環(huán)境配置好后,將blue-ethernet倉庫克隆到某一目錄。這里我們將該目錄統(tǒng)一稱為BLUE_ETH:
git clone --recursive https://github.com/wengwz/blue-ethernet.git $(BLUE_ETH)

仿真測試

blue-ethernet提供了三種不同級別的測試平臺:

  • 子模塊級:該級別測試平臺代碼位于$(BLUE_ETH)/test/bluesim,主要提供了一些重要子模塊的功能驗證,如ArpCache、CompletionBuf 和 AppendDataStreamTail。要運行仿真,可參考以下命令:
# Specify TARGET to the name of target component
cd $(BLUE_ETH)/test/bluesim
make TARGET=ArpCache
  • 系統(tǒng)級:該級別測試平臺的代碼位于$BLUE_ETH/test/cocotb,基于Cocotb使用Python實現(xiàn)。模塊UdpIpEthRx和UdpIpEthTx的功能驗證使用scapy構(gòu)建參考模型。模塊UdpIpArpEthRxTx在docker構(gòu)建的虛擬網(wǎng)絡(luò)上進行測試。
# Run tests of UdpIpEthRx/Tx
# Enable/Disable support for RDMA by setting SUPPORT_RDAM to True/False
cd $(BLUE_ETH)/test/cocotb
make cocotb TARGET=UdpIpEthTx SUPPORT_RDMA=TRUE

# Run simulation on virtual network
# Change NET_IFC in run_docker_net_test.sh to the name of your network card
cd $(BLUE_ETH)/test/cocotb
docker build -f ./build_docker/Dockerfile -t ethernet-test ./build_docker
./run_docker_net_test.sh
  • 與CMAC進行聯(lián)合仿真:在Vivado中與CMAC IP聯(lián)合仿真的腳本位于目錄$(BLUE_ETH)/test/vivado。
# Available TARGET includes UdpIpArpEthCmacRxTx/PfcUdpIpArpEthCmacRxTx
# Enable/Disable support for RDMA by setting SUPPORT_RDAM to True/False
cd $(BLUE_ETH)/test/vivado
make sim TARGET=UdpIpArpEthCmacRxTx SUPPORT_RDMA=False

綜合與物理實現(xiàn)在Vivado下運行綜合和物理實現(xiàn)的腳本位于目錄$(BLUE_ETH)/syn。

# TARGET specifies the top module to be synthsized or implemented
# SUPPORT_RDMA specifies whether modules supports RoCE packet processing
# ONLYSYNTH decides whether or not run implemetation after synthesis 
cd $(BLUE_ETH)/syn
make vivado TARGET=UdpIpArpEthRxTx SUPPORT_RDMA=False ONLYSYNTH=0

使用方法

  • Verilog用戶:本倉庫提供的BSV設(shè)計可生成Verilog代碼并集成到其他項目中。本倉庫已經(jīng)基于blue-wrapper提供的組件對mkRawUdpIpArpEthRxTx、mkRawUdpIpEthRx/Tx等模塊進行封裝,以在生成的Verilog中提供方便的接口。對于其他模塊,您也可以根據(jù)需要對它們進行封裝。若要生成 Verilog 代碼,可參考以下命令,生成的代碼位于目錄$(BLUE_ETH)/test/cocotb/verilog中。
# TARGET specifies the name of top module to be generated
# Specify SUPPORT_RDMA if needed
cd $(BLUE_ETH)/test/cocotb
make verilog TARGET=UdpIpEthTx SUPPORT_RDMA=TRUE
  • BSV用戶:對于使用BSV的設(shè)計人員來說,可以更加方便地將blue-ethernet倉庫中提供的模塊集成到自己的項目中。只需在代碼中導(dǎo)入使用到的包,并在編譯選項中添加本倉庫源文件夾的路徑即可:
bsc -p +:$(BLUE_ETH)/src:$(BLUE_ETH)/src/includes ...
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA設(shè)計
    +關(guān)注

    關(guān)注

    9

    文章

    428

    瀏覽量

    26561
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5453

    瀏覽量

    172219
  • UDP協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    69

    瀏覽量

    12719
  • CRC校驗
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    15245
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    317

    瀏覽量

    21062
收藏 人收藏

    評論

    相關(guān)推薦

    DPDK在AI驅(qū)動的高效數(shù)據(jù)包處理應(yīng)用

    傳統(tǒng)的數(shù)據(jù)包處理方式是數(shù)據(jù)包先到內(nèi)核最后再到用戶層進行處理。這種方式會增加額外的延遲和CPU開銷,嚴重影響數(shù)據(jù)包
    的頭像 發(fā)表于 02-25 11:28 ?997次閱讀
    DPDK在AI驅(qū)動的高效<b class='flag-5'>數(shù)據(jù)包</b><b class='flag-5'>處理</b>應(yīng)用

    如何利用FPGA開發(fā)高性能網(wǎng)絡(luò)安全處理平臺?

    通過FPGA來構(gòu)建一個低成本、高性能、開放架構(gòu)的數(shù)據(jù)平面引擎可以為網(wǎng)絡(luò)安全設(shè)備提供性能提高的動力。隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,
    發(fā)表于 08-12 08:13

    網(wǎng)絡(luò)數(shù)據(jù)包捕獲機制研究

    網(wǎng)絡(luò)數(shù)據(jù)包捕獲技術(shù),是實現(xiàn)入侵檢測、網(wǎng)絡(luò)安全審計的關(guān)鍵技術(shù)。本文改進了國外傳統(tǒng)的數(shù)據(jù)包捕獲函數(shù)庫Libpcap 捕獲數(shù)據(jù)包的方案。原方案在網(wǎng)
    發(fā)表于 09-01 10:09 ?9次下載

    基于Jpcap的數(shù)據(jù)包捕獲器的設(shè)計與實現(xiàn)

    本文研究了以太網(wǎng)數(shù)據(jù)包的捕獲機制,實現(xiàn)了基于JPcap的網(wǎng)絡(luò)數(shù)據(jù)包捕獲工具,其基本原理是通過調(diào)用Jpcap庫捕獲本地網(wǎng)絡(luò)上的所有數(shù)據(jù)包,然后
    發(fā)表于 01-15 13:47 ?38次下載

    基于FPGA的IPV6數(shù)據(jù)包的拆裝

    介紹了一種運用FPGA將IPV6數(shù)據(jù)包的包頭和數(shù)據(jù)部分分離并重新封裝的方法。利用該方法,可以使IPV6數(shù)據(jù)包的拆裝處理速度達到2Gbit/s
    發(fā)表于 06-25 17:53 ?14次下載

    數(shù)據(jù)包過濾原理

    數(shù)據(jù)包過濾技術(shù)數(shù)據(jù)包過濾原理              數(shù)據(jù)包過濾技術(shù)是防火墻最常用的技術(shù)。對于一
    發(fā)表于 06-16 23:44 ?4630次閱讀
    <b class='flag-5'>數(shù)據(jù)包</b>過濾原理

    什么是數(shù)據(jù)包

    什么是數(shù)據(jù)包? 您在互聯(lián)網(wǎng)上做的一切都涉及到數(shù)據(jù)包。例如,您接收的每個網(wǎng)頁都以一系列數(shù)據(jù)包的形式傳入,您發(fā)送的每封電子郵件都以一系列數(shù)據(jù)包的形式傳出。以
    發(fā)表于 08-03 09:13 ?2031次閱讀

    基于FPGA網(wǎng)絡(luò)處理技術(shù)的性能和靈活性分析

    基于FPGA網(wǎng)絡(luò)處理技術(shù)的性能和靈活性分析 網(wǎng)絡(luò)處理是指對在通信和
    發(fā)表于 12-26 14:58 ?846次閱讀

    高速數(shù)據(jù)包處理硬件加速技術(shù)

    鏈路帶寬的劇增給高速網(wǎng)絡(luò)數(shù)據(jù)包處理帶來了極大的挑戰(zhàn)。傳統(tǒng)的純軟件網(wǎng)絡(luò)數(shù)據(jù)包處理
    發(fā)表于 05-28 16:24 ?0次下載
    高速<b class='flag-5'>數(shù)據(jù)包</b><b class='flag-5'>處理</b>硬件加速技術(shù)

    基于數(shù)據(jù)包長度的網(wǎng)絡(luò)隱蔽通道

    在傳統(tǒng)隱蔽通道模型的基礎(chǔ)上,利用數(shù)據(jù)包的長度域,設(shè)計一種基于數(shù)據(jù)包長度的網(wǎng)絡(luò)隱蔽通道模型(LAWB模型),給出其形式化描述。對該模型進行了分析,并分別在IPv4和IPv6上對該模型進行了
    發(fā)表于 02-23 15:18 ?23次下載
    基于<b class='flag-5'>數(shù)據(jù)包</b>長度的<b class='flag-5'>網(wǎng)絡(luò)</b>隱蔽通道

    網(wǎng)絡(luò)數(shù)據(jù)包分析軟件wireshark的基本使用

    Wireshark(前稱Ethereal)是一個網(wǎng)絡(luò)數(shù)據(jù)包分析軟件。網(wǎng)絡(luò)數(shù)據(jù)包分析軟件的功能是截取網(wǎng)絡(luò)數(shù)
    的頭像 發(fā)表于 09-29 14:48 ?3058次閱讀

    Wireshark網(wǎng)絡(luò)數(shù)據(jù)包分析軟件簡介

    wireshark是一個免費開源的網(wǎng)絡(luò)數(shù)據(jù)包分析軟件,功能十分強大??梢越厝「鞣N網(wǎng)絡(luò)數(shù)據(jù)包,顯示網(wǎng)絡(luò)數(shù)據(jù)
    的頭像 發(fā)表于 04-26 09:52 ?2862次閱讀
    Wireshark<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>數(shù)據(jù)包</b>分析軟件<b class='flag-5'>簡介</b>

    全局數(shù)據(jù)包通信簡介

    1?全局數(shù)據(jù)包通信簡介 對于PLC之間的數(shù)據(jù)交換,只關(guān)心數(shù)據(jù)的發(fā)送區(qū)和接收區(qū),全局數(shù)據(jù)包的通信方式是在配PLC硬件的過程中,組態(tài)所要通信PL
    的頭像 發(fā)表于 05-29 10:04 ?897次閱讀
    全局<b class='flag-5'>數(shù)據(jù)包</b>通信<b class='flag-5'>簡介</b>

    【虹科】使用流和網(wǎng)絡(luò)數(shù)據(jù)包數(shù)據(jù)進行故障排除

    暢通無阻的網(wǎng)絡(luò)性能是許多NetOps活動的核心目標,其中之一是通過使用數(shù)據(jù)包數(shù)據(jù)網(wǎng)絡(luò)流來解決網(wǎng)絡(luò)
    的頭像 發(fā)表于 09-23 18:53 ?689次閱讀
    【虹科】使用流和<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>數(shù)據(jù)包</b><b class='flag-5'>數(shù)據(jù)</b>進行故障排除

    請問高端網(wǎng)絡(luò)芯片如何處理數(shù)據(jù)包呢?

    隨著網(wǎng)絡(luò)芯片帶寬的持續(xù)提升,其內(nèi)部數(shù)據(jù)包處理單元的工作負載也隨之增加。然而,如果處理單元無法與網(wǎng)絡(luò)接口的傳入速率相匹配,將無法及時
    的頭像 發(fā)表于 04-02 16:36 ?664次閱讀
    請問高端<b class='flag-5'>網(wǎng)絡(luò)</b>芯片如何<b class='flag-5'>處理</b><b class='flag-5'>數(shù)據(jù)包</b>呢?