1.主要结构
根据对 fpga/ 目录下代码的深入分析,该目录包含的是 Holoscan Sensor Bridge (HSB) 的 FPGA 核心 IP 及参考设计,其主要功能可以概括为:将各类传感器数据通过 FPGA 采集、封装为网络数据包,并以极低延迟通过以太网(RoCE/UDP)传输到主机 GPU 内存,同时提供精确时间同步(PTP)和完整的控制通路。
以下是代码的主要功能模块分析:
1.1. 核心 IP (nv_hsb_ip/) --- Holosink 桥接逻辑
这是 NVIDIA 设计的通用 FPGA IP 核,不依赖特定厂商,是整个项目的核心。
顶层集成 (top/HOLOLINK_top.sv)
- 系统的顶层模块,整合所有子系统。
- 定义了清晰的接口边界:传感器接口 (Sensor IF)、主机网络接口 (Host IF)、外设控制接口 (SPI/I2C/UART/GPIO)、PTP 时钟接口。
- 通过 APB 总线互联 (apb_intc_top) 管理所有寄存器配置。
数据包接收与解析 (rx_parser/)
- rx_parser.sv:解析从主机接收到的以太网包。
- 支持识别多种协议:UDP 控制包 (ECB)、RoCE 数据包 (BTH 头解析)、ARP、ICMP (Ping)、PTP 同步消息、传感器回传数据 (STX)。
- 将解析后的控制流导向对应的低速控制通路,数据流则转发给传感器发送接口。
传感器数据包化 (packetizer/)
- packetizer_top.sv:负责将原始传感器数据(如 MIPI CSI 输出的视频流)进行重排序、虚拟通道 (Virtual Port) 分配、打包。
- 支持动态虚拟通道 (DYNAMIC_VP)、混合数据包大小 (MIXED_VP_SIZE),可将多路传感器数据复用到一个数据流中。
- 生成帧起始 (SOF) 信号,用于后续打时间戳。
数据平面网络封装 (dp_pkt/)
- dp_pkt_top.sv:这是数据通路的核心网络封包模块。
- 功能极其关键:它将传感器数据封装成 RoCE v2 (RDMA over Converged Ethernet) 或 UDP 数据包。
- 自动生成完整的网络协议头:以太网头 (Ethernet)、IPv4 头 (含校验和计算)、UDP 头、RoCE BTH 头、以及可选的 CoE (Camera over Ethernet) 头。
- 支持 Write Immediate 操作,使 Mellanox/NVIDIA ConnectX 网卡能直接将数据写入 GPU 显存。
- 内含状态机 (ROCE_IDLE -> ROCE_LOAD_STS -> ROCE_GRANT 等) 管理缓冲区地址计算、包序号 (PSN)、CRC 校验。
以太网发送仲裁 (eth_pkt/)
- eth_pkt.sv:一个多端口仲裁器,将多个数据源(数据平面 Data Plane、PTP 包、低速控制包 ARP/ICMP、Bridge 包、Pause 帧)按优先级合并到单个以太网 MAC 发送接口。
- 使用 Skid Buffer 优化高速数据路径时序。
精确时间同步 (ptp/)
- ptp_top.sv:完整的 IEEE 1588 / gPTP (IEEE 802.1AS) 硬件协议栈实现。
- 包含子模块:
- ptp_ingress / ptp_egress:PTP 报文的收发接口。
- ptp_parser:解析 Sync、Follow_Up、Delay_Resp、Pdelay 等消息类型。
- ptp_timer:维护硬件时钟(秒 + 纳秒 + 分数纳秒)。
- ptp_sync / ptp_dly:计算时钟偏移 (offset) 和链路延迟 (delay)。
- ptp_calc / dpll:数字锁相环,根据 PTP 计算结果调整本地时钟频率。
- 输出 PPS (Pulse Per Second) 信号和精确时间戳,用于多传感器同步。
传感器外设接口 (sensors/)
- i2s/:I2S 音频接口控制器,支持 8K~192KHz 采样率、多种位深和数据格式,提供 AXI-Stream 主/从接口。
- imu/:IMU(惯性测量单元)接口,通过 I2C 读取数据,并为每个采样附加 64位 PTP 时间戳。
系统与外设控制
- sys_init/:上电初始化序列,从 EEPROM 读取 MAC 地址、IP 地址、板卡序列号等。
- glb_ctrl/:全局控制寄存器(版本号、GPIO 方向、软件复位)。
- uart/ / lib_apb/ / lib_axis/:UART 控制器、APB 总线基础设施、AXI-Stream 工具库(FIFO、Gearbox、Arbiter 等)。
1.2. 厂商特定参考设计
Microchip PolarFire (microchip/mfp200-eth-sensor-bridge/)
- 针对 Microchip Holoscan Sensor Bridge 评估板(IMX477 相机)。
- PF_ESB_top.v:顶层框图实例化,包含:
- IMX477_IF_TOP:MIPI CSI-2 接收接口,将相机数据转为 AXI-Stream。
- MAC_Hololink:集成 HSB IP 核和以太网 MAC/PHY (SGMII)。
- 支持双路相机输入 (CAM1/CAM2)。
Lattice CertusPro-NX (lattice/cpnx100-eth-sensor-bridge/)
- 针对 Lattice Holoscan Sensor Bridge 评估板(IMX274 相机)。
- 包含 cpnx100(主 FPGA)和 clnx17(辅助 FPGA/桥接芯片)两个子目录。
- 包含 MIPI CSI-2 接收、LVDS 发送、时钟复位管理、SPI 外设控制等 RTL。
- 提供基于 Lattice Radiant 的完整编译脚本 (build.sh)。
1.3. 配置脚本 (script/)
- eeprom/eeprom_utility.py:用于烧录/读取板载 EEPROM 的工具,存储 MAC 地址、IP 配置、板卡版本等信息。
1.4. 总结
fpga/ 中的代码本质上实现了一个智能传感器网络桥接器:
- 输入侧:通过 MIPI CSI、I2S、I2C 等物理接口接收传感器原始数据。
- 处理侧:在 FPGA 内完成数据重排、时间戳标记、RoCE/UDP 协议封装。
- 输出侧:通过高速以太网直接发送到主机,利用 NVIDIA ConnectX 网卡的 GPUDirect RDMA 能力,绕过 CPU 将数据直接写入 GPU 显存。
- 控制侧:通过 APB 寄存器、EEPROM 和低速网络包管理设备配置与固件升级。
- 同步侧:通过硬件 PTP/gPTP 协议栈实现亚微秒级的时间同步,保证多传感器数据的时间一致性。
这是 Holoscan 平台实现零拷贝 (Zero-Copy)、低延迟传感器到 GPU 数据传输的关键硬件基础。
2. 关于 RoCE 协议的实现
RoCE 协议的封装和解析是在这些 Verilog 代码中实现的。
以下是具体的代码证据:
2.1. RoCE 数据包发送封装 (dp_pkt_top.sv)
在 fpga/nv_hsb_ip/dp_pkt/dp_pkt_top.sv 中,FPGA 将传感器数据封装为 RoCE v2 数据包:
-
RoCE 头生成:代码中定义了完整的 hdr_roce 信号,包含:
- 以太网头 (14B)
- IPv4 头 (20B,含动态校验和计算)
- UDP 头 (8B)
- RoCE BTH 头 (12B):包括 opcode、dest_qp、psn 等字段
-
Write Immediate 支持:
assign opcode = (pkt_is_imm || is_data_wr_imm) ? 8'h2B : 8'h2A;
- 8'h2A = UC SEND ONLY(普通 RoCE 写操作)
- 8'h2B = UC SEND ONLY WITH IMMEDIATE(带 Immediate 的写操作,使 ConnectX 网卡可以直接将数据写入 GPU 显存)
-
地址与序列号管理:
- roce_dest_qp:目标 Queue Pair
- psn:Packet Sequence Number
- roce_vaddr / rkey:远程虚拟地址和 RDMA Key
- roce_buf_len / roce_buf_start:管理 GPU 环形缓冲区地址
2.2. RoCE 数据包接收解析 (rx_parser.sv)
在 fpga/nv_hsb_ip/rx_parser/rx_parser.sv 中,FPGA 解析从主机接收到的 RoCE 包:
-
BTH 头解析:
assign bth_hdr_i.opcode = hdr_array42;
assign bth_hdr_i.dest_qp = {hdr_array47, hdr_array48, hdr_array49};
assign bth_hdr_i.psn = {hdr_array51, hdr_array52, hdr_array53};
-
Opcode 匹配:检查是否为有效的 BTH 发送操作
assign bth_tx_opcode_match = (bth_hdr_i.opcode inside {
BTH_UC_SEND_LAST, BTH_UC_SEND_MIDDLE, BTH_UC_SEND_FIRST, BTH_UC_SEND_ONLY
});
-
Dest QP 匹配:验证目标 QP 地址,将 RoCE 控制包路由到正确的处理通路
assign roce_ecb_dest_qp_match = (bth_hdr_i.dest_qp == cfg_roce_ecb_dest_qp);
2.3. 状态机管理 RoCE 传输流程 (dp_pkt_top.sv)
dp_pkt_top.sv 中有一个显式的 RoCE 状态机,管理整个 RDMA 传输流程:
typedef enum logic 3:0 {
ROCE_IDLE, // 等待传感器数据请求
ROCE_LOAD_STS, // 读取状态 RAM
ROCE_GRANT, // 授权传输
ROCE_CALC, // 计算下一包地址/长度/PSN
ROCE_STORE, // 存储状态
ROCE_WR_IMM, // 写 Immediate 数据
ROCE_HDR_WAIT // 等待头部发送完成
} roce_fsm_t;
2.4. 总结
这些 Verilog 代码完整实现了 RoCE 协议栈中 FPGA 侧所需的功能:
- 发送侧:将传感器数据打包成 RoCE 报文(Eth + IP + UDP + BTH),支持 RDMA Write Immediate,直接写入 GPU 显存。
- 接收侧:解析 RoCE BTH 头,提取 QP、PSN、Opcode,实现对主机 RDMA 控制命令的接收。
这正是 Holoscan Sensor Bridge 实现 零拷贝 (Zero-Copy)、绕过 CPU 的低延迟传感器到 GPU 传输 的核心硬件逻辑。