关键时序参数:Tsu、Th、Tskew、Tdelay详解

做RGMII接口调试,说白了就是跟这四个参数死磕。我刚开始接触这个的时候,总觉得时序分析是理论派搞的事情,直到一块板子在量产线上突然大批量丢包……嗯,那次教训让我老老实实把每个参数都啃透了。

咱们一个一个说清楚。

建立时间(Tsu)与保持时间(Th)

这俩是成对出现的,就像一对搭档。一个是敲门,一个是堵门。

建立时间(Tsu),数据必须在时钟有效沿到来之前,提前到达并稳定下来的最短时间。说白了,就是数据得提前站好位,等时钟来读。

保持时间(Th),时钟有效沿过去之后,数据还必须保持稳定的最短时间。时钟读完了,数据不能马上跑,得再待一会儿。

我个人习惯把这两个时间想象成一个“窗口”。时钟沿是这个窗口的中间线,Tsu是窗口打开的时间,Th是窗口关闭的时间。数据只有在这个窗口内稳稳当当的,才能被正确采样。

关键公式(我心里默念的那种)
采样窗口 = Tsu + Th
实际可用窗口 = 时钟周期 - Tsu - Th

我在项目中遇到过一种情况:外部存储器的Th要求只有0.5ns,看着很宽松对吧?但PCB走线稍微长了一点,加上输出延迟,实际测出来Th只剩0.1ns了。差一点就翻车。你想想看,0.5ns的裕量,在1.2V的IO电平下,一丁点噪声就可能把它吃掉。

我的小习惯
看datasheet时,我习惯先把Tsu和Th这两个值圈出来,然后直接减掉20%当设计目标。别问为什么,吃过亏就知道了。

时钟偏斜(Tskew)

Tskew,就是同一个时钟源到达不同芯片的时间差。理论上时钟应该同时到达所有地方,但现实是走线有长有短,温度有高有低,电压有起有伏。

我举个例子你就明白了:时钟从FPGA出来,跑到PHY那里用了1ns,跑到MAC那里用了1.3ns。那这0.3ns的差值,就是Tskew。它会直接吃掉你的时序裕量。

Tskew来源 典型影响 我见过的坑
PCB走线不等长 5-20 ps/inch 同一组时钟线差900mil,直接丢包
温度变化 每10°C约1-2%延迟变化 高温老化箱里时序裕量缩了一半
电源噪声 0.1-0.5 ns 电源纹波大时,眼图都闭上了
芯片工艺偏差 批次之间差几十ps 换了一颗同型号芯片,时序违例

怎么对付Tskew?我建议三条路:

  1. 等长走线——RGMII时钟和数据线控制在±50mil以内,这是我给自己定的死规矩
  2. 减少负载——一个时钟输出只驱动一个负载,多点fanout用时钟缓冲器
  3. 留足裕量——设计时至少留30%的Tskew裕量,别卡着极限算
千万别这么做
我曾经为了省一层,让时钟线绕了三个过孔才到目标芯片。结果Tskew直接超了200ps,整个RGMII链路全崩。后来老老实实加层,一个过孔都不给时钟线走。

传输延迟(Tdelay)

Tdelay,就是信号从发送端飞到接收端花的时间。包括芯片内部的输出延迟、PCB走线延迟、以及接收端芯片的输入延迟。

说实话,很多工程师只盯着走线延迟,忽略了芯片内部延迟。我踩过这个坑——FPGA数据输出延迟典型值1.2ns,最大值2.0ns。我按典型值算的,结果高温下延迟飘到1.9ns,时序直接炸了。

计算Tdelay时,我通常这样算:

Tdelay_total = Tco + Tpcb + Tinput

其中:
Tco    = 芯片内部输出延迟(看datasheet的最大值,别用典型值)
Tpcb   = PCB走线延迟(约170 ps/inch,FR4材质)
Tinput = 接收端输入延迟(一般几十ps到几百ps)
我的习惯
所有延迟都按最大值算。没错,就是最悲观的那种。虽然看起来裕量小,但至少量产时不会出幺蛾子。我宁愿设计时多花点心思,也不愿意在产线上一批一批退货。

四个参数的关系

这四个参数不是孤立的。它们共同决定了一个RGMII链路能不能正常工作。我总结了一个简单的判断逻辑:

  • Tsu违例——数据到得太晚,追不上时钟沿
  • Th违例——数据跑得太快,时钟沿还没读完就跑了
  • Tskew太大——时钟和数据之间的相对关系被破坏,直接导致Tsu/Th违例
  • Tdelay太长——整个时序窗口被往后推,可能同时触犯Tsu和Th

你看,Tskew和Tdelay本质上都在“偷”你的采样窗口。窗口本来就那么大,被偷一点就少一点。

RGMII时序参数关系图 时钟源 发送端 接收端 Tskew 数据通道 Tdelay 采样窗口 Tsu Th 关键理解: 1. 时钟源经Tskew后,到达发送端和接收端的时间不同 2. 数据经过Tdelay后,才到达接收端的采样窗口 3. Tsu和Th定义了采样的有效窗口边界 4. 时序收敛的条件:Tskew + Tdelay 不能超过窗口的有效宽度 实际约束: Tskew + Tdelay + Tmargin ≤ Tcycle - Tsu - Th 其中Tmargin是我习惯额外留的裕量,建议至少200ps

这张图我每次做RGMII设计都会在脑子里过一遍。时钟源分两路,一路到发送端,一路到接收端。数据从发送端出发,经过Tdelay飞到接收端。接收端用自己的时钟沿去采数据——问题就出在这里:接收端采数据的时钟,和发送端送数据的时钟,不是同一个时刻到达的。中间的Tskew,加上数据的Tdelay,共同决定了你的采样到底在窗口的哪个位置。

我在项目里最怕看到的一种情况,就是Tskew方向和Tdelay方向是叠加的。比如Tskew让接收时钟变晚,Tdelay又让数据变晚,两个晚加在一起,数据很可能直接错过Tsu窗口。反过来,如果Tskew是负的,可能会让Th出问题。这两种情况我都遇到过,都不是什么愉快的回忆。

实战口诀(我自己编的)
先算Tcycle,减去Tsu和Th,再扣Tskew和Tdelay,剩的就是你的底气。

做RGMII时序调校,说到底就是在跟时间赛跑。这四个参数,一个比一个能偷你的时间。我建议你拿到一块板子后,先把这四个参数的测量值或估算值列出来,算一下总裕量。如果小于200ps,那这事就得认真对待了。如果小于100ps,我劝你别急着投板,先把问题找到再说。

嗯,关于这四个参数的详解,就这么多。下一次你看到示波器上RGMII的眼图有点不对劲的时候,不妨先检查一下,是哪个参数在捣乱。