FPGA (QSFP28 + CMAC US+ RoCEv2) 与 Ubuntu22 + Mellanox 网卡直连分析

📅 2026/7/25 19:31:43
FPGA (QSFP28 + CMAC US+ RoCEv2) 与 Ubuntu22 + Mellanox 网卡直连分析
项目本质这是Holoscan Sensor Bridge的vitis/xcku5p参考设计基于Xilinx Kintex UltraScale器件通过QSFP28 CMAC US实现100GbE并在其上搭建了一套简化/定制的 RoCEv2 协议栈用于低延迟传感器数据直写主机或 GPU内存。如果直接 program 进 FPGA 并与 Ubuntu22 Mellanox 网卡光纤直连会发生什么1. 物理层与链路层大概率会 UPeth_100gb_top.sv中有一个 CMAC 初始化状态机上电后先进入IDLE然后发送RFI (Remote Fault Indication)检测到对端stat_rx_aligned后才会真正使能 TX (ctl_tx_enable)如果光模块、光纤速率匹配100G且参考时钟 (ETH_REFCLK_P/N, 156.25MHz) 正常链路会在几秒后建立Mellanox 网卡侧ethtool会看到Link detected: yes速率 100Gbps。2. FPGA 会立刻开始发包在FPGA_top.sv中数据输入端接的是一个ram_player测试数据生成器而不是真实传感器。初始化完成后init_done它会立刻通过sif_rx向协议栈灌数据。这意味着FPGA 会立即开始发送 RoCEv2 数据包到主机不会等待主机握手。主机 Mellanox 网卡会立刻收到流量。3. 主机侧大概率会静默丢包如果未配置dp_pkt_top.sv中生成的 RoCE 包特征如下Opcode 是0x2A或0x2B0x2AUC (Unreliable Connected) RDMA WRITE ONLY0x2BUC RDMA WRITE ONLY With Immediate这是单向喷射模式FPGA不等待 ACK、不重传。数据包内包含 Dest QP、R_Key、Virtual Address、PSN 等字段。如果主机侧没有预先通过 Verbs API 创建对应的UC QP、注册MR (Memory Region)、并把正确的R_Key/Dest QP/Buf Addr/PSN配置到 FPGA 的寄存器里Mellanox 网卡收到后会因为非法 QP 或 R_Key 不匹配而在硬件层面直接丢弃这些包。你的ifconfig计数器可能会看到rx_errors增长但不一定有明显日志。核心协议特点从代码看方向模式行为FPGA - Host (TX)UC (不可靠连接)单向 RDMA WRITE无 ACK无重传追求最低延迟Host - FPGA (RX)RC (可靠连接)FPGA 内部roce_ack.sv会检查 PSN生成 ACK / NAK / RNR NAK 回给主机ICRC硬件计算roce_icrc.sv在发送路径末尾自动附加 RoCE Invariant CRC直连注意事项一、物理与光模块层光模块必须匹配确保是 100G QSFP28SR4/LR4/CR4 等且光纤类型单模/多模与模块匹配。DAC 线缆兼容性如果用高速铜缆直连要确保 XCKU5P 板卡和 Mellanox 网卡都支持该 DAC 的电气特性。参考时钟ETH_REFCLK_P/N必须提供稳定的 156.25MHz 差分时钟否则 CMAC 无法锁定。光纤极性100G SR4/LR4 等并行的要注意极性直连通常用直通而非交叉。二、网络基础配置FPGA 侧默认参数MAC 地址CA:C0:FF:EE:00:00(48hCAFEC0FFEE00)IP/UDP需通过 APB 寄存器或初始化逻辑配置。roce_ack.sv中默认 RoCE UDP 端口对应16h12B7(4791标准 RoCEv2 端口)。你必须确保FPGA 与 Mellanox 网卡处于同一子网或配置好静态路由。如果中间无交换机直连通常建议用/30 或 /31 小网段或配置为主机端网卡promisc / 接受任意目的 MAC因为 FPGA 可能不是发到主机网卡 MAC而是某个预配的多播或特定 MAC。三、RoCEv2 关键参数必须严格匹配FPGA 发送 RoCE 数据时以下字段全部来自dp_pkt_top.sv中的Config RAM通过 APB 配置roce_dest_qp主机接收 QP 号rkey主机内存注册密钥roce_buf_start/roce_buf_len/roce_buf_mask主机内存缓冲区地址与轮转psnPacket Sequence Number初始值host_mac/host_ip/host_udp_port主机侧必须用ibv_create_qp创建一个Unreliable Connected (UC)QP并把 QP Number 配给 FPGA。用ibv_reg_mr注册内存把返回的rkey和虚拟地址vaddr配给 FPGA。PSN 必须双方一致通常从 0 开始。四、Ubuntu 22 Mellanox (ConnectX) 主机配置驱动必须安装MLNX_OFED或确保内核自带的mlx5_ib/mlx5_core驱动已加载。RoCEv2 模式rdmalinkshow ibdev2netdev确认网卡工作在RoCEv2模式而非 IB 或 Ethernet 纯模式。QoS / PFC虽然直连可以暂时不配置 PFC但如果后续要跑满 100G 且追求无损需要配置网卡的Priority Flow Control (PFC)和ECN。否则丢包由上层应用承担因为是 UC 模式。防火墙Ubuntu 的ufw或iptables通常不拦截 RoCEv2它在网卡硬件层处理 RDMA不经过内核网络栈但基础 IP/ARP 互通仍需确认。测试工具先用ib_write_bw/ib_send_bw等perftest工具验证主机侧基本 RDMA 功能正常再对接 FPGA。五、FPGA 接收路径Host - FPGA如果主机需要发控制命令到 FPGAFPGA 的rx_parser支持解析 RC 模式的SEND/WRITE。roce_ack.sv会检查 PSN 顺序丢包/乱包时回NAK正常包回ACK(AETH Syndrome0x0)支持RNR NAK当i_stx_ready为低且enable_rnr使能时主机侧发向 FPGA 时应创建 RC QP并确保 FPGA 侧通过 APB 把对应 QP 的Host QP 号和RNR Timer写进u_host_qp_ram。六、调试建议先看链路在主机端ethtool dev确认Link detected: yes和 Speed 100000Mb/s。再看计数器Mellanox 网卡有很多 RDMA 硬件计数器ethtool -S dev关注rx_discards、out_of_sequence、rnr_nak等。抓包如果网卡支持tcpdump -i dev udp port 4791能看到 RoCEv2 over UDP 的包确认 FPGA 确实在发包且目的 IP/Port 正确。FPGA ILAFPGA_top.sv里已经实例了s_apb_ila可以通过 Vivado 抓hif_tx/rx或sif_tx的总线信号确认数据是否发出。总结光插上去后物理层大概率能 UPFPGA 会立即通过 UC RDMA WRITE 向 Mellanox 网卡“单向喷射”测试数据但如果主机侧没有预先创建好匹配的 UC QP、MR并把 R_Key/QP/地址等参数配回 FPGA这些数据会被网卡硬件静默丢弃看起来像“通了但没数据”。直连时要特别注意光模块兼容、IP/MAC 互通、以及 RoCEv2 两端 QP/PSN/R_Key 的严格一致性。