Hotdry.
systems-engineering

Corundum FPGA NIC硬件架构解析:in-network计算的数据平面加速与可编程流水线

深入分析Corundum开源FPGA NIC的硬件架构设计,探讨其如何通过可编程流水线实现in-network计算的数据平面加速,包括队列管理、调度器可替换性和DMA引擎优化。

在数据中心网络架构持续演进的今天,in-network 计算(网络内计算)正成为降低端到端延迟、提升数据处理效率的关键技术路径。传统 CPU 为中心的架构在处理高吞吐量网络数据流时面临内存带宽瓶颈和上下文切换开销,而 FPGA(现场可编程门阵列)凭借其可重构性和并行处理能力,为 in-network 计算提供了理想的硬件平台。Corundum 作为一款开源的高性能 FPGA NIC(网络接口卡),其独特的硬件架构设计为 in-network 计算的数据平面加速提供了可编程流水线的实现基础。

Corundum 架构概览:分层模块化设计

Corundum 采用分层模块化的硬件架构,这一设计哲学贯穿于其从物理接口到应用逻辑的各个层次。在顶层,Corundum 包含 PCIe 硬核 IP(HIP)和以太网接口组件,包括 MAC(媒体访问控制)、PHY(物理层)以及相关的串行器。这些基础组件通过mqnic_core包装器进行封装,该包装器提供了统一的 DMA(直接内存访问)接口。

核心模块mqnic_core是整个架构的中枢,它集成了 PTP(精确时间协议)时钟子系统、应用区块(mqnic_app_block)以及一个或多个接口模块(mqnic_interface)实例。每个接口模块对应操作系统层面的一个网络接口(如eth0),包含了队列管理逻辑、描述符和完成处理逻辑、传输调度器、传输和接收引擎,以及用于在 DMA 操作期间临时存储进出数据包的暂存 RAM。

Corundum 的一个关键创新在于其硬件队列状态管理。队列状态被高效地存储在 FPGA 的块 RAM(Block RAM)或超 RAM(Ultra RAM)中,这使得单个 NIC 能够支持数千个独立可控的队列。这些队列包括传输队列、传输完成队列、接收队列、接收完成队列和事件队列。每个接口可以关联多个物理端口,而每个端口都拥有独立的传输调度器,这种设计为精细化的流量控制奠定了基础。

应用区块:in-network 计算的可编程接口

mqnic_app_block是 Corundum 架构中专门为 in-network 计算设计的可编程区块。这一区块通过专用的 PCIe BAR(基地址寄存器)进行控制和配置,为开发者提供了访问核心数据路径和 DMA 基础设施的接口。应用区块连接到多个子系统,包括:

  1. 控制接口:通过 AXI Lite 总线与驱动程序通信,用于配置和状态监控
  2. 数据路径接口:通过 AXI Stream 总线与传输和接收引擎交互,实现数据包的实时处理
  3. DMA 接口:通过自定义的分段内存接口访问主机内存,支持高效的数据搬移

应用区块的可编程性使得开发者能够实现各种 in-network 计算功能,如:

  • 数据包过滤和分类:在数据包进入主机内存前进行预处理
  • 协议卸载:将 TCP/IP 协议栈的部分功能卸载到 FPGA
  • 实时数据分析:对流经网络的数据进行实时统计和分析
  • 自定义路由逻辑:实现特定的路由算法或负载均衡策略

数据平面加速机制

队列管理与调度器可替换性

Corundum 的数据平面加速核心在于其灵活的队列管理和调度器架构。所有与同一接口模块关联的端口共享同一组传输队列,这种设计使得队列到端口的映射可以动态调整,而无需影响操作系统的网络栈。传输调度器(mqnic_tx_scheduler_block)负责决定哪些队列的数据将被传输,它生成命令给传输引擎,协调传输数据路径上的操作。

调度器模块被设计为可替换的功能块,开发者可以修改或完全替换默认的调度算法。Corundum 默认提供的是简单的轮询调度器(tx_scheduler_rr),但架构支持任意调度策略的实现,包括事件驱动调度。当与 PTP 时间同步结合时,这种灵活性使得高精度 TDMA(时分多址)调度成为可能,这对于时间敏感的网络应用至关重要。

DMA 引擎优化

Corundum 的自定义 PCIe DMA 引擎是其高性能的关键。与传统的基于描述符链的 DMA 不同,Corundum 的 DMA 引擎采用紧密集成的设计,减少了数据传输的延迟和开销。DMA 引擎通过分段内存接口连接到 NIC 的数据路径,这种接口专门为高效的小数据包传输优化。

DMA 操作涉及多个协同工作的模块:

  • 描述符获取模块desc_fetch):从主机内存中读取描述符
  • 传输引擎tx_engine):管理传输数据路径操作,包括描述符出队、数据包获取和传输
  • 接收引擎rx_engine):管理接收数据路径操作,包括数据包接收、数据写回和完成记录
  • 完成写入模块cpl_write):负责将完成和事件记录排入完成队列管理器,并通过 DMA 写入主机内存

校验和与哈希卸载

为了进一步减轻主机 CPU 的负担,Corundum 在硬件层面实现了校验和计算和流哈希功能。接收校验和模块(rx_checksum)计算以太网帧有效载荷的 16 位校验和,辅助 IP 校验和卸载。接收哈希模块(rx_hash)从数据包头中提取 IP 地址和端口,计算 32 位 Toeplitz 流哈希,支持 RSS(接收端缩放)功能。

可编程流水线实现策略

Corundum 的可编程流水线实现基于其模块化的 Verilog 设计。开发者可以通过修改或扩展现有模块,或者创建新的模块来实现特定的 in-network 计算功能。实现策略包括:

1. 应用区块扩展

最直接的方式是在mqnic_app_block中实现自定义逻辑。开发者可以利用该区块提供的接口:

  • 控制寄存器:通过 AXI Lite 接口暴露给驱动程序
  • 数据路径挂钩:在传输和接收路径上插入处理逻辑
  • DMA 访问:直接读写主机内存中的数据

例如,实现一个简单的数据包计数器:

module custom_packet_counter (
    input wire clk,
    input wire rst,
    // AXI Stream接口
    input wire [DATA_WIDTH-1:0] s_axis_tdata,
    input wire s_axis_tvalid,
    output wire s_axis_tready,
    // 控制寄存器接口
    input wire [31:0] control_reg,
    output wire [31:0] status_reg
);
    // 实现逻辑
endmodule

2. 调度器定制

对于需要特定调度策略的应用,可以定制传输调度器。Corundum 的架构允许完全替换调度器模块,开发者可以实现:

  • 优先级调度:基于数据包类型或流标识的优先级调度
  • 时间感知调度:结合 PTP 时钟的精确时间调度
  • 拥塞感知调度:基于网络拥塞状态的动态调度

3. 引擎修改

对于更深入的数据包处理,可以修改传输或接收引擎。例如,在接收引擎中添加数据包解析逻辑,或者在传输引擎中实现数据包修改功能。

工程实践与部署考虑

硬件平台支持

Corundum 支持广泛的 FPGA 平台,包括 Xilinx 和 Intel 的多个系列:

  • Xilinx:Virtex UltraScale+、Kintex UltraScale、Zynq UltraScale+、Alveo 系列
  • Intel:Stratix 10、Agilex 系列

对于 100G 操作,在 Xilinx UltraScale + 设备上需要使用 Xilinx CMAC 核心和 RS-FEC,这受限于免费的 CMAC 许可证。10G 和 25G 操作则可以使用开源的 10G/25G MAC 和 PHY 模块,无需额外许可证。

开发工具链

Corundum 的开发基于标准的 FPGA 工具链:

  • 仿真:使用 cocotb 框架,配合 cocotbext-axi、cocotbext-eth、cocotbext-pcie 等扩展
  • 综合与实现:使用 Vivado(Xilinx)或 Quartus(Intel)
  • 驱动程序:Linux 内核驱动程序,支持与标准网络栈集成

性能优化参数

在部署 Corundum 进行 in-network 计算时,需要考虑以下关键参数:

  1. 队列深度:根据应用需求调整队列深度,平衡延迟和吞吐量
  2. DMA 缓冲区大小:优化 DMA 缓冲区大小以减少小数据包的开销
  3. 时钟频率:PCIe 用户时钟域通常运行在 250MHz,需要确保时序收敛
  4. 资源利用率:监控 FPGA 资源使用(LUT、FF、BRAM、DSP)

监控与调试

Corundum 提供了丰富的统计和监控功能:

  • 统计收集器stats_collect):可参数化的增量输入,用于累积计数
  • 统计计数器stats_counter):通过 AXI Lite 访问的块 RAM 统计
  • DMA 延迟测量stats_dma_if_latency):测量 DMA 操作延迟
  • PCIe TLP 统计stats_pcie_tlp):提取 TLP 级统计信息

应用场景与未来展望

Corundum 的可编程架构使其适用于多种 in-network 计算场景:

1. 金融交易系统

在高频交易环境中,微秒级的延迟差异可能决定交易的成败。Corundum 的 TDMA 调度和 PTP 时间同步能力可以实现纳秒级的时间精度,配合自定义的交易逻辑处理,大幅降低交易延迟。

2. 科学计算与 HPC

在大规模科学计算中,节点间的通信开销往往成为性能瓶颈。通过在 Corundum 上实现自定义的通信协议或集合操作,可以减少主机 CPU 的参与,提升整体系统效率。

3. 边缘计算与 IoT

在边缘计算场景中,网络设备需要实时处理大量传感器数据。Corundum 的数据包处理能力可以用于数据过滤、聚合和预处理,减少上传到云端的数据量。

4. 网络安全

实现实时的入侵检测和防御,在数据包进入主机前进行深度包检测和过滤。

未来,随着 FPGA 技术的不断发展,Corundum 架构有望进一步演进:

  • 更高带宽支持:向 200G/400G 以太网演进
  • 更紧密的 CPU 集成:与 CXL(Compute Express Link)等新互连技术结合
  • AI 加速集成:在 NIC 中集成 AI 推理引擎,实现智能网络处理
  • 云原生支持:更好的容器化和虚拟化支持

总结

Corundum 作为开源 FPGA NIC 平台,其硬件架构为 in-network 计算提供了强大的可编程基础。通过分层模块化设计、灵活的队列管理、可替换的调度器以及专门的应用区块,Corundum 使得开发者能够在网络数据路径上实现自定义的处理逻辑。虽然 FPGA 开发的门槛相对较高,但 Corundum 的完整工具链和丰富文档降低了入门难度。

对于寻求网络性能突破的开发者而言,Corundum 不仅是一个高性能 NIC 实现,更是一个探索 in-network 计算可能性的实验平台。随着网络应用对延迟和吞吐量要求的不断提高,基于 FPGA 的智能 NIC 将在未来数据中心架构中扮演越来越重要的角色,而 Corundum 这样的开源项目将为这一演进提供关键的技术基础。

资料来源:

查看归档