2. 时序参数概念:建立时间、保持时间、时钟到输出

说实话,刚接触时序分析那会儿,我也被这些参数搞得晕头转向。

建立时间、保持时间、时钟到输出——这三个词看着简单,但背后藏着不少门道。

我当时花了三个月才真正吃透。今天我用最直白的方式讲给你听。

2.1 建立时间(Setup Time)

定义:在时钟有效沿到来之前,数据输入必须保持稳定的最短时间。

说白了,就是数据要提前站好位置,等时钟来抓取。

关键点:

  • 建立时间违例 → 数据可能被错误锁存
  • 常见原因:组合逻辑路径太长、时钟频率过高
  • 修复手段:插入流水线、优化逻辑级数、降低频率

我在项目中遇到过一个问题:某个高速接口总是偶发性地出错。查了三天,最后发现是一条关键路径上的建立时间只差了 5ps。你想想看,5ps 是什么概念?光只能走 1.5 毫米。后来我们加了一级流水线,问题就解决了。

个人习惯:我一般会在关键路径上留 10%~15% 的建立时间余量。别卡得太死,工艺偏差和温度变化会给你"惊喜"。

2.2 保持时间(Hold Time)

定义:时钟有效沿到来之后,数据输入必须继续保持稳定的最短时间。

为什么要保持?因为寄存器内部需要一点时间来锁存数据。时钟沿过了,数据不能立马跑掉。

保持时间违例更隐蔽。建立时间出问题,通常降频就能看到效果。但保持时间违例,降频没用,该错还是错。

我曾经... 吃过一次大亏。一个 28nm 的设计,流片回来发现某个模块在低温下工作不正常。查了两个月,最后定位到是一组寄存器的保持时间因为时钟偏斜过大,在低温下刚好违例。那次之后,我每次做后端都会认真检查保持时间,特别是跨时钟域的数据路径。

2.3 时钟到输出(Clock-to-Output, Tco)

定义:从时钟有效沿到达,到输出数据稳定有效的时间。

这个参数主要关注输出端。时序分析里,我们通常关心两个场景:

  • 内部路径:当前寄存器的输出到下一级寄存器的输入
  • IO 路径:芯片内部的输出寄存器到外部引脚

IO 路径的 Tco 尤其重要。它直接决定了芯片能和外部设备通信的最大速度。

2.4 三者关系

这三个参数不是孤立的。我习惯把它们看作一个完整的"数据护送"过程:

  • 建立时间:数据提前到场等待
  • 保持时间:数据被安全锁存
  • 时钟到输出:数据从寄存器安全发出

任何一个环节出问题,整个数据传输都会失败。

参数 检查时机 常见违例后果 典型修复方法
建立时间 时钟沿之前 数据锁存错误 降频、加流水线、优化组合逻辑
保持时间 时钟沿之后 数据被覆盖、竞争 插入缓冲器、调整时钟偏斜
时钟到输出 时钟沿到输出稳定 外部设备采样错误 优化输出驱动、调整 IO 约束

一句话总结:建立时间看"能不能赶上",保持时间看"会不会被冲掉",Tco 看"传得够不够快"。

2.5 关键路径识别

时序分析的起点是找到关键路径。我常用的方法:

  1. 跑一次完整 STA,查看所有路径的 slack
  2. 按 slack 值从小到大排序
  3. 重点关注 slack 为负或接近零的路径
  4. 分析这些路径上的组合逻辑级数、扇出、线负载

实际项目中,一条关键路径通常都不是单一原因导致的。往往是几个小问题叠加——组合逻辑多了两级、扇出大了点、线长了一点点。每个问题单独看都不严重,但加起来就出事了。

2.6 知识结构图

下面这张图帮你理清三个核心时序参数的关系和检查要点。

时序参数核心概念关系图 建立时间 时钟沿前数据需稳定 保持时间 时钟沿后数据需保持 时钟到输出(Tco) 时钟沿到输出稳定 数据护送过程 数据提前到场(建立时间)→ 数据被安全锁存(保持时间)→ 数据从寄存器发出(Tco) 建立/保持时间违例 数据锁存错误、被覆盖 Tco 不满足 外部设备采样错误 ⚠️ 关键提醒 建立时间和保持时间是互补关系,不能只优化其中一个。 Tco 受输出负载、驱动能力影响,IO 设计时要留余量。

这张图把三个参数串成了一个完整的数据流动链条。你设计的时候,沿着这个链路从头查到尾,就不会漏掉关键点。