一、时序基础概念:建立时间与保持时间、时钟抖动与偏移、时序路径分类
各位同学好,我是老李。做芯片接口设计十几年了,今天咱们聊聊时序基础。
很多人觉得时序分析就是背公式,其实不然。我刚开始做设计时,总觉得时序裕量留够就行。直到有一次,一个DDR接口在高温下频繁出错,排查了整整两周才发现是保持时间违例。嗯,从那以后我再也不敢小看这些基础概念了。
1.1 建立时间与保持时间——触发器的“脾气”
先说建立时间(Setup Time)。说白了,就是数据必须在时钟有效沿之前稳定下来的最短时间。为什么要有这个要求?因为触发器内部需要时间把数据“读进去”。
建立时间(Tsu):数据在时钟沿之前必须稳定的最小时间。
保持时间(Th):数据在时钟沿之后必须稳定的最小时间。
保持时间呢?正好反过来。时钟沿来了之后,数据不能马上变,得再稳住一会儿。我见过不少新手只关注建立时间,忽略保持时间,结果芯片在低温下跑飞了。
举个例子,一个典型的DFF参数:
// 典型工艺下(28nm)的时序参数
Tsu = 0.1ns // 建立时间
Th = 0.05ns // 保持时间
Tco = 0.2ns // 时钟到输出延迟
你想想看,如果时钟周期是1ns,留给组合逻辑的时间就是1 - 0.1 - 0.2 = 0.7ns。这个计算很简单,但实际项目中要考虑的因素多得多。
我的经验:在接口时序优化时,我习惯把建立时间裕量留到时钟周期的10%以上。比如1GHz时钟,至少留100ps的setup margin。保持时间裕量则留50ps以上。这是血的教训换来的。
1.2 时钟抖动与偏移——时钟不是完美的
理想时钟是完美的方波,但现实不是。时钟抖动(Jitter)和时钟偏移(Skew)就是两个捣蛋鬼。
时钟抖动:时钟沿在时间轴上的随机波动。为什么会这样?电源噪声、热噪声、PLL本身的相位噪声都会导致抖动。
我曾经在一个项目中,PLL输出抖动达到了30ps,直接吃掉了我一半的时序裕量。当时真是欲哭无泪。
时钟偏移:同一个时钟到达不同触发器的延迟差异。这主要是由时钟树的布线长度不同造成的。
| 类型 | 来源 | 典型值(28nm) | 影响 |
|---|---|---|---|
| 随机抖动 | 热噪声、散粒噪声 | 5-15ps RMS | 降低setup/hold裕量 |
| 确定性抖动 | 电源噪声、串扰 | 10-30ps p-p | 与数据相关 |
| 时钟偏移 | 时钟树不平衡 | 20-100ps | 影响hold时序 |
注意:时钟偏移对保持时间的影响尤其大。因为保持时间检查的是同一个时钟沿,偏移会直接吃掉hold margin。我曾经遇到过一个案例,时钟偏移导致保持时间违例,最后不得不重新做时钟树综合。
1.3 时序路径分类——四种路径,四种套路
静态时序分析中,时序路径分为四类。每种路径的约束方法和优化策略都不一样。
- 输入到寄存器路径:从输入端口到触发器的D端
- 寄存器到寄存器路径:从触发器的CK端到下一个触发器的D端
- 寄存器到输出路径:从触发器的CK端到输出端口
- 输入到输出路径:从输入端口直接到输出端口(纯组合路径)
我个人最关注的是寄存器到寄存器路径,因为它占了芯片内部90%以上的时序路径。优化好这类路径,基本就解决了大部分时序问题。
下面这张图展示了四种路径的关系:
1.4 时序分析的数学基础
建立时间和保持时间的检查公式,其实很简单:
// 建立时间检查
Data Arrival Time <= Data Required Time
即:Tclk1 + Tco + Tlogic <= Tclk2 + Tcycle - Tsu
// 保持时间检查
Data Arrival Time >= Data Required Time
即:Tclk1 + Tco + Tlogic >= Tclk2 + Th
其中:
- Tclk1:时钟到达源触发器的延迟
- Tclk2:时钟到达目的触发器的延迟
- Tco:触发器时钟到输出延迟
- Tlogic:组合逻辑延迟
- Tcycle:时钟周期
你想想看,如果Tclk2比Tclk1大很多(正偏移),建立时间裕量会增加,但保持时间裕量会减少。这就是为什么时钟偏移是一把双刃剑。
实用技巧:我习惯在时序报告中先看最差的setup slack和hold slack。如果setup违例,优先考虑插入流水线或优化组合逻辑。如果hold违例,插入延迟单元或调整时钟树。
1.5 避坑指南——我踩过的那些坑
最后分享几个实战中容易忽略的点:
- 跨时钟域路径:不同时钟域之间的路径,不能用普通的setup/hold检查。我曾经用同步器处理跨时钟域,结果忘了加两级触发器,数据直接乱掉了。
- 异步复位路径:复位信号的释放需要满足recovery和removal时间。我见过一个设计,复位释放时刚好在时钟沿上,导致部分触发器进入亚稳态。
- 伪路径:有些路径在功能上永远不会被激活,需要设为false path。但要注意,设多了会漏掉真正的时序问题。
嗯,时序基础就讲到这里。这些概念看似简单,但真正用好需要大量实践。下一章我们聊聊如何用工具做时序约束,到时候我会分享一些实际项目的约束脚本。