
问题现象在nv_hsb_ip/vitis/xcku5p/项目中对 FPGA 的 IP 地址执行ping时出现约50% 丢包。nv_hsb_ip/pynq/rfsoc-pynq/项目使用相同的网络协议栈nv_hsb_ip/但目标板卡不同。范围界定两个项目的差异仅在于项目目标 FPGA / 板卡系统时钟复位极性CMAC/网络协议栈pynqxczu48dr / RFSoC PYNQ100 MHz (period 10.000)高有效相同vitisxcku5p-ffvb676 / RK-XCKU5P-F200 MHz (period 5.000)低有效RTL 内取反相同nv_hsb_ip/中的 ARP/ICMP 回复路径、rx_parser、rx_ls_parser、arp_ping_pkt_proc、eth_pkt等模块在两个项目中完全相同因此ping 协议处理逻辑本身没有 bug已验证 IP 头部校验和不受源/目的 IP 互换影响ICMP Echo Reply 校验和调整0x0800正确。问题不是共享协议栈引入的而是vitis 项目把 200 MHz 的系统时钟直接送给了 CMAC 的init_clk。根因分析在verilog/vitis/xcku5p/rtl/top/FPGA_top.sv中IBUFDS sys_clk_inst (.O(sys_clk_100), .I(sysclk_p), .IB(sysclk_n)); BUFG init_clk_inst (.O(init_clk), .I(sys_clk_100));RK-XCKU5P-F 板载差分晶振为200 MHz而 CMAC US (cmac_usplus) 的init_clk是 GT 复位控制器的自由运行时钟设计/工具链默认期望约100 MHz。build/ip/bd_gen.tcl中也把init_clk_0的频率属性设成了约 100 MHzset init_clk_0 [create_bd_port -dir I -type clk -freq_hz 100017438 init_clk_0]把 200 MHz 直接接到init_clk会导致GT/CMAC 复位时序违规复位脉冲宽度、状态机计数按 100 MHz 设计却以 200 MHz 采样收发器链路间歇性失锁/重对齐表现为 RX 侧收到坏包axis_rx_tuser置位rx_parser将报文判为 FCS 错误并丢弃从外部看就是ping 丢包约 50%链路时好时坏。pynq 项目是否也存在这个问题不存在。pynq/rfsoc-pynq的约束使用create_clock -period 10.000100 MHzFPGA_top.sv中init_clk直接由 100 MHz 系统时钟经 BUFG 得到频率与 CMAC 期望一致因此不会出现同样的丢包。注意如果两个板卡在同一网络中使用了相同的默认 MACCA:FE:C0:FF:EE:00或默认 IP可能会产生 ARP/IP 冲突导致丢包但这与代码无关部署时应确保 MAC/IP 唯一。修复方案在 vitis 项目的FPGA_top.sv中把 200 MHz 系统时钟2 分频到 100 MHz再送给 CMACinit_clk。使用片内专用时钟分频原语BUFGCE_DIV不引入额外 MMCM/IP修改最小。修改文件verilog/vitis/xcku5p/rtl/top/FPGA_top.sv// The RK-XCKU5P-F board provides a 200 MHz differential system clock. // The CMAC/GT reset controller expects a ~100 MHz free-running init_clk, // so divide the 200 MHz board clock by 2 before driving init_clk. logic sys_clk_200, init_clk; logic [3:0] gt_powergoodout; logic gt_ref_clk_out; IBUFDS sys_clk_inst ( .O(sys_clk_200), // Buffer output (200 MHz board clock) .I(sysclk_p), // Diff_p buffer input .IB(sysclk_n) // Diff_n buffer input ); BUFGCE_DIV #( .BUFGCE_DIVIDE(2) ) u_init_clk_div ( .I (sys_clk_200), // 200 MHz input clock .CE (1b1), // Clock enable .CLR(1b0), // Synchronous clear .O (init_clk) // 100 MHz output clock for CMAC init_clk );verilog/vitis/xcku5p/build/constraints/constraints.xdc# 200 MHz System Clock (RK-XCKU5P-F on-board differential oscillator) create_clock -period 5.000 -name sysclk_p [get_ports sysclk_p] # 100 MHz CMAC init_clk generated by dividing the 200 MHz sysclk by 2 in FPGA_top. create_generated_clock -name init_clk \ -source [get_pins sys_clk_inst/O] \ -divide_by 2 [get_pins u_init_clk_div/O]验证建议重新生成 Block Design 并运行build.tcl完成综合实现确认时序报告Timing Summary中init_clk被识别为 100 MHz 生成时钟且没有init_clk到 GT/CMAC 复位路径的时序违例上板后先用ping -c 100 fpga_ip验证丢包率是否降到 0%若仍丢包再检查CMAC 统计寄存器stat_rx_bad_fcs、stat_rx_aligned等确认是物理层误码GT 通道 LOC/极性是否与 RK-XCKU5P-F 原理图一致QSFP28 模块/光纤链路质量。结论pynq 项目不会因同样原因出现 50% ping 丢包其init_clk为 100 MHz与 CMAC 期望一致。vitis 项目的问题根因是 200 MHz 系统时钟被直接用作 CMACinit_clk导致 GT/CMAC 复位时序异常、链路间歇性错包。修复方法在FPGA_top.sv中用BUFGCE_DIV对 200 MHz 系统时钟做 2 分频产生 100 MHzinit_clk并在 XDC 中声明生成时钟。