最近在做Zynq上的千兆以太网传输,UDP校验和计算这块拿不准。放在PL端用RTL写,逻辑资源占用不小,但延迟低;放在PS端软核里算,CPU占用率又上去了,高速传输时容易丢包。各位大佬平时项目里是怎么权衡的?有没有比较成熟的架构方案?另外,如果做TCP的话,校验和和重传机制是不是必须上软核?
2026年了,FPGA工程师做千兆以太网,UDP包校验和计算放在RTL还是软核里更省资源?
3 个回答

UDP校验和这种活儿,放PL端吧。几十个LUT的事儿,RTL写起来也就一个always块加个异或树,延迟还低。PS端软核算虽然简单,但高速千兆下CPU占用率一高,丢包和中断延迟就来了,得不偿失。TCP就别纠结了,状态机加重传机制,软核加lwIP是正路,PL端硬写那复杂度够你喝一壶的。你目前是跑多少兆的线速?

先别急着定PL还是PS,得先算清楚你的吞吐和包长分布。UDP校验和本身确实是RTL里几十个LUT的事,但真正吃资源的是FIFO、DMA和包解析逻辑,校验和只是顺手的事儿。如果放在PS端,每个包都要CPU读出来算完再写回去,哪怕用NEON加速,千兆满速时一秒钟一百多万个小包,CPU光干这个就没法做别的了,丢包几乎是必然。所以我的建议是:UDP校验和放PL,但别单独做个模块,直接在MAC收发包的时候流水线里算掉,RTL里加个累加器就行,不额外占逻辑。TCP的话,校验和倒是也能在PL做,但真正的坑是重传、超时和拥塞控制,这些没有软核配合很难在RTL里做得完整,除非你只做单连接且不要求可靠传输,否则老老实实上软核跑个轻量协议栈,比如lwIP或uIP,把校验和和分片交给硬件,状态机留在软件里。有个折中做法是:PL端做TCP/IP的checksum offload和分片重组,软核只跑TCP状态机,这样CPU占用率能压到很低。你现在的项目是纯UDP还是以后要扩展TCP?这个决定了架构的复杂度。

讲个我踩过的坑给你听:之前做Zynq千兆传输,一开始图省事把UDP校验和放到PS端,用的轻量协议栈自带计算,跑600Mbps时看着没问题,一到900Mbps以上,丢包率直接飙到千分之一,查了半天发现是CPU在中断里算校验和来不及,后来把校验和挪到PL端,在MAC的TX/RX路径上加了个组合逻辑累加器,只占大概80个LUT,CPU占用率从85%掉到10%,丢包问题直接消失。所以经验是:UDP这种无状态协议,校验和计算量小,放PL端几乎零成本,别犹豫。但TCP的坑不在校验和,在于ACK管理、超时重传和接收窗口滑动,这些在软核里跑协议栈是天经地义的,RTL硬写状态机代码量翻倍还容易出时序问题。另外提醒一下,如果你用的是Zynq的GEM控制器,PS端自带硬件校验和卸载,但只对内部路径有效,如果走PL的MAC,还是得自己做。你现在的数据是走DMA还是寄存器搬运?这会影响你校验和模块的插入位置。
发表回答
登录后可在本页底部提交回答