FPGA 做 10G 以太网 MAC 侧环回测试,这些坑我都踩过

光电手记 发表于 2026-10-16 00:24 · 35 次浏览 · 4 条回复
光
最近用 FPGA 给一款 10G 光模块做 MAC 侧环回测试,折腾了一周,记录几个容易翻车的地方,给后来人省点时间。

1. 时钟域是第一杀手
10G MAC 跑 156.25MHz,PCS 侧是 322.265625MHz(64b/66b),两个时钟域之间一定要用异步 FIFO 隔离。别图省事直接跨时钟域打两拍,误码率一高查到哭。

2. 环回位置要选对
- PHY 侧环回:只能验证 SerDes 和板级走线,MAC 逻辑测不到;
- MAC 侧环回:能把 MAC 发送通路、PCS 编码全跑一遍,推荐从这里开始;
- 线路侧环回:最后再做,验证整条链路。

3. PRBS 码型别只用 PRBS31
PRBS31 能跑通不代表没问题。建议 PRBS7 / PRBS15 / PRBS31 轮着跑一遍,有些 CDR 在特定码型下才会出现锁定抖动,产线批量测试时这个很要命。

4. 误码仪读数要看 BER 趋势,不要只看瞬时值
刚上电前 30 秒的 BER 普遍偏高,等 CDR 和均衡器收敛后再记录,不然会把一批好板子误判成不良。

5. 光模块的 DDM 数据记得一起读
温度、电压、TX/RX 光功率四个值,测试时顺手记录。有一次误码超标,最后查出来是模块工作温度 75℃ 触发了降额,和 FPGA 逻辑半点关系没有。

大家做高速接口测试还有什么独门经验?欢迎补充。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
很实用的总结。补充一点:10G 环回时最好同时用 PCS 层的 PRBS31 测试模式验证物理链路,再上 MAC 帧测试,这样能把物理层问题和 MAC 逻辑问题分开定位。你们做 MAC 侧环回时,是用自己写的帧发生器,还是用厂商 IP 自带的 example design?
光
我们两种都用过,最后沉淀下来的流程是:先用厂商 example design 把链路跑通,确认时钟、复位和 PCS 对齐都没问题;再切到自己写的帧发生器做长时间压测。

自研帧发生器最大的好处是可控:帧长可以做递增、伪随机分布,能插 VLAN、能注入 CRC 错误,配合 TX/RX 帧计数器和 CRC 错误计数器,丢帧位置一目了然。厂商 example design 一般是固定帧长、固定 IFG,压测覆盖度不够,改源码又容易动到 IP 核的时序约束,得不偿失。

一个小坑提醒:自研发生器发帧时 IFG 不要小于 12 字节,有些对端 MAC 的接收 FIFO 在背压时会丢帧,看起来像误码,其实是流控问题。我们之前被这个坑过一次,查了两天才定位到。
论 论坛助手
【编辑部】这套「先 example design 跑通,再切自研帧发生器压测」的流程很值得新人收藏。补充两点:

1. IFG 的问题背后,其实还有 10GBASE-R 的平均帧间隔机制(DIC,空闲字符计数):MAC 发帧时为了对齐,单次 IFG 会有几个字节的浮动,但平均值必须保持在 12 字节,自研发生器如果没实现这一点,对端统计上可能看到异常。
2. 压测时可以加一组 PAUSE 帧或流控场景,验证背压下 FIFO 的行为,正好对应楼主说的那个坑。

请问你们自研的帧发生器是纯 RTL 写的,还是用 HLS 生成?
光
回 4 楼:我们是纯 RTL 写的,原因有三。一是时序可控:发帧间隙、IFG、DIC 补偿都是 cycle 级精确的,仿真和板上行为必须完全一致,HLS 生成的握手流水我们吃不准;二是 DIC 补偿本身很简单,维护一个 deficit 计数器,每次发帧后按(12 - 实际 IFG)累计、下次 IFG 相应缩短,RTL 十几行写完,用 HLS 表达这种时序意图反而绕;三是发生器要和 TX 背压、PAUSE 响应联动,组合加时序的握手逻辑在 RTL 里更直观。

补充一个 PAUSE 压测的坑:发 PAUSE 后 MAC 停发有响应延迟,pause_quanta 以 512 bit-time 为单位,加上 MAC 内部流水线排空,实测停发延迟有几十个时钟周期。统计丢帧时要把这个窗口扣掉,否则正常的排空帧会被误判成丢帧。
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com