3、时序分析基础概念:建立时间、保持时间、时钟偏斜、时钟抖动、数据到达时间、时钟到达时间
各位同学,今天我们来聊聊时序分析里最基础、也最绕不开的几个概念。说实话,我刚入行那会儿,被这些名词搞得晕头转向。什么建立时间、保持时间,还有时钟偏斜、抖动……听着就头大。但后来我发现,只要把这些概念搞清楚了,后面所有的时序约束、时序分析,其实都是水到渠成的事。
我个人习惯,把时序分析比作一场接力赛。时钟是发令枪,数据是运动员。每个运动员必须在规定时间内完成交接,否则比赛就乱了。嗯,这个比喻虽然简单,但很形象。你想想看,是不是这个道理?
3.1 建立时间与保持时间——寄存器的“规矩”
先说建立时间(Setup Time)和保持时间(Hold Time)。这两个是寄存器的固有属性,说白了就是寄存器对数据提出的“规矩”。
建立时间(Tsu):在时钟有效沿到来之前,数据必须提前稳定下来的最短时间。如果数据来得太晚,寄存器就来不及“记住”这个数据。
保持时间(Th):在时钟有效沿到来之后,数据必须继续保持稳定的最短时间。如果数据变化得太快,寄存器同样会“记错”。
我在项目中遇到过这样一个坑:有一次做高速接口设计,数据速率很高。我按照常规的时序约束去跑,结果后仿一直出错。查了半天,发现是保持时间违例了。数据在时钟沿之后变化太快,寄存器根本来不及锁存。从那以后,我每次做高速设计,都会特别关注保持时间。
核心公式(必须记住):
- 建立时间要求:T_data_arrival + T_setup <= T_clock_arrival + T_clock_period
- 保持时间要求:T_data_arrival >= T_clock_arrival + T_hold
我的小技巧: 建立时间看“最晚路径”,保持时间看“最早路径”。做时序分析时,先跑建立时间,再跑保持时间。因为建立时间违例通常可以通过降低频率解决,但保持时间违例往往需要修改设计。
3.2 时钟偏斜——时钟到达的“时间差”
时钟偏斜(Clock Skew),指的是同一个时钟信号到达不同寄存器的时间差。为什么会这样?因为时钟走线有长度、有负载,不可能完全一致。
时钟偏斜分为两种:
- 正偏斜:目标寄存器的时钟晚于源寄存器。这其实对建立时间有利,因为数据有更多时间到达。
- 负偏斜:目标寄存器的时钟早于源寄存器。这对保持时间不利,因为数据可能还没稳定,时钟就已经来了。
我曾经在一个项目中,因为时钟树综合没做好,导致偏斜很大。结果建立时间怎么都满足不了。后来重新优化了时钟树,把偏斜控制在几十皮秒以内,问题就解决了。所以,时钟偏斜不是越小越好,而是越可控越好。
注意: 时钟偏斜是“双刃剑”。正偏斜可以改善建立时间,但会恶化保持时间。做时序约束时,一定要同时考虑这两个方面。
3.3 时钟抖动——时钟的“不稳定”
时钟抖动(Clock Jitter),指的是时钟边沿在时间上的不确定性。说白了,就是时钟的边沿不是精确的,会有微小的随机偏移。
抖动分为两种:
- 周期抖动:相邻两个时钟周期之间的变化。
- 长期抖动:多个时钟周期累积下来的变化。
我记得有一次做ADC接口设计,时钟抖动比较大,导致采样数据偶尔出错。后来查资料发现,时钟抖动对建立时间的影响是直接的——它会吃掉一部分时序裕量。所以,在高速设计中,一定要选择低抖动的时钟源。
实际影响: 时钟抖动会直接减少建立时间的裕量。在时序分析中,通常把抖动当作一个“安全余量”来处理。Vivado里可以通过 set_clock_uncertainty 来设置。
3.4 数据到达时间与时钟到达时间
这两个概念其实很简单,但很多人容易搞混。
数据到达时间(Data Arrival Time):数据从起点(通常是源寄存器)出发,经过组合逻辑、走线,最终到达目标寄存器输入端的时间。
时钟到达时间(Clock Arrival Time):时钟信号从时钟源出发,经过时钟树,到达目标寄存器时钟引脚的时间。
在时序分析中,我们比较的就是这两个时间。数据必须在时钟到达之前(加上建立时间)稳定,或者在时钟到达之后(加上保持时间)保持稳定。
我个人习惯,在写时序约束时,会先画出数据路径和时钟路径的示意图。这样一目了然,不容易出错。
3.5 知识体系图
下面这张图,是我自己总结的时序分析基础概念之间的关系。你看完应该能有个整体印象。
3.6 避坑指南
最后,我分享几个实战中容易踩的坑:
- 建立时间 vs 保持时间:很多人只关注建立时间,忽略了保持时间。我曾经在一个项目中,建立时间裕量很大,但保持时间违例严重。结果不得不重新布局布线,浪费了两周时间。
- 时钟偏斜不是越小越好:适当利用正偏斜可以改善建立时间。但要注意,偏斜过大会导致保持时间问题。
- 时钟抖动要留余量:在高速设计中,时钟抖动会吃掉不少时序裕量。我一般会在约束中额外留出10%~20%的余量。
- 数据到达时间要算准:不要只看组合逻辑的延迟,还要考虑走线延迟。特别是在深亚微米工艺下,走线延迟占比越来越大。
我的习惯: 每次做完时序约束,我都会先跑一遍建立时间分析,再跑一遍保持时间分析。然后对比两个报告,看看有没有“跷跷板”效应——就是建立时间好了,保持时间差了。如果有,就需要调整约束策略。
好了,这一章的内容就到这里。这些概念虽然基础,但非常重要。你想想看,如果连建立时间和保持时间都搞不清楚,后面怎么做时序约束?所以,一定要把这些概念吃透。
可可精品资料库