3. 建立时间与保持时间:时序检查的核心
各位同学,今天我们来聊聊时序分析里最基础、也最重要的两个概念——建立时间和保持时间。说实话,我刚入行那会儿,觉得这玩意儿就是背定义、套公式。直到有一次,我负责的一个高速接口模块在仿真时一切正常,流片回来却死活抓不到数据……嗯,从那以后,我才真正理解了这两个“时间”的分量。
3.1 建立时间(Setup Time)定义与检查
建立时间,说白了就是:在时钟有效沿到来之前,数据信号必须提前稳定下来的最短时间。
你想想看,触发器内部有个“判决窗口”。时钟沿来临时,它需要一小段时间来“看清”输入数据是0还是1。如果数据在时钟沿前还在跳变,触发器就可能读到错误的值。
核心公式(建立时间检查):
T_launch + T_co + T_data_path + T_setup ≤ T_capture + T_cycle
其中:
- T_launch:发射时钟路径延迟
- T_co:触发器的时钟到输出延迟
- T_data_path:组合逻辑路径延迟
- T_setup:触发器的建立时间要求
- T_capture:捕获时钟路径延迟
- T_cycle:时钟周期
我在项目中遇到过这样一个案例:一个设计在慢速工艺角下setup slack为负。当时我排查了很久,发现是综合工具把一条关键路径的buffer插得太多了。解决办法很简单——手动调整逻辑级数,或者用更高驱动强度的单元。
3.2 保持时间(Hold Time)定义与检查
保持时间则是:在时钟有效沿之后,数据信号必须保持稳定的最短时间。
为什么要有保持时间?因为时钟沿过去后,触发器内部的“锁存器”还需要一小段时间来把数据真正锁住。如果数据在这期间就变了,那之前采到的值可能被“冲掉”。
核心公式(保持时间检查):
T_launch + T_co + T_data_path ≥ T_capture + T_hold
其中:
- T_hold:触发器的保持时间要求
- 其他参数与建立时间检查相同
⚠️ 特别注意:保持时间违例通常比建立时间违例更棘手。因为建立时间可以通过降低频率来“救”,但保持时间违例是物理上的——你降频也没用。我曾经在一个28nm的项目中,因为时钟树综合时没处理好时钟偏斜,导致保持时间违例遍布整个芯片。最后不得不插入大量延迟单元,面积和功耗都涨了不少。
3.3 时序裕量(Slack)概念
Slack,就是时序裕量。它告诉你:当前路径离“违例”还有多少余量。
公式很简单:
Setup Slack = (T_capture + T_cycle) - (T_launch + T_co + T_data_path + T_setup)
Hold Slack = (T_launch + T_co + T_data_path) - (T_capture + T_hold)
Slack为正,说明时序满足;Slack为负,说明违例了。
💡 我的个人习惯:在项目初期,我会把setup slack目标设为时钟周期的5%~10%作为余量。这样即使后期有ECO(工程变更)或工艺波动,也不容易出问题。但保持时间slack,我一般要求至少为正即可,不要留太大余量——因为插入太多延迟单元反而会增加功耗和面积。
3.4 知识体系图
下面这张图,是我自己总结的时序检查核心逻辑。你看一遍,应该就能把建立时间、保持时间和slack的关系串起来:
3.5 实际项目中的避坑指南
讲完理论,我分享几个实战中容易踩的坑:
- 别忽略时钟偏斜:我曾经在一个项目中,setup slack算出来是正的,但流片后就是有问题。后来发现是时钟树综合时,时钟偏斜比预期大了很多。记住:时钟偏斜会同时影响setup和hold,而且方向可能相反。
- 保持时间检查要“悲观”:我建议在做hold检查时,用最差的工艺角(比如slow corner)和最差的电压温度条件。因为hold违例一旦发生,基本没有补救措施。
- 别只看最差路径:有些工程师只盯着WNS(最差负slack)看。但有时候,一条路径的slack是正的,但它的扇出很大,导致其他路径出问题。我习惯用报告把所有violation路径都过一遍。
💡 一个小技巧:在做setup检查时,可以先把时钟周期设为目标频率的80%,跑一遍STA。如果这样还有违例,那说明你的逻辑路径可能太深了,需要重新考虑流水线设计。如果通过了,再逐步提高频率到目标值。
3.6 总结
建立时间、保持时间和时序裕量,这三个概念是时序分析的基石。说白了,setup检查保证数据“来得早”,hold检查保证数据“走得晚”,而slack就是告诉你还有多少余量。
我见过不少新手,一上来就盯着工具报的violation列表看,却搞不清这些违例到底意味着什么。其实,你只要记住一句话:setup违例可以降频救,hold违例只能改设计。嗯,这句话够你用到很多项目里了。
可可精品资料库