ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RGMII接口调试千兆以太网PHY:时序约束、延迟模式与PCB走线实战

RGMII接口调试千兆以太网PHY:时序约束、延迟模式与PCB走线实战 1. 千兆以太网PHY调试到底在调什么RGMII接口调试千兆以太网PHY芯片这件事在嵌入式硬件圈里属于那种“听起来简单、做起来头大”的典型任务。我做了十多年硬件和底层驱动每次带新人调PHY十个人里有八个会在RGMII时序上栽跟头。这篇文章就把我这些年踩过的坑、总结出来的方法从头到尾捋一遍。先说清楚这个内容适合谁看。如果你正在画一块带千兆网口的板子或者板子已经打回来了但网口死活不通、丢包严重、协商不到1000M那这篇就是写给你的。不管你是刚入行的硬件工程师还是做了几年但一直没深挖过RGMII时序的老手这里面的排查思路和实操步骤都能直接拿去用。RGMII的全称是Reduced Gigabit Media Independent Interface中文叫“精简千兆媒体独立接口”。它是MAC层和PHY层之间的通信桥梁。你可以把它想象成一条高速公路MAC是发货方PHY是收货方RGMII就是中间那条路。这条路有12根线其中发送方向4根数据线、1根发送时钟、1根发送控制线接收方向4根数据线、1根接收时钟、1根接收控制线。数据位宽是4bit但时钟频率跑到125MHz在时钟的上升沿和下降沿都采样等效于8bit125MHz算下来正好1000Mbps。为什么RGMII调试容易出问题核心原因就一个时序窗口太窄。125MHz的时钟周期只有8nsDDR双沿采样意味着每个数据窗口只有4ns。再扣掉PCB走线偏差、芯片内部延迟、时钟抖动留给你的余量可能连1ns都不到。所以RGMII调试的本质就是在跟这1ns的余量做斗争。我见过太多案例原理图连得没问题PCB也按等长走了但网口就是不通。最后查下来要么是PHY芯片的RGMII延迟模式没配对要么是MAC侧的时序约束没写对要么是PCB上时钟和数据线的长度差超出了容忍范围。这些问题不会在原理图检查阶段暴露只有真正跑起来才会现形。下面我会从整体设计思路开始把RGMII调试拆成几个关键环节每个环节讲清楚为什么这么做、怎么做、做错了会怎样。然后给出完整的实操流程和参数计算方法最后整理一份常见问题速查表。内容比较长建议先收藏再慢慢看。2. RGMII接口调试的整体设计思路2.1 先搞清楚MAC和PHY之间的“交接班”规则RGMII调试的第一步不是拿起烙铁或者打开示波器而是把MAC和PHY两颗芯片的数据手册翻到RGMII时序那一章搞清楚它们各自支持哪种延迟模式。这是整个调试工作的地基地基没打对后面怎么调都是白费。RGMII接口有两种基本的延迟配置方式非延迟模式和延迟模式。非延迟模式下发送时钟TXC和发送数据TXD在MAC侧是同时发出的PHY收到之后自己内部把时钟延迟1.5~2ns再去采样数据。延迟模式下MAC侧就把TXC延迟了约2ns再发出去PHY收到后直接用这个延迟过的时钟采样数据内部不再做延迟。接收方向同理。非延迟模式下PHY发出的RX_CLK和RXD是对齐的MAC内部自己延迟时钟去采样。延迟模式下PHY把RX_CLK延迟约2ns再发出MAC直接用。这里的关键在于MAC和PHY必须约定好谁来做延迟而且只能有一方做。如果两边都做延迟或者两边都不做时序就会错位。我遇到过最典型的情况是MAC配的是延迟模式PHY也配的是延迟模式结果时钟被延迟了两次采样点完全偏出数据窗口网口自然不通。所以调试开始之前先做一张表把MAC侧和PHY侧各自支持的延迟模式列出来然后决定由哪一侧来做延迟。通常的选择是如果PHY支持内部延迟且配置灵活就让PHY做延迟MAC侧配成非延迟模式如果PHY不支持内部延迟那就让MAC做延迟。具体怎么选下面会详细说。2.2 为什么我建议优先让PHY做延迟在实际项目中我通常优先选择让PHY芯片来做RGMII延迟。原因有几个。第一PHY芯片的延迟配置通常是通过寄存器或者硬件引脚来设置的配置一次就固定了不依赖MAC侧的驱动。而MAC侧的延迟往往需要在驱动初始化时通过寄存器配置如果驱动版本不对或者初始化顺序有问题延迟配置可能不生效。第二PHY芯片的延迟值通常是芯片厂商在出厂时校准过的精度有保证。比如很多PHY的延迟值标称是2ns左右实际偏差在±0.2ns以内。而MAC侧的延迟如果通过内部PLL或者延迟线来实现精度和稳定性取决于MAC的设计不同厂商差异很大。第三调试阶段如果发现时序有问题改PHY的寄存器比改MAC的驱动要方便得多。PHY的寄存器通常可以通过MDIO接口直接读写不需要重新编译驱动或者重启系统。而MAC侧的时序调整往往需要改驱动代码、重新编译、重新烧录周期长得多。当然让PHY做延迟也有前提条件PHY芯片必须支持内部延迟而且延迟值可以通过寄存器或者引脚配置。如果PHY不支持那就只能让MAC来做。所以在选型阶段我建议优先选那些RGMII延迟配置灵活的PHY芯片。2.3 PCB走线对RGMII时序的影响到底有多大很多人觉得RGMII调试是芯片和驱动的事跟PCB关系不大。这个想法大错特错。RGMII的时序余量本来就小PCB走线如果不控制好光走线偏差就能吃掉你一半的余量。先算一笔账。信号在FR4板材上的传播速度大约是6英寸/ns换算下来每毫米大约0.17ns。如果TXC和TXD之间的走线长度差了10mm那就意味着时钟和数据之间多了1.7ns的偏差。而RGMII在延迟模式下的数据窗口总共才4ns1.7ns的偏差已经吃掉了将近一半的余量。如果再加上芯片内部的延迟偏差和时钟抖动余量就所剩无几了。所以RGMII的PCB走线有几个硬性要求。第一同一组内的TXC和TXD必须严格等长偏差控制在5mil以内也就是0.127mm以内。第二RX_CLK和RXD同样要严格等长。第三TXC和RX_CLK这两组信号之间不需要等长因为它们方向不同各自独立。第四RGMII信号线要远离高频噪声源比如DDR时钟、开关电源的SW节点。第五如果走线比较长要考虑端接电阻通常是在MAC侧或者PHY侧加33Ω到50Ω的串联端接。我见过一个案例板子上TXC和TXD的长度差了将近20mm结果网口在100M模式下能通一到1000M就大量丢包。后来飞线把TXC绕了一段补上等长问题立刻解决。所以PCB走线这件事必须在layout阶段就盯紧等板子回来再改就麻烦了。2.4 调试工具的准备清单RGMII调试需要一些基本的工具我列一下我常用的配置。工具用途备注示波器测量RGMII时序、时钟频率、信号质量带宽至少500MHz最好1GHz以上差分探头或高阻探头测量RGMII信号探头电容要小于2pF否则会影响信号MDIO读写工具读写PHY寄存器可以用MAC驱动自带的工具也可以用外部MCU网络测试仪测试丢包率、协商速率也可以用两台电脑对ping万用表检查电源、地、连接性基础但必不可少示波器这块我要多说一句。RGMII的时钟是125MHz数据是DDR双沿实际信号频率很高。如果示波器带宽不够你看到的波形是失真的测量出来的时序也不准。我建议至少用500MHz带宽的示波器探头要用高阻低电容的否则探头本身的电容就会把信号边沿变缓影响测量结果。MDIO读写工具也很关键。调试过程中需要频繁读写PHY寄存器如果每次都要改驱动重新编译效率太低了。我通常会在系统里留一个MDIO的命令行工具或者用外部MCU通过MDIO接口直接读写。这样改一个寄存器配置只需要几秒钟调试效率能提高好几倍。3. RGMII时序约束与参数计算实操3.1 延迟模式下的时序窗口计算要理解RGMII为什么容易出问题必须把时序窗口算清楚。我以延迟模式为例把发送方向的时序从头算一遍。在延迟模式下MAC发出的TXC经过内部延迟后在PHY侧被用来采样TXD。假设MAC内部的TXC延迟是2nsPCB走线TXC和TXD等长PHY内部的采样窗口是TXC上升沿和下降沿附近的一个区间。TXC的周期是8nsDDR双沿采样意味着每个数据位在TXC的上升沿和下降沿各采样一次。数据窗口的中心应该对准TXC的边沿。理想情况下TXC延迟2ns后其边沿正好落在数据窗口的中心。但实际情况是MAC内部的TXC延迟可能有偏差比如标称2ns但实际是1.8ns到2.2nsPCB走线有偏差比如TXC比TXD长了3mm相当于多了0.5nsPHY内部的采样窗口也不是一个点而是一个区间比如±0.5ns。把这些偏差加起来最坏情况下采样点可能偏离数据窗口中心超过1ns。数据窗口总共4ns中心偏离1ns意味着一边只剩1ns的余量。如果再加上时钟抖动和电源噪声余量可能就没了。这就是为什么RGMII调试必须把每一个环节的偏差都控制住。3.2 用公式算出你的时序余量我习惯用一个简单的公式来估算时序余量时序余量 数据窗口/2 - (MAC延迟偏差 PCB走线偏差 PHY采样窗口偏差 时钟抖动)以延迟模式为例数据窗口是4ns所以窗口的一半是2ns。假设MAC延迟偏差是±0.2nsPCB走线偏差是±0.15nsPHY采样窗口偏差是±0.3ns时钟抖动是±0.1ns。把这些加起来总偏差是0.75ns。那么时序余量就是2 - 0.75 1.25ns。1.25ns的余量看起来还可以但这只是最理想的情况。如果PCB走线偏差大一点比如到了±0.5ns余量就只剩0.9ns了。如果PHY的采样窗口再大一点余量就更小了。所以我在layout阶段会给自己定一个规矩RGMII同组信号的走线偏差不超过5mil也就是0.127mm对应0.02ns的偏差。这样PCB走线偏差基本可以忽略把余量留给芯片本身的偏差。3.3 MAC侧时序约束怎么写如果你用的是FPGA来做MAC那RGMII的时序约束是必须写的。不写约束综合工具不知道RGMII的时序要求布局布线出来的结果可能完全没法用。以Xilinx FPGA为例RGMII的时序约束通常包括两部分输入延迟和输出延迟。输出方向你需要告诉工具TXC和TXD之间的相位关系。输入方向你需要告诉工具RX_CLK和RXD之间的相位关系。具体的约束写法取决于你用的是哪种延迟模式。如果是延迟模式TXC和TXD在FPGA内部是同时发出的但TXC需要被延迟。这个延迟可以通过FPGA内部的ODELAY或者PLL来实现然后在约束里体现出来。我见过很多FPGA工程师不写RGMII约束结果网口在实验室能通一到现场就大量丢包。原因就是布局布线后的时序余量不够温度一变或者电压一波动就出问题。所以RGMII的时序约束不是可选项是必选项。3.4 PHY寄存器配置的关键位不同厂商的PHY芯片RGMII延迟配置的寄存器地址和位定义都不一样。但通常都会有一个扩展寄存器来控制RGMII的延迟模式。我以常见的几款PHY为例说一下配置思路。以Realtek RTL8211系列为例RGMII延迟配置通常在扩展寄存器页的某个寄存器里。你需要先切换到扩展寄存器页然后找到对应的位设置成延迟模式或者非延迟模式。具体是哪个寄存器、哪一位必须查对应型号的数据手册不能凭经验猜。以Marvell 88E1512为例RGMII延迟配置在寄存器21的bit4和bit5。bit4控制RX延迟bit5控制TX延迟。设置成1就是开启延迟0就是关闭。以TI DP83867为例RGMII延迟配置在寄存器0x17和0x18。0x17控制RX延迟0x18控制TX延迟。每个寄存器可以设置延迟值单位是0.25ns。配置的时候要注意先确认PHY的默认配置是什么。有些PHY出厂默认就是延迟模式有些默认是非延迟模式。如果你不知道默认值可以先读一下寄存器看看当前配置是什么再决定要不要改。注意改PHY寄存器之前一定要先读一遍原始值并记录下来。万一改错了还能恢复回去。我吃过这个亏改了一个不知道是什么的寄存器结果PHY直接不工作了查了半天才想起来没记录原始值。4. 完整调试流程与实操记录4.1 第一步确认硬件连接和电源板子回来之后先别急着上电跑驱动。第一步是用万用表检查RGMII相关的电源和地。PHY芯片通常需要1.8V、2.5V或3.3V的电源具体取决于型号。用万用表量一下每个电源引脚的对地阻抗确认没有短路。然后上电量一下电压是否在芯片要求的范围内。接下来检查RGMII的信号线连接。用万用表的通断档从MAC的引脚量到PHY的引脚确认每一根线都连通没有虚焊或者断线。这一步看起来很基础但我遇到过好几次因为BGA焊接不良导致RGMII信号不通的情况。特别是TXC和RX_CLK这两根时钟线一旦虚焊网口就完全没反应。还要检查PHY的复位引脚和时钟输入。PHY通常需要一个25MHz或50MHz的参考时钟这个时钟可以由外部晶振提供也可以由MAC提供。确认参考时钟的频率和电平符合PHY的要求。如果参考时钟不对PHY根本不会工作。4.2 第二步配置PHY的RGMII延迟模式硬件检查没问题之后下一步是配置PHY的RGMII延迟模式。这一步需要通过MDIO接口读写PHY寄存器。如果你用的是Linux系统可以用mii-tool或者ethtool来读写PHY寄存器。但这两个工具的功能有限我建议用mdio-tool或者自己写一个简单的MDIO读写程序。如果系统里没有现成的工具可以用外部MCU通过MDIO接口直接读写。配置的步骤通常是这样的先读PHY的ID寄存器确认MDIO通信正常。然后切换到扩展寄存器页找到RGMII延迟配置寄存器读一下当前值。根据MAC侧的配置决定是开启还是关闭延迟。改完之后再读一遍确认写入成功。这里有一个常见的坑有些PHY的寄存器写入需要先解锁。比如某些PHY有一个保护寄存器必须先写入特定的序列才能修改其他寄存器。如果不解锁就直接写写入不会生效但读回来的值可能还是你写入的值让你误以为成功了。所以改完寄存器之后一定要通过实际测试来验证不能只看读回的值。4.3 第三步测量RGMII时序PHY配置好之后下一步是用示波器测量RGMII的时序。这是整个调试过程中最关键的一步也是最需要耐心的一步。测量发送方向把探头接到TXC和TXD上触发源设为TXC。观察TXD的变化沿是否在TXC的边沿附近。如果是延迟模式TXC应该比TXD延迟约2ns。你可以用示波器的延迟测量功能量一下TXC边沿和TXD数据窗口中心之间的时间差。测量接收方向把探头接到RX_CLK和RXD上触发源设为RX_CLK。观察RXD的变化沿是否在RX_CLK的边沿附近。同样如果是延迟模式RX_CLK应该比RXD延迟约2ns。测量的时候要注意探头的接地。RGMII信号频率高接地线太长会引入振铃和噪声影响测量结果。我通常用探头自带的短接地弹簧而不是那根长长的鳄鱼夹地线。如果测出来的时序和预期不符比如TXC没有延迟或者延迟值偏差很大那就需要检查PHY的配置是否正确或者MAC侧的配置是否和PHY匹配。4.4 第四步跑通链路并测试丢包率时序测量没问题之后就可以跑驱动测试了。在Linux系统下用ethtool查看链路状态确认协商速率是1000M双工模式是全双工。然后用ping测试基本连通性再用iperf测试吞吐量。测试丢包率的时候我建议用iperf跑至少10分钟观察是否有丢包。短时间的测试可能看不出问题因为温度还没上来电源也还稳定。跑长时间测试才能暴露时序余量不足的问题。如果iperf测试发现丢包先看是发送方向丢包还是接收方向丢包。可以在MAC侧和PHY侧分别统计收发计数器定位丢包发生在哪一段。如果是发送方向丢包重点查TXC和TXD的时序如果是接收方向丢包重点查RX_CLK和RXD的时序。4.5 第五步温度循环和电压拉偏测试实验室常温下跑通不代表产品在实际环境中没问题。我通常还会做温度循环和电压拉偏测试。温度循环把板子放到温箱里从-40°C到85°C循环每个温度点跑一次iperf测试。观察在极端温度下是否丢包。如果高温或低温下丢包说明时序余量不够需要重新调整延迟配置。电压拉偏把PHY和MAC的电源电压拉偏±5%再跑iperf测试。电压变化会影响芯片内部的延迟如果时序余量不够电压一偏就出问题。这两项测试通过之后RGMII的调试才算真正完成。我见过太多项目在实验室跑得好好的一到现场就出问题最后查下来都是因为没做温度和电压测试。5. 常见问题排查与避坑指南5.1 网口完全不通PHY没有Link这是最常见的问题。网口插上网线之后PHY的Link灯不亮系统里也看不到链路状态。排查思路是这样的先确认PHY的电源和参考时钟正常。用示波器量一下PHY的参考时钟引脚看有没有波形频率对不对。如果参考时钟没有PHY肯定不会工作。然后检查PHY的复位引脚确认复位信号已经释放。有些PHY需要复位引脚从低变高之后才能正常工作。如果电源、时钟、复位都没问题那就检查MDIO通信。用MDIO工具读PHY的ID寄存器如果能读到正确的ID说明MDIO通信正常。如果读不到检查MDIO和MDC的连线以及上拉电阻。MDIO通信正常但Link不亮那就检查RGMII的配置。重点看延迟模式是否匹配。如果MAC和PHY的延迟模式不匹配PHY可能能Link上但数据传不通。不过有些PHY在RGMII配置错误时也会Link不上所以不能只凭Link灯判断。还有一个容易被忽略的点网线的质量。我遇到过用了一根劣质网线100M能通但1000M死活Link不上。换一根好网线立刻就好了。所以排查的时候先用一根确认没问题的网线。5.2 Link能通但大量丢包Link能通但丢包严重说明RGMII的时序有问题但还没到完全错位的程度。这种情况通常是因为时序余量不足采样点虽然在数据窗口内但靠近边缘稍微有点抖动就采错。排查的时候先用示波器测量TXC和TXD的时序看采样点是否在数据窗口的中心。如果偏离中心调整PHY的延迟值或者MAC的延迟配置让采样点回到中心。如果时序看起来没问题但还是丢包检查PCB走线是否等长。用TDR或者万用表量一下TXC和TXD的长度确认偏差在允许范围内。如果偏差太大可能需要飞线补救。还有一个可能的原因是电源噪声。RGMII的时钟频率高对电源噪声很敏感。用示波器量一下PHY和MAC的电源纹波如果纹波太大加一些去耦电容。5.3 100M能通但1000M不通100M模式下RGMII的时钟频率是25MHz周期40ns时序余量比1000M大得多。所以100M能通但1000M不通基本可以确定是时序问题。重点检查RGMII的延迟配置。100M模式下有些PHY会自动切换到非延迟模式而1000M模式下用延迟模式。如果延迟配置只对1000M生效那100M能通但1000M不通就说得通了。另外检查PCB走线。100M对走线等长的要求比1000M低得多所以100M能通不代表走线没问题。用示波器在1000M模式下测量时序看采样点是否偏离中心。5.4 高温或低温下丢包常温下正常高温或低温下丢包这是典型的时序余量不足。温度变化会影响芯片内部的延迟如果余量不够温度一偏就出问题。解决办法是重新调整延迟配置让采样点尽量对准数据窗口的中心。如果调整后还是不行可能需要换一款延迟精度更高的PHY或者优化PCB走线。我个人的经验是RGMII的时序余量至少要留1ns以上才能保证在温度循环和电压拉偏下不出问题。如果余量只有0.5ns那产品在实际环境中出问题的概率就很大。5.5 常见问题速查表现象可能原因排查方法解决措施PHY不Link电源/时钟/复位异常示波器量时钟万用表量电源修复电源或时钟PHY不LinkMDIO通信失败读PHY ID寄存器检查MDIO连线PHY不LinkRGMII延迟模式不匹配查MAC和PHY配置统一延迟模式Link通但丢包时序余量不足示波器测时序调整延迟值Link通但丢包PCB走线不等长量走线长度飞线补救100M通1000M不通延迟配置只对1000M生效查PHY寄存器修正配置高温低温丢包时序余量不足温度循环测试增大余量丢包但时序正常电源噪声量电源纹波加去耦电容5.6 几个我踩过的坑第一个坑PHY的默认延迟模式和我以为的不一样。有一次我用了一款PHY数据手册上写默认是延迟模式但实际读寄存器发现默认是非延迟模式。结果MAC配的是非延迟PHY也是非延迟两边都不做延迟时序完全错位。后来改成PHY做延迟就好了。所以一定要读寄存器确认实际配置不能只看数据手册。第二个坑MDIO写入不生效。有些PHY的寄存器需要先解锁才能写。我改了一个寄存器读回来是对的但实际行为没变。后来发现是没解锁写入被忽略了。所以改完寄存器之后一定要通过实际测试验证不能只看读回的值。第三个坑PCB走线等长没做好。有一块板子TXC和TXD的长度差了15mm1000M下丢包率30%。后来飞线把TXC补了一段丢包率降到0.01%。所以layout阶段一定要盯紧RGMII的等长。第四个坑示波器探头影响了测量结果。用普通探头测RGMII信号探头电容有10pF把信号边沿变缓了测出来的时序和实际不符。后来换了低电容探头测量结果才准确。所以测RGMII一定要用高阻低电容探头。第五个坑忽略了参考时钟的质量。PHY的参考时钟如果有抖动会直接影响RGMII的时序。我遇到过参考时钟抖动太大导致丢包的情况换了一个低抖动的晶振就好了。所以参考时钟要选低抖动的PCB走线也要短且远离噪声源。5.7 调试心得与建议RGMII调试这件事说难也难说简单也简单。核心就是抓住几个关键点延迟模式匹配、时序余量足够、PCB走线等长、电源干净。把这几点做好了大部分问题都能避免。我的建议是在项目开始阶段就把RGMII的调试计划做好。选型的时候优先选延迟配置灵活的PHYlayout的时候严格控等长调试的时候先测时序再跑驱动。不要等到板子回来了才发现问题那时候改起来成本就高了。另外调试过程中一定要有耐心。RGMII的问题往往不是单一原因造成的可能是多个因素叠加。排查的时候要系统性地一个一个排除不要东改一下西改一下。每次只改一个变量改完测试确认有效再改下一个。最后再分享一个小技巧如果手头没有高带宽的示波器可以用FPGA内部的IDELAY或者PHY的延迟扫描功能来间接判断时序。具体做法是让PHY或者FPGA扫描不同的延迟值同时统计丢包率找到丢包率最低的延迟值。这个方法不需要示波器但需要MAC或者PHY支持延迟扫描。我用这个方法在没有示波器的情况下也调通过RGMII效果还不错。
返回列表