3. Timing Skew 的定义
说到 Timing Skew,我估计很多刚入行的工程师第一反应是:“不就是时钟歪了吗?” 嗯,差不多是这个意思,但里面门道挺多。Skew 说白了就是两个信号在时间上没对齐。你想想看,一个数字系统里,成千上万个寄存器同时工作,要是时钟或者数据到达的时间差太大,那数据可就乱了。
我个人习惯把 Skew 分成三类来理解:时钟偏差、数据偏差,还有总偏差。这三类在实际项目中常常纠缠在一起。记得我刚做第一个高速 DDR 项目时,眼图怎么都打不开,最后发现就是 Skew 在捣鬼。
3.1 时钟偏差(Clock Skew)
时钟偏差,就是同一个时钟信号到达不同寄存器的时刻不一样。产生的原因有很多:走线长度不同、负载不同、工艺偏差,甚至温度梯度都会造成偏差。
核心定义:时钟偏差 = Tclk_dest − Tclk_src,这里的 T 是时钟沿到达寄存器的时间。
我在项目中遇到过最典型的场景:一个 1.8V 的时钟信号从 PLL 分发到整个芯片,靠 PCB 走线。费了很大劲仿真,以为没问题,结果实测时发现高速信号跨过两个不同长度的分支后,偏差超过了 200 ps。当时眼图上只剩一个模糊的“8”字形。
时钟偏差有正负之分:
- 正偏差:目标寄存器的时钟比源寄存器的时钟晚到。这时对建立时间更有利,但对保持时间不利。
- 负偏差:目标寄存器的时钟比源寄存器的时钟早到。保持时间变宽松,但建立时间变紧张。
一个小技巧:在做 STA 时,我习惯把时钟偏差的 worst-case 值单独列出来。如果时钟树设计得好,全局偏差可以控制在 50 ps 以内。要是超过 100 ps,就得小心了。
3.2 数据偏差(Data Skew)
数据偏差是同一个数据总线上不同 bit 线之间的到达时间差。比如一个 8 位并行总线,理想情况是所有 bit 同时到达接收端,但实际每根走线的长度、阻抗、串扰都不完全一样,就会产生 Data Skew。
数据偏差的来源包括:
- 走线长度不匹配(最常见)
- 过孔数量不同
- 串扰引起的传播速度变化
- 驱动器的输出斜率的差异
你想想看,对于源同步时钟体系,时钟本身也会跟着数据一起传。时钟和数据之间的 Skew 就更关键了,常被称为 Clock-to-Data Skew。我在调试一块 28 Gbps 的 SerDes 时,发现发射端的数据偏差只有 5 ps,但经过 10 cm 的微带线后,偏差扩大到 15 ps。这还不算接收端的随机抖动。最后不得不重新调整走线拓扑。
3.3 总偏差(Total Skew)
总偏差,就是把时钟偏差和数据偏差合并起来看,再加上工艺、电压、温度(PVT)变化引起的偏差。总偏差就是时序分析里实际要留余量的那个值。
它的计算公式很简单,但实际估算时需要谨慎:
Total Skew = Clock Skew + Data Skew + PVT Skew
这里的 PVT Skew 又包括:
- 工艺角偏差(TT/SS/FF 等)
- 供电电压波动引起的偏差
- 温度变化引起的传播延迟变化
特别提醒:我曾经在仿真时只考虑了典型工艺角,结果低温下总偏差比高温大了近 40%。因为低温时载流子迁移率更高、速度更快,而时钟路径和数据路径的温度系数不一样,导致了额外的 Skew。所以做 Timing Closure 时一定要把 Slow、Fast、Worst 三个角都跑一遍。
下面这张图总结了三类 Skew 的关系:
为了方便对比,我把三类 Skew 的核心参数整理成一张表:
| Skew 类型 | 主要来源 | 典型范围 | 对时序影响 |
|---|---|---|---|
| 时钟偏差 | 时钟树走线、负载、PVT | ±20 ~ ±200 ps | 建立/保持时间均受影响 |
| 数据偏差 | 走线长度、过孔、串扰 | ±2 ~ ±50 ps | 总线采样窗口变窄 |
| 总偏差 | 上述两者 + PVT 叠加 | ±50 ~ ±500 ps | 最终裕度决定能否工作 |
避坑指南:我曾经抢时间,只做了典型条件下的仿真,结果样机在高温老炼时频频出错。后来发现总偏差在 125°C 时增加了 30%。所以建议做多角仿真时,记得把 Clock Skew 和 Data Skew 分开看,最后再合在一起。每个分量的 worst-case 可能发生在不同的 corner 上。
理解了这三个 Skew 的定义后,做 Timing Budget 就清楚多了。我一般会在项目启动阶段先定一个 Skew 预算,比如最大允许总偏差 150 ps,然后拆成 Clock Skew 80 ps、Data Skew 40 ps、PVT 留 30 ps。这样后面做 PCB 约束时就知道该控制什么了。