RGMII Skew的定义与分类
RGMII 接口,说到底就是并行数据配合时钟一起跑。你想想看,数据线和时钟线在PCB上走着走着,难免会有点偏差——这偏差就是 Skew。我刚开始做千兆以太网时,总觉得只要信号有电平就行,Skew 那点事不叫事。后来板子调不通,眼图一看,数据边儿都跑到时钟采样窗口外面去了。从那以后,我再也不敢小看这个 Skew 了。
什么是总Skew
总Skew,就是整个RGMII链路里所有时序偏差的累加值。从FPGA的IOB到对方芯片的输入引脚,走线长度差、PCB材质、温度、电压变化,全都会贡献到总Skew里。我们的目标是让总Skew落在接收器的建立时间和保持时间窗口内,否则数据就采错了。
我习惯把总Skew拆成三部分来看——这样分析问题更清楚。下面这张图展示了它们的关系。
通道间Skew
RGMII 一次传四根数据线(D0~D3),每根线在PCB上走的路程不可能完全等长。哪怕只差个几百mil,在千兆速率下就是几十皮秒的偏差。这就叫通道间Skew。
我在项目里遇到过最头疼的情况:明明各走线长度约束到了±50mil,回去查仿真却显示某根线因为过孔数量多,延迟大了80ps。所以后来我建议,走线长度约束只是基础,实际还得看等长匹配的实际延迟,不能用长度一刀切。
时钟到数据Skew
时钟到数据Skew,指的是时钟信号(CK/CKN)的跳变沿和数据信号的有效窗口之间的偏移。RGMII 使用DDR时钟,数据在上升沿和下降沿各采一次。如果时钟和数据之间的相对相位不对,两个沿的采样点会同时偏离。
说白了,这个Skew决定了你需要在TX端加多大延迟,或者在RX端用PLL调整多少相位。我习惯先用示波器看眼图,确定时钟沿在数据眼图的什么位置,再反向推算出需要补偿的Skew值。
DDR双沿Skew
这是RGMII独有的问题。一根数据线既要传上升沿数据,又要传下降沿数据。PCB走线对上升沿和下降沿的传播延迟其实不完全一样,主要是因为信号转换速率(slew rate)不同。上升沿一般比下降沿慢一点点,所以前后两个沿的有效中心会错开,这就是DDR双沿Skew。
你会问:差这点能有多大?我记得有一次做测试,1000BASE-T跑起来没问题,但换了另一家的PHY芯片,双沿Skew差了近100ps,直接导致误码率达到10e-5。后来在FPGA内部对每个数据位单独加dyadic delay才搞定。
四种Skew对比总结
| Skew类型 | 定义 | 主要影响 | 常见补偿手段 |
|---|---|---|---|
| 总Skew | 所有偏差的累积 | 决定链路能否稳定建立时序 | 整体延迟调整 + 分项补偿 |
| 通道间Skew | 不同数据线之间的相对时差 | 造成某一位与其他位采样点错位 | PCB等长布线、IOB内等长延迟 |
| 时钟到数据Skew | 时钟沿与数据眼图中心的偏移 | 限制建立时间 / 保持时间裕量 | TX端加可调延迟、RX端PLL相位微调 |
| DDR双沿Skew | 同一根线上升/下降沿采样点偏差 | 上升沿数据与下降沿数据不一致 | IDELAYE2逐位动态补偿、ODDR相位调整 |
怎么看待这些Skew
很多初学者一上来就想着怎么消除Skew,其实做不到。我们的目标是把总Skew控制在接收器的容限内。我个人做项目时,一般先看datasheet里的tSU/tH或tSKEW参数,然后反推需要补偿的范围。
举个实际经验:有一块8层板,RGMII走线长度都控制在±30mil内,但上电后还是偶尔丢包。仔细量了全部四根数据线和时钟线,发现DDR双沿Skew最大的一根是75ps,而PHY的接收器要求双沿Skew < 60ps。最后我在FPGA里对那根线单独加了50ps的delay, 问题就解决了。所以遇到问题时别忙着重新布线,先分析清楚是哪一类Skew惹的祸。
好了,四种Skew的来龙去脉咱们捋清楚了。下一步就是怎么在设计中把这些Skew算清楚、量准确,然后有针对性的补偿。这部分我们后面会详细展开。