一、时序基础概念:建立时间、保持时间、时钟偏斜、时钟抖动、时序路径分类
各位同学,咱们今天聊聊时序的基础概念。说实话,这些概念看着简单,但我在面试新人时发现,能真正讲清楚的人不多。你想想看,如果连建立时间和保持时间都搞混,那后面的时序收敛根本无从谈起。
1.1 建立时间(Setup Time)
建立时间,说白了就是数据在时钟有效沿到来之前,必须提前稳定下来的最短时间。为什么要有这个要求?因为寄存器内部需要时间去采样数据,就像你拍照前得先对焦一样。
核心要点:建立时间不满足,数据可能被采到错误的值。
我在项目中遇到过这样一个案例:一个高速接口的建立时间总是差几十皮秒。查了半天,发现是时钟路径上的buffer太多,导致数据到达时间晚于预期。后来我调整了时钟树,把多余的buffer去掉,问题就解决了。
建立时间的计算公式很简单:
数据到达时间 + 建立时间 ≤ 时钟到达时间 + 时钟周期
嗯,这里要注意,时钟偏斜也会影响这个不等式。我们后面会讲到。
1.2 保持时间(Hold Time)
保持时间,就是时钟有效沿之后,数据必须保持稳定的最短时间。这个要求是为了防止数据在采样后立即变化,导致寄存器内部状态不稳定。
避坑指南:我曾经在一个低功耗项目中,为了省电把数据路径上的buffer删得太狠,结果保持时间违例。流片回来发现芯片在低温下工作不稳定,真是血的教训。
保持时间的检查公式:
数据到达时间 ≥ 时钟到达时间 + 保持时间
你可能会问,为什么保持时间违例比建立时间更麻烦?因为建立时间可以通过降频来补救,但保持时间违例是物理上的问题,降频也没用。
1.3 时钟偏斜(Clock Skew)
时钟偏斜,指的是同一个时钟信号到达不同寄存器的时刻差异。说白了,就是时钟线路上有延迟,导致不同位置的寄存器看到时钟沿的时间不一样。
我个人习惯把时钟偏斜分为两类:
- 正偏斜:目标寄存器的时钟晚于源寄存器。这其实对建立时间有利,但对保持时间不利。
- 负偏斜:目标寄存器的时钟早于源寄存器。这正好相反,对保持时间有利,对建立时间不利。
| 偏斜类型 | 对建立时间影响 | 对保持时间影响 |
|---|---|---|
| 正偏斜 | 有利(放宽约束) | 不利(收紧约束) |
| 负偏斜 | 不利(收紧约束) | 有利(放宽约束) |
我记得有一次做后端实现,时钟树综合后偏斜有200ps。我一看,这不行啊,赶紧调整了时钟树的平衡策略,把偏斜压到了50ps以内。你想想看,200ps的偏斜,相当于白白浪费了200ps的时序裕量。
1.4 时钟抖动(Clock Jitter)
时钟抖动,是时钟周期在时间上的随机变化。它不像偏斜那样是固定的,而是随机的、不可预测的。
抖动主要来自两个地方:
- PLL本身的噪声:锁相环产生的时钟会有相位噪声
- 电源噪声:供电电压波动会影响时钟缓冲器的延迟
小技巧:在做STA时,我通常会把时钟抖动设为时钟周期的2%-5%。如果芯片工作环境比较恶劣(比如汽车电子),我会取上限5%。
抖动对建立时间的影响是直接的——它相当于减少了有效的时钟周期。举个例子,如果时钟周期是10ns,抖动是200ps,那实际上你只有9.8ns的时间来完成数据传输。
1.5 时序路径分类
时序路径,就是数据从起点到终点的传播路径。我习惯把它们分成四类:
- 寄存器到寄存器路径:最典型的路径,起点和终点都是寄存器。这是STA中最常见的检查对象。
- 输入到寄存器路径:从芯片的输入端口到内部寄存器。需要设置输入延迟约束。
- 寄存器到输出路径:从内部寄存器到芯片的输出端口。需要设置输出延迟约束。
- 输入到输出路径:从输入端口直接到输出端口,中间没有寄存器。这种路径通常需要特别注意,因为它没有寄存器的缓冲。
我在做时序分析时,会先看寄存器到寄存器的路径,因为这类路径占了90%以上。如果这类路径都收敛不了,那其他路径就更不用说了。
经验之谈:对于输入到输出路径,我建议尽量加一级寄存器。虽然会增加一个时钟周期的延迟,但能大大简化时序约束。你想想看,是让设计跑慢一个周期好,还是让芯片根本跑不起来好?
好了,这一章的内容就到这里。这些基础概念虽然简单,但它们是整个时序分析的基石。下一章我们会讲如何设置时序约束,到时候这些概念都会用上。