Corundum,完全开源的100Gbps网卡,主要设计实现了一种可配置的DMA。
**相比于NetFPGA,**NetFPGA更面向交换和分组处理,corundum旨在充当网卡。由于历史原因,NetFPGA网卡参考设计依赖于XDMA和RIFFA作为主机接口,这两种接口都不是为网络应用设计的,因此性能不佳。
相比于Xilinx的OpenNIC,OpenNIC 和 Corundum 最大的区别在于 OpenNIC 使用 Xilinx QDMA IP 内核作为主机接口,而 Corundum 使用完全定制的 DMA 子系统。因此,OpenNIC 受益于对 QDMA IP 的现有软件支持,包括 OpenNIC 中的 Linux 网络设备驱动程序和 DPDK PMD。另一方面,Corundum 中的 DMA 子系统更加灵活,支持scatter/gather DMA 以降低 CPU 开销,以及可用于作为用户逻辑的接口,并为所有数据包提供 PTP 时间戳的per-packet metadata。
Corundum 还支持 TCP/UDP/IP 校验和卸载,以及管理功能,包括通过 PCIe 进行固件更新和与光收发器通信。此外,Corundum 支持各种开箱即用的 FPGA 和 FPGA 板,而 OpenNIC 仅限于 QDMA 支持的设备,不包括各种板的参考设计。OpenNIC 和 Corundum 都可以支持流式数据包处理应用程序,包括在用户逻辑中实现的 P4 程序。市面上已经有了相当一部分智能网卡,包括Tonic、PANIC、NanoPU。Corundum别于所有这些项目,因为它是完全开源的,可以运行在一个标准的主机网络栈,在实际的物理链路。它提供了数千个传输队列和可扩展的传输调度程序,用于流的细粒度控制。这就为开发结合了硬件和软件功能的网络应用程序提供了一个强大而灵活的开源平台。
硬件队列状态存储:Corundum在FPGA块RAM中高效存储硬件队列状态,支持数千个可单独控制的队列。这些队列与接口关联,每个接口可以有多个端口,每个端口都有自己的独立传输调度器。这种设计允许对数据包传输进行极其细粒度的控制。
调度模块设计:调度模块设计为可修改或完全换出,以实现不同的传输调度方案,包括实验性调度器。结合PTP(精确时间协议)时间同步(PTP hardware clock),这使得基于时间的调度成为可能,包括高精度TDMA(时分多址)。
模块化和参数化设计:Corundum的设计是模块化的,高度参数化。许多配置和结构选项可以在综合时通过Verilog参数设置,包括接口和端口数量、队列数量、内存大小等。这些设计参数在配置寄存器中暴露,驱动程序读取这些寄存器以确定NIC(网络接口卡)配置,使得相同的驱动程序可以支持许多不同的板卡和配置,无需修改。
高level概述:Corundum NIC(网络接口卡)的块图展示了NIC的几个层级。顶级模块主要包含support和接口组件,包括PCI Express硬IP核心和以太网接口组件(包括MAC、PHY和相关的串行器),以及一个mqnic_core顶层(wrapper)实例,提供DMA接口。mqnic_core核心模块包含PTP时钟(mqnic_ptp)、APP部分(mqnic_app_block)和一个或多个mqnic_interface模块实例。每个接口模块对应于操作系统级别的网络接口(例如eth0
),包含队列管理逻辑、描述符(Desc)和完成处理逻辑(Cpl)、传输调度器(Sched)、传输(TX)和接收引擎(RX)、传输和接收数据路径(Ingress和Egress),以及用于在DMA操作期间临时存储进出数据包的临时RAM。队列管理逻辑维护所有NIC队列的状态,包括传输、传输完成、接收、接收完成和事件队列。
调度器:对于每个接口,接口模块中的传输调度器(mqnic_tx_scheduler_block)决定哪些队列被指定用于传输。传输调度器生成命令给TX_engine,该引擎协调传输数据路径上的操作。调度模块是一个灵活的功能块,可以修改或替换以支持任意调度,可能是事件驱动的。默认的调度实现是简单的轮询(round-robin)。
接收方向:传入的数据包通过一个flow hash module以确定目标接收队列,并为接收引擎生成命令,该引擎协调接收数据路径上的操作。因为同一接口模块中的所有端口共享相同的一组接收队列,不同端口上的传入流合并到同一组队列中。
APP块:提供了一个APP块(mqnic_app_block)用于定制,包括数据包处理、路由和网络内计算应用。APP块连接到几个不同的子系统。
NIC组件的互连:NIC组件通过几种不同的接口互连,包括AXI lite、AXI stream和DMA操作的自定义。
分段内存接口(移植时需要研究其接口构造):AXI lite用于从驱动程序到NIC的控制路径,用于初始化和配置NIC组件以及在传输和接收操作中控制队列指针。AXI stream接口用于在NIC内部传输数据包化数据。分段内存接口用于连接PCIe DMA接口到NIC数据路径以及描述符(Desc)和完成处理逻辑。 时钟域:大多数NIC逻辑在PCIe用户时钟域运行,对于所有当前设计变体来说,名义上是250 MHz。而使用异步FIFO与MAC接口,这些MAC在适当的串行器传输和接收时钟域中运行——10G为156.25 MHz,25G为390.625 MHz,100G为322.265625 MHz。
Corundum的zulip社区
Corundum的GitHub地址
https://github.com/corundum/corundum
Corundum的最新branch地址
https://github.com/alexforencich/corundum
Corundum的Wiki Document
Contents — Corundum documentation