3. 建立时间与保持时间:时序约束的核心

各位同学,今天我们来聊聊STA里最基础、也最重要的两个概念——建立时间和保持时间。说实话,我见过不少工程师,能背出公式,但一到实际项目中就栽跟头。为什么?因为没真正理解这两个时间到底在约束什么。

3.1 建立时间约束:别让数据来得太晚

建立时间,英文叫setup time。简单说,就是数据在时钟有效沿到来之前,必须提前稳定下来的那段时间。你想想看,寄存器内部有个采样窗口,数据如果在这个窗口内还在跳变,那采到的值就可能不对。

建立时间约束公式:

T_launch + T_co + T_data + T_setup ≤ T_cycle + T_capture

其中:

  • T_launch:发射时钟路径延迟
  • T_co:寄存器时钟到输出延迟
  • T_data:组合逻辑延迟
  • T_setup:建立时间要求
  • T_cycle:时钟周期
  • T_capture:捕获时钟路径延迟

我在项目中遇到过这样一个案例:一个高速接口模块,综合后时序报告显示setup violation。我查了半天,发现是时钟树不平衡导致的。发射路径的时钟比捕获路径晚了将近200ps。嗯,这就是典型的时钟偏斜问题。后来我调整了时钟树综合策略,把两条路径的时钟延迟尽量对齐,问题就解决了。

我个人习惯:在做floorplan阶段,我就会把关键路径的寄存器位置提前规划好。别等到后端实现时再改,那时候代价就大了。

3.2 保持时间约束:数据别跑得太快

保持时间,hold time,是建立时间的"孪生兄弟"。它约束的是:时钟有效沿之后,数据必须保持稳定一段时间。为什么?因为寄存器内部需要时间来完成数据锁存,如果数据变化太快,锁存就会失败。

保持时间约束公式:

T_launch + T_co + T_data ≥ T_capture + T_hold

其中T_hold是保持时间要求,其他参数同上。

我曾经犯过一个低级错误:在一个低功耗项目中,我为了省功耗,把某些路径上的buffer尺寸调小了。结果hold time全红了。为什么?因为buffer驱动能力弱了,数据路径延迟反而变大了?不对,恰恰相反——buffer变小,延迟变大,hold violation反而更容易出现?

等等,这里要理清楚。保持时间约束检查的是数据不能太快。如果你把buffer调小,延迟变大,数据变慢,其实对hold是有利的。我那个项目的问题出在另一条路径上——时钟路径的buffer没调,导致时钟偏斜变大,hold才出问题的。

注意:保持时间约束与时钟频率无关!它只和路径延迟、时钟偏斜有关。所以即使你降频,hold violation也不会消失。这一点很多新手会搞混。

3.3 时序路径的构成:从起点到终点

一条完整的时序路径,说白了就是数据从哪来、到哪去、中间经历了什么。STA里把路径分成四种类型:

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

你想想看,我们做STA,本质上就是在检查这四种路径上的setup和hold是否满足。其中寄存器到寄存器的路径是最常见的,也是我们优化的重点。

下面这张图,是我自己总结的时序路径构成逻辑,你看一眼就明白了:

时序路径构成示意图 发射寄存器 (起点) 时钟源 T_launch 组合逻辑 T_data T_co 捕获寄存器 (终点) 时钟源 T_capture T_cycle(时钟周期) setup: T_launch + T_co + T_data + T_setup ≤ T_cycle + T_capture

这张图里,红色是时钟路径,绿色是数据路径。setup检查的是数据能不能在下一个时钟沿之前到达,hold检查的是数据会不会在同一个时钟沿之后变化太快。

避坑指南:我曾经在一个28nm的项目中,遇到hold violation修不完的情况。后来发现是时钟树综合时,工具自动插入了太多buffer,导致时钟偏斜过大。我的建议是:在做CTS时,先设定好时钟偏斜的目标值,别让工具自由发挥。

3.4 建立时间与保持时间的关系

这两个时间约束,其实是矛盾的。你想想看:

  • 要满足setup,希望数据路径延迟越小越好
  • 要满足hold,希望数据路径延迟越大越好

那怎么办?实际项目中,我们通常先保证setup,再修hold。因为setup和频率相关,频率上不去,芯片性能就不达标。而hold可以通过插入buffer、调整时钟偏斜等方式来修复。

我记得有一次,一个同事问我:"为什么我的设计setup slack是正的,但hold slack是负的?"我告诉他:"这说明你的数据路径延迟太小了。要么是组合逻辑太短,要么是时钟偏斜太大。加几个buffer就能解决。"

重要提醒:修hold时,一定要小心别把setup搞坏了。插入buffer会增加数据路径延迟,虽然hold变好了,但setup可能会变差。这是一个trade-off,需要反复迭代。

好了,这一章的内容就到这里。建立时间和保持时间是STA的基石,理解透了,后面的时序收敛才能得心应手。


可可精品资料库