nv_hsb_ip 中的 RoCEv2 包结构与链路类型分析
基于fpga/nv_hsb_ip实际 RTL 代码分析dp_pkt/dp_pkt_top.sv数据面包头构造roce/roce_ack.svRC 响应端可选roce/roce_icrc.svICRC 计算rx_parser/rx_parser_pkg.sv/rx_parser/rx_parser.sv头部解析结构体一、RoCEv2 包结构1. 整体帧格式传感器 → 主机数据面dp_pkt_top.sv中hdr_roce构造代码位置dp_pkt/dp_pkt_top.svL1148-1163ROCE_HDR_WIDTH 224 336 560 bit 70 Byte0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ┌───────────────────────────────────────────────────────────────┐ ─┐ │ Destination MAC (hif_mac_addr, 6B) │ │ ├──────────────────────────────┬────────────────────────────────┤ │ │ Source MAC (前4B) │ Source MAC (后2B) │ │ Ethernet ├──────────────────────────────┴────────────────────────────────┤ │ 14B │ EtherType 0x0800 (IPv4) │ Ver4/IHL5 │ DSCP/ECN│ │ ├───────────────────────────────────────┴───────────┬───────────┤ ─┘ │ IP Total Len dma_len60(64带Imm) │ ID0 │FlgDF/Frag│ ─┐ ├───────────┬───────────┬───────────────────────────┴───────────┤ │ │ TTL0x40 │ Proto0x11│ IP Header Checksum (RTL实时计算) │ │ IPv4 ├───────────────────────────────┬───────────────────────────────┤ │ 20B │ Source IP Address │ Destination IP Address │ │ ├───────────────────────────────┼───────────────────────────────┤ ─┘ │ UDP Src Port (寄存器可配) │ UDP Dst Port 0x12B7 (4791) │ ─┐ UDP ├───────────────────────────────┼───────────────────────────────┤ │ 8B │ UDP Length dma_len40(44) │ UDP Checksum 0 (不用) │ ─┘ ├───────┬───────┬───────────────┴───────┬───────────────────────┤ ─┐ │Opcode │SE/M/P/│ P_Key 0xFFFF │ Rsvd │ Dest QP(24b) │ │ │0x2A/2B│ TVer │ │ │ (高16b) │ │ BTH ├───────┴───┬───┴───────────┬───────────┴───────┬───────────────┤ │ 12B │ DestQP低8b│ AckReq0/Rsvd │ PSN (24b, 每QP递增计数器) │ │ ├───────────┴───────────────┴───────────────────┴───────────────┤ ─┘ │ RETH: Virtual Address (64b, GPU显存地址) │ ─┐ ├───────────────────────────────────────┬───────────────────────┤ │ RETH │ RETH: R_Key (32b) │ DMA Length {16h0, │ │ 16B │ │ dma_len(16b)} │ │ ├───────────────────────────────────────┴───────────────────────┤ ─┘ │ [ImmDt 4B] 仅 opcode0x2B: {PSN[23:0], 6h0, buf_ptr[1:0]} │ ─┐ 可选 ├───────────────────────────────────────────────────────────────┤ │ │ [Metadata 48B] 带Imm包: md_flags/PSN/frame_crc/SOF_PTP/ │ │ (记入 │ buf_addr/frame_num/当前PTP时间戳 │ │ dma_len) ├───────────────────────────────────────────────────────────────┤ │ │ │ │ │ Sensor Payload (图像/传感器数据, ≤MTU) │ │ │ │ │ ├───────────────────────────────────────────────────────────────┤ ─┘ │ ICRC (4B, Invariant CRC-32, roce_icrc.sv 计算) │ └───────────────────────────────────────────────────────────────┘ (最后由 MAC 再追加以太网 FCS 4B)2. 关键字段说明字段值/来源说明EtherType16h0800IPv4IP Protocol8h11(17)UDPUDP Dst Port0x12B74791RoCEv2 标准端口roce_ack.svL493 注释确认UDP Checksum16h0RoCEv2 允许置 0Opcode8h2A/8h2B见第二节SE/MigReq/PadCnt/TVer全 0无请求应答事件、无迁移、无填充P_Key16hFFFF默认分区Dest QProce_dest_qp寄存器配置每路 sensor 一个 QPAckReq0不要求对端回 ACKPSN每 QP 24bit 计数器dp_pkt_top.svL408/418普通包每包 1同时被 host 软件用于丢包检测RETH VA{roce_buf_fixed_msb, vaddr7}GPU 显存目标地址环形 buffer 翻页RETH R_Key寄存器配置host 注册内存时下发DMA Length{16h0, dma_len}含 metadata payloadICRCroce_icrc.sv按 RoCE 规范把 TOS/TTL/IP校验和/UDP校验和/BTH F/B 位掩码为全 1 后做 CRC-32Invariant CRC带 Immediate 的包hdr_type2b10帧尾/元数据上报用在 RETH 后依次插入ImmDt 4B{psn[19:0], buf_ptr[11:0]}BUFFER_4K_REG模式——把数据写到哪个 buffer随包通知 hostMetadata 48B384bitdp_pkt_top.svL1303wr_imm_data {md_flags, 8h0, psn, frame_crc, 16h0, sof_ptp, roce_val_addr, 16h0, frame_num, 16h0, cur_ptp};即帧 CRC、SOF/当前 PTP 时间戳、帧号、buffer 地址等。BTH 结构体定义rx_parser/rx_parser_pkg.svL67-75typedef struct { logic [7:0] opcode; // 操作码 logic [7:0] s_m_pad_tver; // SE | MigReq | PadCnt | TVer logic [15:0] pkey; // P_Key logic [7:0] f_b_rsv6; // F/B/Rsvd6 logic [23:0] dest_qp; // Destination QP logic [7:0] a_rsv7; // AckReq | Rsvd7 logic [23:0] psn; // Packet Sequence Number } bth_hdr;二、链路类型不是 RC数据面是 UCUnreliable Connection判定依据IB/RoCE opcode 编码规则opcode[7:4] 区分传输类型0x0RC0x2UC。dp_pkt_top.svL1146assign opcode (pkt_is_imm || is_data_wr_imm) ? 8h2B : 8h2A;对照 IB 规范 opcode 表Opcode含义传输类型0x0A / 0x0BRDMA Write Only / Write Only w/ ImmRC未采用0x2A / 0x2BRDMA Write Only / Write Only w/ ImmUC本设计采用代码自身定义印证roce_ack.svL92-93localparam BTH_UC 4h2; // opcode[7:4] 2 → UC localparam BTH_RC 4h0; // opcode[7:4] 0 → RC为什么是 UC 而不是 RC单向高吞吐图像流FPGA 只做 RDMA Write 把传感器数据直接写进 GPU 显存环形 buffer不需要对端回 ACKBTH 中AckReq0、Solicited Event0FPGA 侧没有任何等待/处理 ACK 的逻辑可靠性由上层保证PSN ImmDt 中的 buf_ptr Metadataframe_crc、帧号、PTP 时间戳随包带给 NVIDIA host 软件由软件检测丢包/乱序而不是 IB 硬件重传无需建立 QP 连接状态机无 CM/handshakeFPGA 上电配好寄存器dest_qp、rkey、buffer 地址即可发包。补充RX 方向有可选的 RC 响应端下行host → sensor 的寄存器写在定义了ifdef SIF_TX_ROCE_RC_ENABLEHOLOLINK_top.svL377时FPGA 通过roce/roce_ack.sv扮演RC ResponderHost (RC Requester) FPGA (RC Responder) │ RDMA Write/Send (opcode[7:4]0x0) │ │──────────────────────────────────▶│ roce_ack.sv: 每QP跟踪 ePSN (L307) │ │ 乱序→丢弃/NAK, 重复→丢弃 │ ACK: opcode0x11 AETH(4B) │ │◀──────────────────────────────────│ AETH {syndrome, MSN} │ ETHIPUDPBTH(12B)AETHICRC │ syndrome: 0x00ACK(credit disable) │ │ 0x20RNR NAK / 0x60NAK seq err即roce_ack.sv只对RC 入向包opcode[7:4]BTH_RCL234/358/367生成 ACKNOWLEDGE 响应包ETHIPv4UDPBTHAETHICRCL482-500支持 PSN 检查、RNR NAK、错误注入测试。三、总结方向模块包格式传输类型Sensor→Host图像数据上行dp_pkt/dp_pkt_top.svETHIPv4UDP(4791)BTHRETH[ImmDtMetadata]PayloadICRCUC RDMA Write Only (0x2A/0x2B)Host→Sensor控制下行可选roce/roce_ack.sv应答包 ETHIPv4UDPBTH(opcode 0x11)AETHICRCRC仅作 responder 回 ACK/NAK/RNR核心结论nv_hsb_ip 数据面的 RoCEv2 是 UCUnreliable Connection类型的 RDMA Write带可选 Immediate不是 RCRC 只作为可选编译项SIF_TX_ROCE_RC_ENABLE用于下行的 ACK 响应。这符合 Holoscan Sensor Bridge 的设计哲学——传感器数据流用无连接、无重传的 UC 达到最低时延可靠性检测上移到 host 软件。2. LA 数据读取是否需要 GUI Vivado结论先行不需要。本pynq/rfsoc-pynq工程中的 “ILA” 是 NVIDIA 自研的s_apb_ilaAPB 寄存器 片上捕获 RAM不是 Xilinx ILA IP core运行阶段用 Python 经以太网控制面读取即可完全不需要 VivadoGUI/batch 都不需要即便是一般项目中真正的 Xilinx ILA core也不必须 GUI——可用免费的 Vivado Lab Edition hw_server Tcl 脚本在纯命令行/批处理模式经 JTAG 抓取数据见本文第四节。一、本工程里的 “ILA” 是自研 APB 模块pynq/rfsoc-pynq/rtl/top/FPGA_top.sv中例化的两个 ILA 均为nv_hsb_ip/lib_apb/s_apb_ila.svAPB 从机 片上 RAM非 XilinxilaIP实例挂载数据宽度/深度捕获内容触发/写使能u_apb_ilaapb_psel[2]256bit × 512PTP 时间戳、frame_cnt、sof/eof、标记0x123456789ABCDEF、计数器triggersofu_apb_sif_ilaapb_psel[3]585bit × 512整拍 AXIStdata[511:0]tvalidtlasttkeep 计数PTP sec/nsecwr_ensif_tx_axis_tvalid[0]工作机制s_apb_ila.svFSMILA_IDLE → ILA_CAPTURE → ILA_DONE写ctrl_reg[0].bit0 1trigger_en启动捕获等待i_trigger随后每个i_wr_en采样一个数据写入 RAMs_apb_ram_dyn采满DEPTH512个样本后置fsm_done1通过 APB 读 RAM 窗口取出数据。二、访问通道以太网控制面不经过 PS/JTAG该设计为PL-onlybuild/ip/bd_gen.tcl中只有 CMAC clk_wiz寄存器通路不含 Zynq PSILA 挂在HOLOLINK_top的User Reg APB 接口o_apb_psel/paddr/...上其 APB 主机来自内部u_apb_intcAPB 互连master 是ECB以太网控制桥——host 通过UDP 寄存器读写包Holoscan Sensor Bridge 标准控制协议访问因此在 PYNQ或任何能连通板卡的 PC上用PythonNVIDIA hololink 库 / socket 发 UDP 控制包即可 dump ILA 数据PYNQ 框架本身只负责加载 bitstream。三、s_apb_ila寄存器/存储器映射与读出流程基址 该 psel 实例的 User Reg 地址由 Hololink 枚举/寄存器映射决定模块内部偏移偏移名称含义0x00ctrl_reg[0]bit0 trigger_enbit1 ila_rst清 RAM0x04ctrl_reg[1]通用输出o_ctrl_reg0x08stat_reg[0]bit0 fsm_busybit1 fsm_donebit2 i_trigger 状态0x0Cstat_reg[1]当前 sample_addr1 W_OFSETRAM 窗口见下RAM 窗口基址W_OFSET clog2(DEPTH) clog2(ceil(W_DATA/32)) 2ILA#1u_apb_ila256bitW_OFSET 932 14→ RAM 在偏移0x4000512 样本 × 8 个 32bit 字样本i第k字地址 0x4000 (i*8k)*4ILA#2u_apb_sif_ila585bitW_OFSET 952 16→ RAM 在偏移0x10000512 样本 × 19 个有效 32bit 字步长 32 字。读出流程写 [base0x00] 0x1 # trigger_en 1 轮询 [base0x08] 直到 bit11 # 等待 fsm_done 读 RAM 窗口 512 个样本 写 [base0x00] 0x0 # 回 IDLE或 bit11 清 RAM 重采 Python 解析/绘图四、通用情况真正的 Xilinx ILA无 GUI 的 JTAG/Tcl 读法即便设计中例化了 Xilinx ILA core也不需要 Vivado GUI。可用Vivado Lab Edition免费无需 license的硬件服务器 Tcl 全流程命令行完成1. 启动 hw_server板卡 JTAG 所连机器上hw_server# 默认监听 3121也可由 Tcl 内 connect_hw_server -url localhost:3121 自动拉起2. Tcl 抓取脚本read_ila.tcl# ---- 连接 ---- open_hw_manager connect_hw_server -url localhost:3121 open_hw_target ;# 或: open_hw_target -jtag_mode ... # 选择器件按实际 JTAG 链上的器件名如 xczu48dr_0 / xcku060_0 set dev [lindex [get_hw_devices] 0] current_hw_device $dev refresh_hw_device $dev # ---- 关联探针文件 (.ltx由 write_debug_probes 生成若已随 bitstream 关联可省略) ---- set_property PROBES.FILE {design.ltx} $dev set_property FULL_PROBES.FILE {design.ltx} $dev # 若需先下载: program_hw_devices $dev # ---- 配置 ILA ---- set ila [lindex [get_hw_ilas -of_objects $dev] 0] set_property CONTROL.TRIGGER_POSITION 256 $ila ;# 触发点在窗口中的位置 set_property CONTROL.WINDOW_COUNT 1 $ila set_property CONTROL.DATA_DEPTH 512 $ila # 触发条件示例probe sof 1 set_property TRIGGER_COMPARE_VALUE eq1b1 [get_hw_probes sof -of_objects $ila] # ---- 布防并等待触发 ---- run_hw_ila $ila wait_on_hw_ila $ila ;# 阻塞直到触发完成可加 -timeout # ---- 上传 导出 ---- set data [upload_hw_ila_data $ila] current_hw_ila_data $data write_hw_ila_data -csv_file ila_capture.csv $data # 也可直接读属性: report_property $data # ---- 收尾 ---- close_hw_target disconnect_hw_server close_hw_manager3. 批处理运行vivado-modebatch-sourceread_ila.tcl# 或用 Lab Edition:# vivado_lab -mode batch -source read_ila.tcl要点GUI 从来不是必须的GUIHardware Manager只是交互最方便的方式无 GUI 时必需的两样JTAG 连接本地或远程hw_server 免费的 Vivado Lab Edition 运行时.ltx探针文件在实现阶段用write_debug_probes生成离线分析Python/pandas 读 CSV不依赖任何 Vivado本仓库的替代方案s_apb_ila走以太网寄存器面进一步连 JTAG 和 Lab Edition 都省掉了更适合 PYNQ 这类无头headless远程调试场景。五、总结场景是否需要 GUI Vivado需要什么本 pynq 工程s_apb_ila否连 Vivado 都不需要Python 以太网Hololink 寄存器协议一般 Xilinx ILA交互调试否GUI 可选Vivado Lab Edition JTAG Tcl 批处理一般 Xilinx ILA完全脚本化否vivado_lab -mode batch -source xxx.tcl CSV 离线分析
上一篇/下一篇内容由系统自动关联
返回资讯列表 →