2. Skew对时序的影响
欢迎来到第二章。 上一章我们把skew的定义和分类理清楚了。这一章要聊点更实在的——skew到底怎么破坏你的时序? 说白了,就是看它怎么折腾建立时间和保持时间。我自己在项目里吃过不少亏,所以这部分我讲得会细一些。
2.1 建立时间与保持时间回顾
先快速过一遍基本功。建立时间(setup time):数据得在时钟沿来之前稳定住,不然寄存器可能采到错误值。保持时间(hold time):数据在时钟沿之后还得稳稳待一会儿,不能立刻变掉。
标准公式大家应该都看过:
Setup slack = T_clk + T_skew - T_d - T_setup
Hold slack = T_d - T_hold - T_skew
嗯,这里的T_skew有正负之分。我刚开始学的时候总觉得符号搞反,后来亲手调过几个板子才算彻底理解。
2.2 Skew如何扰动时序
你看,时钟信号从源端出发,到两个触发器的路径不可能完全一样。如果捕获触发器的时钟比发起触发器晚到,那就是正skew;反之就是负skew。
正skew对setup有利,对hold有害。 为什么呢?因为数据到达捕获触发器的窗口被推迟了,数据有更多时间穿越组合逻辑,但保持时间那边留给数据的稳定窗口就压缩了。
负skew正好相反:hold更安全,setup更危险。 我在一个DDR3的项目里遇到过:为了压低建立时间风险,不小心把skew调成了负的,结果hold violation跳了一堆——那就是个“拆东墙补西墙”的例子。
| Skew类型 | 对Setup影响 | 对Hold影响 | 典型场景 |
|---|---|---|---|
| 正skew(捕获晚到) | 放宽setup,slack增加 | 收紧hold,slack减少 | 高速总线,高频时钟树 |
| 负skew(捕获早到) | 收紧setup,slack减少 | 放宽hold,slack增加 | 低速接口,低功耗设计 |
2.3 正skew与负skew的利弊
咱们掰开揉碎说说这两边的权衡。
- 正skew的优点:能帮你把好不容易跑不上时序的FF路径“救”回来。尤其在IO接口里,调整捕获路径的delay有时候比优化组合逻辑快得多。
- 正skew的缺点:hold修复成本高。你可能要插缓冲器、加延迟链,甚至重排寄存器位置。面积和功耗都会涨。
- 负skew的优点:hold margin大,适合处理那些对保持时间特别敏感的结构,比如高速串行收发器里的数据重定时。
- 负skew的缺点:setup time极其紧张,稍微有点PVT变化就可能满足不了。
你可能会问:能不能让skew为零?理论上最理想,但实际做不到。PCB走线、片上互连、温度梯度都会引入偏差。我们的目标是可控,不是消灭。我早期在FPGA上遇到过一个奇葩问题:同一根时钟线从PLL出来,分到两个bank,结果bank之间的skew跑了200ps,直接把DDR3的训练搞崩了。后来我们加了等长蛇形线才摆平。
上面这张图把正负skew对setup和hold的影响画出来了。左边发起寄存器,右边捕获寄存器,中间的箭头代表数据路径。时钟源下发的时钟到达两个寄存器的时间差就是skew。正skew相当于给setup“延期”,负skew相当于给hold“加码”。
最后说一个实战技巧:如果你用Xilinx或者Altera的FPGA,你会发现PLL的输出可以微调相位。那就是在帮你做局部正skew。但要注意,这种调整是全局的,一个PLL输出线上挂的所有寄存器都会受影响。所以我一般只对critical path单独加BUFR或者MMCM做区域时钟。
嗯,这一章大概就这么多。skew的利弊其实是个平衡艺术。你在设计初期就需要想清楚:你的瓶颈是setup还是hold? 然后有策略地引入正或负skew。别等到后端都跑完了才发现timing closure搞不定——那时候再改时钟树,成本和风险都高。