一、时序基础概念:建立时间与保持时间、时钟抖动与偏移、时序路径分类

各位同学好,我是老李。做芯片接口设计十几年了,今天咱们聊聊时序基础。

很多人觉得时序分析就是背公式,其实不然。我刚开始做设计时,总觉得时序裕量留够就行。直到有一次,一个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 时序路径分类——四种路径,四种套路

静态时序分析中,时序路径分为四类。每种路径的约束方法和优化策略都不一样。

  1. 输入到寄存器路径:从输入端口到触发器的D端
  2. 寄存器到寄存器路径:从触发器的CK端到下一个触发器的D端
  3. 寄存器到输出路径:从触发器的CK端到输出端口
  4. 输入到输出路径:从输入端口直接到输出端口(纯组合路径)

我个人最关注的是寄存器到寄存器路径,因为它占了芯片内部90%以上的时序路径。优化好这类路径,基本就解决了大部分时序问题。

下面这张图展示了四种路径的关系:

时序路径分类示意图 输入端口 输出端口 触发器1 CK→Q 触发器2 CK→Q 组合逻辑 路径1 路径2 路径3 路径4 时钟树(CLK) 路径1: 输入→寄存器 路径2: 寄存器→寄存器 路径3: 寄存器→输出 路径4: 输入→输出 注:虚线表示组合路径,实线表示时序路径

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。但要注意,设多了会漏掉真正的时序问题。

嗯,时序基础就讲到这里。这些概念看似简单,但真正用好需要大量实践。下一章我们聊聊如何用工具做时序约束,到时候我会分享一些实际项目的约束脚本。


专注资料整理