2. RGMII 时序基本原理

咱们先聊聊 RGMII 的时序到底是怎么回事。

刚接触这个接口时,我也被它奇怪的时序搞晕过。明明叫“千兆媒体独立接口”,为什么发送和接收都不直接用时钟双边沿?

说白了,RGMII 为了省引脚,把时钟和数据的关系压缩了。DDR 双边沿采样,4 位数据总线等效 8 位,时钟 125 MHz 就能跑 1 Gbps。省了 9 根线,代价就是时序余量变得非常紧张。

2.1 时钟与数据的相位关系

RGMII 最核心的一条规则:发送端时钟沿对齐数据翻转沿,接收端时钟沿对齐数据稳定窗口中心。

你看发送端,时钟上升沿和下降沿都正好卡在数据跳变的位置。为什么要这样设计?为了兼容低速 PCB 走线,让时钟和数据在芯片内部能共享同一组延迟链。但这样一来,接收端就麻烦了——它拿到的时钟沿正好落在数据跳变点,没法直接采样。

所以芯片内部会做 90° 或 180° 的相位偏移,把时钟沿移到数据窗口中间。有些 FPGA 厂商的 IOB 逻辑里自带可调延迟,就是为了干这个。

我遇到过一块板子,PCB 走线长度差 300 mil,结果接收端采样总出错。查了半天才发现是时钟偏移没配好。

2.2 建立时间与保持时间

任何同步电路都逃不开这两个概念。RGMII 的 Tsu 和 Th 要求比普通并行接口更苛刻。

  • 建立时间(Tsu):数据在时钟沿到达前必须保持稳定的最短时间。
  • 保持时间(Th):数据在时钟沿到达后必须保持稳定的最短时间。

RGMII 的时序窗口很小。以吉比特模式为例,时钟周期 8 ns,但 Tsu+Th 加起来通常只有 1~2 ns。也就是说,留给时钟和数据之间相位偏差的裕量非常有限。

为什么会这样?因为 DDR 采样在同一个时钟周期内要采样两次,时钟沿不能偏离数据中心太远,否则第二个采样点会掉进数据跳变区。

实用公式:数据有效窗口 = Tcycle - (Tsu + Th)。RGMII 工作在 125 MHz 时,Tcycle = 8 ns,若 Tsu+Th=1.5 ns,有效采样窗口只有 6.5 ns。但因为是双边沿,实际每个沿只分配 3.25 ns,再加上 PCB 走线延迟、芯片内部延迟,余量所剩无几。

2.3 建立保持时间窗口模型

用一个简单的时序眼图来理解。假设发送端时钟沿正好对齐数据跳变,接收端内部把时钟延迟 1.5 ns,让采样沿对准数据稳定的中心。

如果外部走线导致 skew 超过 0.5 ns,采样沿就会滑到数据跳变边缘,造成亚稳态。

我记得在一次 8 层板项目中,RGMII 接收端到 FPGA 的时钟和数据走线长度差达到 600 mil,仿真显示 skew 超过 1 ns。后来在 FPGA 内部加了可调延迟链,手动补偿才解决问题。

经验值参考:

  • 单端 RGMII:PCB 时钟-数据走线等长误差 ≤ 50 mil
  • 差分 RGMII:等长误差 ≤ 100 mil
  • FPGA 内部延迟步进:25 ps ~ 50 ps 一级

2.4 关键参数对比

不同厂商的 PHY 芯片时序参数略有差异。下表是我在做兼容性测试时整理的典型值(单位:ns):

参数 10/100 Mbps 1000 Mbps 说明
时钟周期 40 / 400 8 100M 用 25 MHz,10M 用 2.5 MHz
Tsu_min 0.8 0.6 指接收端要求
Th_min 0.8 0.6 指接收端要求
时钟至数据输出延迟 0.5~2.0 0.5~1.5 发送端内部延迟
PCB 走线 skew 建议 ≤ 200 mil ≤ 50 mil 单端信号

避坑指南:我曾经在一款国产 PHY 芯片上踩过坑。它的数据手册写的是典型值,没有标最小最大边界。烧录几百块板子后,发现大约 5% 的板子在高温下无法建立链路。最后加宽内部延迟补偿范围才解决。所以务必用最小/最大值做时序分析,不要按典型值留余量。

2.5 时序约束基本思路

对 FPGA 设计者来说,RGMII 的时序约束分两部分:

  1. 时钟约束:声明外部输入时钟频率 125 MHz,双边沿(BDD)约束。
  2. 输入延迟约束:根据 PCB 走线延迟和 PHY 输出延迟设置最大最小输入延迟。

举个 Vivado 的例子:

# 125 MHz 输入时钟
create_clock -name rgmii_rx_clk -period 8.0 [get_ports rgmii_rxc]

# 输入延迟约束(单位 ns)
set_input_delay -clock rgmii_rx_clk -max 2.5 [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]
set_input_delay -clock rgmii_rx_clk -min 0.5 [get_ports {rgmii_rxd[*] rgmii_rx_ctl}]

这两行约束告诉工具:数据相对于时钟可能早到 0.5 ns 或晚到 2.5 ns。工具会据此检查内部建立保持时间是否满足。

核心提醒:RGMII 的时序分析本质是「时钟域交叉」问题。因为发送端和接收端的时钟同源但相位不可知,所以必须用 set_max_delay / set_min_delay 或者 input delay 来约束数据路径。

RGMII 时序基本原理框架 RGMII 时序基本原理框架 发送端 (MAC/PHY) 时钟沿对齐数据跳变 时钟与数据关系 双边沿 (DDR) 采样 接收端 (PHY/FPGA) 内部相位偏移 90°/180° 建立时间 Tsu 时钟前稳定 保持时间 Th 时钟后稳定 有效窗口 Tcycle - (Tsu+Th) 核心矛盾 时钟沿落在数据跳变点 必须靠延迟链补偿 PCB 等长控制 FPGA 内部延迟 时序约束检查

这个图把整个时序关系串起来了。从左到右:发送端发出时钟和数据,中间经过 PCB 走线、芯片内部延迟,最后到接收端。每个环节都可能引入 skew,最终影响建立保持时间窗口。

后面几章会具体讲怎么测量这些 skew、怎么在 FPGA 里精细补偿。但不管多花哨的方法,底层原理就是这一套——吃透 Tsu/Th 和相位关系,剩下的事情都是围绕它展开。