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. 物理层与链路层:大概率会 UP

eth_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 或 0x2B :
    • 0x2A = UC (Unreliable Connected) RDMA WRITE ONLY
    • 0x2B = UC 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

直连注意事项

一、物理与光模块层

  1. 光模块必须匹配:确保是 100G QSFP28(SR4/LR4/CR4 等),且光纤类型(单模/多模)与模块匹配。
  2. DAC 线缆兼容性:如果用高速铜缆直连,要确保 XCKU5P 板卡和 Mellanox 网卡都支持该 DAC 的电气特性。
  3. 参考时钟 :ETH_REFCLK_P/N 必须提供稳定的 156.25MHz 差分时钟,否则 CMAC 无法锁定。
  4. 光纤极性:100G SR4/LR4 等并行的要注意极性(直连通常用直通,而非交叉)。

二、网络基础配置

FPGA 侧默认参数:

  • MAC 地址 :CA:C0:FF:EE:00:00 (48'hCAFEC0FFEE00)
  • IP/UDP :需通过 APB 寄存器或初始化逻辑配置。roce_ack.sv 中默认 RoCE UDP 端口对应 16'h12B7 (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(主机内存缓冲区地址与轮转)
  • psn(Packet 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) 主机配置

  1. 驱动 :必须安装 MLNX_OFED 或确保内核自带的 mlx5_ib / mlx5_core 驱动已加载。

  2. RoCEv2 模式 :

    bash 复制代码
    rdma link show
    ibdev2netdev

    确认网卡工作在 RoCEv2 模式(而非 IB 或 Ethernet 纯模式)。

  3. QoS / PFC :虽然直连可以暂时不配置 PFC,但如果后续要跑满 100G 且追求无损,需要配置网卡的 Priority Flow Control (PFC) 和 ECN。否则丢包由上层应用承担(因为是 UC 模式)。

  4. 防火墙 :Ubuntu 的 ufw 或 iptables 通常不拦截 RoCEv2(它在网卡硬件层处理 RDMA,不经过内核网络栈),但基础 IP/ARP 互通仍需确认。

  5. 测试工具 :先用 ib_write_bw / ib_send_bw 等 perftest 工具验证主机侧基本 RDMA 功能正常,再对接 FPGA。

五、FPGA 接收路径(Host -> FPGA)

如果主机需要发控制命令到 FPGA:

  • FPGA 的 rx_parser 支持解析 RC 模式的 SEND / WRITE。
  • roce_ack.sv 会:
    • 检查 PSN 顺序,丢包/乱包时回 NAK
    • 正常包回 ACK (AETH Syndrome 0x0)
    • 支持 RNR NAK (当 i_stx_ready 为低且 enable_rnr 使能时)
  • 主机侧发向 FPGA 时,应创建 RC QP ,并确保 FPGA 侧通过 APB 把对应 QP 的 Host QP 号 和 RNR Timer 写进 u_host_qp_ram。

六、调试建议

  1. 先看链路 :在主机端 ethtool <dev> 确认 Link detected: yes 和 Speed 100000Mb/s。
  2. 再看计数器 :Mellanox 网卡有很多 RDMA 硬件计数器(ethtool -S <dev>),关注 rx_discards、out_of_sequence、rnr_nak 等。
  3. 抓包 :如果网卡支持,tcpdump -i <dev> udp port 4791 能看到 RoCEv2 over UDP 的包,确认 FPGA 确实在发包且目的 IP/Port 正确。
  4. FPGA ILA :FPGA_top.sv 里已经实例了 s_apb_ila,可以通过 Vivado 抓 hif_tx/rx 或 sif_tx 的总线信号,确认数据是否发出。

总结

光插上去后,物理层大概率能 UP,FPGA 会立即通过 UC RDMA WRITE 向 Mellanox 网卡"单向喷射"测试数据;但如果主机侧没有预先创建好匹配的 UC QP、MR,并把 R_Key/QP/地址等参数配回 FPGA,这些数据会被网卡硬件静默丢弃,看起来像"通了但没数据"。直连时要特别注意光模块兼容、IP/MAC 互通、以及 RoCEv2 两端 QP/PSN/R_Key 的严格一致性。

相关推荐
明德扬3 小时前
FPGA MIPI 多路视频聚合方案
fpga开发·mipi视频拼接·mipi多路拼接·mipi协议·mipi视频拼接方案·fpga mipi方案·mipi csi
XMAIPC_Robot3 小时前
为什么大型储能需要边缘 AI 协调控制器?RK3588+FPGA 高速采集方案
人工智能·嵌入式硬件·fpga开发·arm+fpga·rk3588+fpga·协调控制器
szxinmai主板定制专家3 小时前
RK3576+CODESYS+RK182X+FPGA异构架构:半导体精密设备一体化控制器方案
人工智能·fpga开发·架构·rk3576+codesys
szxinmai主板定制专家3 小时前
半导体设备控制器:RK3576+CODESYS+RK182X异构架构,实现晶圆视觉检测与运动联动闭环
人工智能·fpga开发·架构·视觉检测·边缘计算·codesys·rk3576
szxinmai主板定制专家5 小时前
FPGA高速IO+RK182X AI算力|RK3576+CODESYS工业自动化运动控制平台设计
运维·人工智能·嵌入式硬件·fpga开发·自动化·zynq
FPGA小徐5 小时前
原理图分析:Type-C 转串口(CH340C)最小系统板 CSDN 博客
fpga开发
智感子5 小时前
FPGA采集:高采样率数据流与存储
fpga开发
狂奔蜗牛(bradley)21 小时前
拒绝SOEM黑盒!死磕EtherCAT主站:ARM+FPGA架构、DC同步与状态机修复等,50+篇实战开发文档全公开
arm开发·fpga开发·架构
XMAIPC_Robot1 天前
CODESYS 实时控制 + RK182X 大模型算力扩展|RK3576 工业边缘控制器设计
人工智能·fpga开发·机器人·rk3588+fpga
女神下凡1 天前
芯参谋(31):SPI NOR Flash 电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范