第三章:建立时间与保持时间——时序分析的基石

做数字IC设计的朋友,咱们今天聊聊时序分析里最核心的两个概念:建立时间(Setup Time)和保持时间(Hold Time)。

说实话,我刚入行那会儿,觉得这玩意儿不就是个定义嘛,背下来就行了。直到有一次,我负责的一个项目在流片前STA报了一堆setup违例,我盯着波形图看了整整三天...嗯,从那以后,我再也不敢小看这两个概念了。

3.1 建立时间(Setup Time)的定义与裕量计算

什么是建立时间?

建立时间,说白了就是:在时钟有效沿到来之前,数据信号必须保持稳定的最短时间。

你想想看,触发器内部有个“采样窗口”。在这个窗口内,数据必须稳稳当当的,不能跳变。否则,触发器就可能采到错误的值——也就是我们常说的“亚稳态”。

核心公式:

建立时间裕量 = 数据到达时间 - 数据要求时间

要求:建立时间裕量 ≥ 0

怎么算?我举个例子:

假设时钟周期是10ns,组合逻辑延迟是6ns,触发器的建立时间是0.5ns,时钟偏斜是0.2ns。

数据到达时间 = 时钟沿 + 组合逻辑延迟 = 0 + 6 = 6ns
数据要求时间 = 下一个时钟沿 - 建立时间 - 时钟偏斜 = 10 - 0.5 - 0.2 = 9.3ns

建立时间裕量 = 9.3 - 6 = 3.3ns ✅

这个裕量越大,说明时序越宽松。我在项目中遇到过,有些设计为了省面积,把组合逻辑压得太深,结果setup裕量变成负的...那叫一个头疼。

我的个人习惯:设计初期,我会留至少20%的时序余量。比如目标频率100MHz,我会按120MHz去约束。这样后期修bug、加功能时,时序才不会崩。

3.2 保持时间(Hold Time)的定义与裕量计算

什么是保持时间?

保持时间就是:在时钟有效沿之后,数据信号必须继续保持稳定的最短时间。

为什么要有这个要求?因为触发器采样完成后,内部电路还需要一点时间来“锁住”这个值。如果数据在保持时间内就变了,那采到的值可能就不对了。

核心公式:

保持时间裕量 = 数据保持时间 - 保持时间要求

要求:保持时间裕量 ≥ 0

再算一个:

同样的例子,数据保持时间 = 时钟沿 + 组合逻辑最小延迟(假设是2ns)
保持时间要求 = 时钟沿 + 保持时间 + 时钟偏斜 = 0 + 0.5 + 0.2 = 0.7ns

保持时间裕量 = 2 - 0.7 = 1.3ns ✅

这里要注意:保持时间违例通常发生在数据路径太短的时候。比如两个触发器直接相连,中间没有组合逻辑,那保持时间就可能出问题。

我曾经踩过的坑:有一次做低功耗设计,用了时钟门控。结果门控后的时钟偏斜特别大,导致保持时间违例。查了三天才发现,是时钟树综合时没处理好门控单元的延迟。从那以后,我每次做时钟门控,都会额外检查保持时间。

3.3 Setup与Hold的检查机制

STA工具是怎么检查setup和hold的?说白了,就是遍历所有时序路径,逐条计算裕量。

检查流程大致是这样的:

  1. 路径识别:工具会找出所有起点(通常是触发器CK端)到终点(下一个触发器D端)的路径
  2. 延迟计算:根据工艺库和RC参数,算出每条路径的最大/最小延迟
  3. 裕量计算:用我们刚才的公式,分别算setup和hold的裕量
  4. 结果报告:把所有违例的路径列出来,供设计师修改

这里有个关键点:

Setup检查用的是最差情况(最大延迟、最慢工艺角)
Hold检查用的是最好情况(最小延迟、最快工艺角)

为什么会这样?你想想看:

  • Setup怕的是数据来得太晚,所以用最慢的情况去检查
  • Hold怕的是数据变得太快,所以用最快的情况去检查

这个逻辑,我当年可是花了好一阵子才彻底想明白。

我的经验:在做时序收敛时,我习惯先修setup违例,再修hold违例。因为修setup通常需要插buffer、改逻辑,这些操作可能会影响hold。反过来,修hold一般只是加延迟,对setup影响较小。这个顺序能少走很多弯路。

3.4 知识体系图

下面这张图,帮你把本章的核心逻辑串起来:

建立时间与保持时间知识体系 建立时间 (Setup Time) 定义:时钟沿前数据需稳定的最短时间 裕量公式:T_setup_slack = T_req - T_arr 检查条件:裕量 ≥ 0 关注:最差情况(最大延迟) 保持时间 (Hold Time) 定义:时钟沿后数据需稳定的最短时间 裕量公式:T_hold_slack = T_hold_act - T_hold_req 检查条件:裕量 ≥ 0 关注:最好情况(最小延迟) STA检查机制 ① 识别所有时序路径(起点→终点) ② 计算每条路径的最大/最小延迟 ③ 分别计算Setup和Hold裕量 → ④ 报告违例路径

这张图把setup和hold的关系、各自的关注点、以及STA的检查流程都串起来了。你可以保存下来,做项目时对照着看。

最后提醒一句:setup和hold是时序分析的两条腿,缺一不可。我见过不少新手,只盯着setup看,hold完全不管。结果流片回来,芯片在低温高速下就出问题——那大概率就是hold违例了。

好了,这一章的内容就到这里。记住:理解setup和hold,是做好时序约束的第一步。下一章我们会聊更具体的约束写法,到时候见。

可可精品资料库