一、时序基础概念:建立时间、保持时间、时钟偏斜、时钟抖动、时序路径分类

各位同学,咱们今天聊聊时序的基础概念。说实话,这些概念看着简单,但我在面试新人时发现,能真正讲清楚的人不多。你想想看,如果连建立时间和保持时间都搞混,那后面的时序收敛根本无从谈起。

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 时序路径分类

时序路径,就是数据从起点到终点的传播路径。我习惯把它们分成四类:

  1. 寄存器到寄存器路径:最典型的路径,起点和终点都是寄存器。这是STA中最常见的检查对象。
  2. 输入到寄存器路径:从芯片的输入端口到内部寄存器。需要设置输入延迟约束。
  3. 寄存器到输出路径:从内部寄存器到芯片的输出端口。需要设置输出延迟约束。
  4. 输入到输出路径:从输入端口直接到输出端口,中间没有寄存器。这种路径通常需要特别注意,因为它没有寄存器的缓冲。

我在做时序分析时,会先看寄存器到寄存器的路径,因为这类路径占了90%以上。如果这类路径都收敛不了,那其他路径就更不用说了。

经验之谈:对于输入到输出路径,我建议尽量加一级寄存器。虽然会增加一个时钟周期的延迟,但能大大简化时序约束。你想想看,是让设计跑慢一个周期好,还是让芯片根本跑不起来好?

好了,这一章的内容就到这里。这些基础概念虽然简单,但它们是整个时序分析的基石。下一章我们会讲如何设置时序约束,到时候这些概念都会用上。