第2章:时序参数详解
做RGMII接口调试,你最先得跟几个时序参数打交道。说白了,它们就是信号在芯片之间“跑”的时候,你必须要遵守的规矩。我记得刚入行那会儿,觉得这些参数都是芯片手册上写写的东西,直到有一次板子调不通,示波器一看,信号边缘刚好压着接收端的建立时间窗口——嗯,从那以后我再也不敢小看这几个数字了。
2.1 建立时间(Setup Time)
定义:在时钟有效沿到来之前,数据输入必须保持稳定的最短时间。如果数据在这段时间内跳变,寄存器可能锁到错误的值。
对于RGMII来说,接收端的建立时间一般是0.8~1.2 ns(具体看芯片手册)。我自己的经验是:如果你的走线等长做得不理想,setup margin很容易被吃掉。曾经有一版PCB,数据线比时钟线短了快200 mil,结果setup time直接少了0.5 ns,差点翻车。
个人习惯: 我会在时序约束里留出至少0.3 ns的裕量,别卡着边界值设计,不然后期温度电压一变就完蛋。
2.2 保持时间(Hold Time)
定义:在时钟有效沿之后,数据输入必须继续稳定的最短时间。保持时间和建立时间就像跷跷板的两端,一个紧另一个就松。
保持时间在RGMII中通常比建立时间更短,典型值0.5~1.0 ns。但你想想看,如果时钟走线比数据线还长,保持时间约束就容易出问题。我碰到过一次,因为时钟树延迟太大,数据已经变了时钟才到,结果保持时间违规——那把板子最后加了两个buf才修回来。
注意: 保持时间违规无法通过降低频率解决,必须靠调整延迟或重新布局。这一点和setup完全不同。
2.3 时钟到输出延迟(Clock-to-Output Delay, Tco)
定义:从时钟有效沿到数据输出有效的延迟时间。这个参数决定了发送端的数据什么时候准备好给接收端看。
RGMII发送器的Tco一般在1.0~2.5 ns之间,有的大芯片甚至能到3 ns。我习惯把Tco看作“发货时间”——时钟沿一过,数据就开始打包出发,打包需要多久就是Tco。如果你的Tco偏大,留给后面接收端的setup时间就会缩水。
| 参数 | RGMII典型值 | 我见过的最差值 |
|---|---|---|
| Setup Time | 0.8 – 1.2 ns | 0.5 ns(某国产PHY) |
| Hold Time | 0.5 – 1.0 ns | 0.2 ns(极端温度) |
| Tco | 1.0 – 2.5 ns | 3.1 ns(FPGA IO老化后) |
2.4 时钟偏差(Skew)
定义:同一个时钟源到达不同负载的时间差。在RGMII里,主要关心收发两端的时钟偏差。
Skew通常来源于走线长度差异、负载电容不同、PCB材料不均匀。我个人建议把时钟线走成“鱼骨形”,等长控制在±50 mil以内,这样skew基本能压到0.1 ns以下。但有次我为了省空间,把时钟线绕了个大弯走BGA下面,结果测出来skew有0.3 ns——引以为戒。
避坑指南: 我曾经为了追求等长,把时钟线绕得弯弯曲曲,反而造成了额外串扰。后来学乖了——等长够用就行,别过度。
2.5 抖动(Jitter)
定义:时钟边沿的时间偏移,相对理想位置的随机或确定性变化。Jitter会吃掉你的时序裕量。
RGMII对jitter比较敏感,因为双沿采样。总抖动(Tj)通常分成随机抖动(Rj)和确定性抖动(Dj)。我见过一块板子,电源纹波大,导致时钟jitter从20 ps涨到80 ps,结果100 MHz的RGMII直接误码。怎么办?加一级PLL重新整形时钟,再给模拟电源单独滤一次波。
典型值参考: 大多数MAC/PHY要求时钟jitter峰峰值 < 200 ps(周期到周期)。如果你用的是片上PLL,这个值一般没问题;但外部晶振质量不好时,容易超标。
2.6 参数关系与典型时序路径
这几个参数不是孤立的。我给你画一张图,看看它们怎么串起来的:
2.7 实际设计中如何对齐这些参数
你拿到RGMII接口芯片手册后,第一步就是查出它的setup/hold time和Tco。然后估算PCB走线带来的skew,加上时钟jitter,做个加减法。我一般用Excel拉个时序预算表:
- 发送端贡献: Tco + 发送端路径延迟
- PCB贡献: 数据线走线延迟 - 时钟线走线延迟(就是skew)
- 接收端窗口: Tsetup + Thold
- 最终裕量: 时钟周期 - (Tco + skew + jitter) - Tsetup
如果裕量小于0.2 ns,我会考虑调PCB等长或者换FPGA IO的delay元素。嗯,这里要注意:千万不要只看典型值,要按最坏情况算,包括温度、电压、工艺角。
一句话总结: 建立时间决定你能跑多快,保持时间决定你能不能稳住,Tco拖后腿,skew和jitter是隐形杀手。把这几个参数吃透,RGMII时序调整才算入了门。