第三章:建立时间与保持时间——时序分析的基石
做数字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的?说白了,就是遍历所有时序路径,逐条计算裕量。
检查流程大致是这样的:
- 路径识别:工具会找出所有起点(通常是触发器CK端)到终点(下一个触发器D端)的路径
- 延迟计算:根据工艺库和RC参数,算出每条路径的最大/最小延迟
- 裕量计算:用我们刚才的公式,分别算setup和hold的裕量
- 结果报告:把所有违例的路径列出来,供设计师修改
这里有个关键点:
Setup检查用的是最差情况(最大延迟、最慢工艺角)
Hold检查用的是最好情况(最小延迟、最快工艺角)
为什么会这样?你想想看:
- Setup怕的是数据来得太晚,所以用最慢的情况去检查
- Hold怕的是数据变得太快,所以用最快的情况去检查
这个逻辑,我当年可是花了好一阵子才彻底想明白。
我的经验:在做时序收敛时,我习惯先修setup违例,再修hold违例。因为修setup通常需要插buffer、改逻辑,这些操作可能会影响hold。反过来,修hold一般只是加延迟,对setup影响较小。这个顺序能少走很多弯路。
3.4 知识体系图
下面这张图,帮你把本章的核心逻辑串起来:
这张图把setup和hold的关系、各自的关注点、以及STA的检查流程都串起来了。你可以保存下来,做项目时对照着看。
最后提醒一句:setup和hold是时序分析的两条腿,缺一不可。我见过不少新手,只盯着setup看,hold完全不管。结果流片回来,芯片在低温高速下就出问题——那大概率就是hold违例了。
好了,这一章的内容就到这里。记住:理解setup和hold,是做好时序约束的第一步。下一章我们会聊更具体的约束写法,到时候见。