Learning Record learning from practice

· cpu / memory

从一次反射到振铃和眼图闭合

从电路节点到 DDR5:一步步理解高速信号反射(7)

一次反射通常不会单独出现。反射波返回源端后,如果源端也不匹配,就会再次反射;新的波又回到负载端。示波器上看到的振铃、过冲和下冲,就是这条往返链路在时间轴上的结果。

1. 反射的时间顺序

设传输线单程延迟为 $t_d$:

t0:源端发出入射波
 t1=t0+td:入射波到达负载端
 t2=t0+2td:负载反射波返回源端
 t3=t0+3td:源端再次反射的波到达负载端
 t4=t0+4td:下一次往返继续发生

每一条波都可能叠加在原有电压上。因此示波器上的电压不是一个单调的理想阶跃,而可能出现:

初始阶跃 -> 过冲 -> 下冲 -> 振铃 -> 最终稳定

2. 两端反射系数决定往返强弱

源端反射系数:

\[\Gamma_S=\frac{Z_S-Z_0}{Z_S+Z_0}\]

负载端反射系数:

\[\Gamma_L=\frac{Z_L-Z_0}{Z_L+Z_0}\]

理想无损线中,一次完整往返后的幅度因子大致包含:

\[\Gamma_S\Gamma_L\]

真实通道还要乘上传输损耗和连接器、过孔等不连续结构的影响。

如果只看同一对端点的往返,后续反射项可以写成类似几何级数的形式:

\[1+\Gamma_L\Gamma_S+(\Gamma_L\Gamma_S)^2+\cdots\]

这不是说所有实际通道都能用一个常数精确描述。封装、过孔、分支和频率相关损耗会增加更多反射点;但它清楚表达了为什么源端和负载端都匹配时,反射链条会迅速停止。

如果某一端匹配,相关反射系数接近零,反射链条会明显缩短。如果两端都严重不匹配,波形会在多个 $2t_d$ 时间点发生变化。

3. 为什么反射会关闭眼图

对连续数据,当前 bit 的反射可能落到下一个 bit 的采样窗口里。这就是码间串扰的一种来源。

理想情况:每个 bit 在采样点附近都有稳定电压
实际情况:前一个 bit 的反射叠加到当前 bit

判断反射会不会落进下一个采样窗口,要比较往返时间和一个 UI。数据速率为 $R$ 时:

\[UI=\frac{1}{R}\]

一次反射往返需要 $2t_d$。于是:

2td << UI  -> 反射在本 bit 内基本衰减完,主要表现为边沿畸变
2td ≈ UI   -> 反射正好落在下一个 bit 的采样区域,ISI 最明显
2td >> UI  -> 反射跨越多个 bit,表现为与码型相关的长尾

这解释了为什么同一块板子在低速率下可用,提速后却出错:走线没变,$t_d$ 没变,但 UI 变短了,原来被“藏”在一个 bit 内的反射现在跨进了采样窗口。DDR5 的 UI 只有几十皮秒量级,而封装加 PCB 的往返延迟很容易达到同一量级,因此对反射特别敏感。

眼图把很多个 UI 周期叠加到同一个坐标系。反射造成的幅度和时间变化会表现为:

  • 眼高减小:高低电平之间的电压裕量变小;
  • 眼宽减小:允许采样的时间窗口变窄;
  • 交叉点变厚:不同码型的过渡时间分散;
  • 基线漂移或尾巴变长:通道记忆效应变强。

因此“反射减小”和“眼图张开”不是两种并列卖点,而是物理原因和波形结果的关系。

4. ODT 和驱动器参数为什么影响眼图

终端和驱动器并不直接“制造眼图”。它们改变的是边界阻抗:

调整源端驱动阻抗或负载端终端
  -> 改变 ΓS / ΓL
    -> 改变反射波幅度和返回时间
      -> 改变过冲、振铃和 ISI
        -> 改变采样窗口和眼图

另一方面,阻抗过低可能让边沿过快、噪声和电流增大;阻抗过高又可能让边沿太慢。工程上寻找的是整个 PVT 和拓扑范围内的可用窗口。

5. 眼图不是唯一验证手段

眼图适合观察统计意义上的电压和时间裕量,但定位根因还需要结合:

  • 单次阶跃或脉冲响应;
  • TDR 观察阻抗不连续位置;
  • 示波器探头和夹具模型;
  • IBIS/AMI 或 SPICE 仿真;
  • 不同温度、电压、频率和负载状态。

眼图变差只能说明采样裕量受损,不能仅凭一张眼图判断问题一定来自 ODT。

本篇结论

阻抗不连续
  -> 一次反射
    -> 多次往返
      -> 过冲、下冲、振铃和 ISI
        -> 眼高/眼宽变小

下一篇进入 DDR5:ODT、RON 和 RCOMP 分别在这个链路中控制什么。

References