3. 建立时间与保持时间

各位同学,今天我们来聊聊时序分析里最核心的两个概念——建立时间和保持时间。说实话,我刚入行那会儿,觉得这两个概念背下来就行了。直到有一次,我负责的一个项目在流片回来后,芯片在低温下频繁出错,排查了整整两周才发现是保持时间违例。嗯,从那以后,我再也不敢小看这两个参数了。

3.1 建立时间(Setup Time)定义

建立时间,说白了就是数据在时钟有效沿到来之前,必须提前稳定下来的最短时间。你想想看,寄存器内部有个采样窗口,数据如果在这个窗口内还在跳变,那采到的值就可能是不确定的。

建立时间的本质:数据必须在时钟沿之前到达并保持稳定,确保寄存器能正确锁存。

我在项目中遇到过一种情况:综合后的时序报告显示建立时间违例,但仿真却通过了。为什么?因为仿真用的是理想时钟,而实际芯片里时钟有抖动和偏斜。所以,建立时间的余量一定要留足。

用公式来表达就是:

数据到达时间 + 建立时间 ≤ 时钟到达时间

如果这个不等式不成立,那你的芯片就可能在某些条件下采到错误的数据。

3.2 保持时间(Hold Time)定义

保持时间呢,正好反过来。它要求数据在时钟有效沿之后,还要再稳定一段时间。为什么要这样?因为寄存器内部的传输门关闭需要时间,如果数据变化太快,可能会把新数据也漏进去。

注意:保持时间违例通常发生在数据路径太短的情况下。比如两个寄存器直接相连,中间没有组合逻辑,数据跑得太快,就可能破坏保持时间。

我曾经调试过一个案例:芯片在高温下工作正常,低温下却出现随机错误。查到最后发现是保持时间违例。温度越低,晶体管开关速度越快,数据路径延迟变小,保持时间反而更难满足。这个坑,我踩过一次就记住了。

保持时间的约束公式:

数据保持时间 ≥ 寄存器要求的保持时间

3.3 时序路径的组成

一条完整的时序路径,其实就三个部分:

  • 起点:通常是时钟源的输出,或者是输入端口
  • 路径:经过的组合逻辑和连线
  • 终点:寄存器的数据输入端,或者是输出端口

我习惯把时序路径分成四种类型,这样分析起来更清晰:

路径类型 起点 终点 典型场景
输入到寄存器 输入端口 寄存器D端 片外信号进入芯片
寄存器到寄存器 寄存器Q端 寄存器D端 内部逻辑路径
寄存器到输出 寄存器Q端 输出端口 芯片输出信号
输入到输出 输入端口 输出端口 纯组合路径

我的经验:在做时序分析时,优先检查寄存器到寄存器的路径。这类路径占了芯片内部90%以上的时序问题。输入输出路径通常由芯片的接口时序决定,反而容易约束。

你想想看,一条路径上的延迟由哪些因素决定?

  • 逻辑门延迟:与工艺、电压、温度有关
  • 互连线延迟:随着工艺节点缩小,连线延迟占比越来越大
  • 时钟偏斜:时钟到达不同寄存器的时间差
  • 时钟抖动:时钟周期的随机变化

我记得有一次做28nm的项目,后端反馈说时序收敛不了。我一看报告,发现有一条路径的连线延迟占了总延迟的70%以上。这就是典型的互连线主导的路径,光靠优化逻辑门是没用的,得从布局布线上下功夫。

最后总结一下:建立时间和保持时间,就像是寄存器的两个「安全窗口」。数据必须在窗口内保持稳定,芯片才能正常工作。做时序分析时,我建议你先把建立时间搞定,因为它的违例通常可以通过增加流水线或优化逻辑来解决。保持时间违例就比较棘手,往往需要插入延迟单元,这会增加面积和功耗。

嗯,这一节的内容就到这里。下一节我们聊聊如何用工具来检查这些时序约束,到时候我会分享一些实际项目中的调试技巧。