2. 建立时间与保持时间:时序逻辑的基石

各位同学,咱们今天聊点实在的。建立时间和保持时间,这两个概念你要是没搞透,做跨时钟域设计基本就是盲人摸象。我当年刚入行时,就吃过这个亏——一个简单的同步器,因为没算好保持时间,导致数据采样错误,整整调了两天。嗯,从那以后,我对这两个参数就格外上心。

2.1 建立时间(Setup Time)定义

建立时间,说白了就是:在时钟有效沿到来之前,数据输入必须保持稳定的最短时间。

你想想看,触发器内部是个模拟电路,它需要时间去“读取”输入数据。如果数据在时钟沿来临时还在跳变,那触发器就可能读到错误的值。这个“提前稳定”的时间窗口,就是建立时间。

核心要点:

  • 建立时间是对数据信号的要求,不是对时钟的要求
  • 它衡量的是数据在时钟沿之前的稳定时间
  • 通常用 tsu 或 Tsetup 表示

举个例子,假设一个触发器的建立时间是 2ns。这意味着在时钟上升沿到来前的 2ns 内,数据必须已经稳定,不能有任何变化。如果数据在这 2ns 内跳变了,那这个触发器的输出就可能进入亚稳态。

我的经验: 我在项目中遇到过,有些工程师把建立时间理解成“数据提前到达的时间”。其实不对。建立时间是器件本身的物理特性,不是你能控制的。你能控制的是——让数据提前足够多的时间到达触发器输入端。

2.2 保持时间(Hold Time)定义

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

为什么会这样?因为时钟沿采样数据不是瞬间完成的。触发器内部的锁存结构需要一点时间来“锁住”数据。如果时钟沿刚过,数据就变了,那锁存器可能还没完成采样,结果就乱了。

核心要点:

  • 保持时间是对数据信号在时钟沿之后的稳定要求
  • 通常用 th 或 Thold 表示
  • 保持时间违例比建立时间违例更难修复

还是那个例子,如果触发器的保持时间是 1ns,那在时钟上升沿之后的 1ns 内,数据必须保持稳定。这 1ns 内你不能改变数据,否则采样结果不可靠。

注意: 保持时间违例通常发生在路径太短的情况下。比如两个触发器靠得太近,数据传播太快,导致第二个触发器的保持时间不满足。我曾经调试过一个芯片,就是因为在布局时把两个寄存器放得太近,结果保持时间全红了——那叫一个头疼。

2.3 建立时间与保持时间的关系

这两个时间参数,其实是一个硬币的两面。建立时间管的是“数据别来太晚”,保持时间管的是“数据别走太早”。

用一张图来理解:

CLK DATA 建立时间 (tsu) 保持时间 (th) 时钟沿 数据必须在时钟沿前 tsu 内稳定 数据必须在时钟沿后 th 内保持稳定

这张图很直观。数据信号在时钟沿之前要提前稳定(蓝色区域),在时钟沿之后要继续保持(绿色区域)。两个区域加起来,就是数据必须稳定的总时间窗口。

2.4 时序路径的组成

好了,有了建立时间和保持时间的概念,我们来看看一条完整的时序路径长什么样。

一条典型的时序路径,由三部分组成:

  1. 起始点(Start Point):通常是触发器的时钟引脚,或者是输入端口
  2. 组合逻辑路径(Combinational Logic Path):从起始点到终点之间的所有逻辑门和连线
  3. 终点(End Point):通常是触发器的数据输入引脚,或者是输出端口

路径分类:

  • 寄存器到寄存器(Reg-to-Reg):最常用的路径,从触发器到触发器
  • 输入到寄存器(Input-to-Reg):从芯片输入端口到内部触发器
  • 寄存器到输出(Reg-to-Output):从内部触发器到芯片输出端口
  • 输入到输出(Input-to-Output):纯组合逻辑路径

我画个结构图,帮你理清思路:

FF1 D Q 时钟网络 (Clock Network) 组合逻辑 (Combinational) FF2 D Q 起始点 终点 数据路径 Tclk2q + Tcomb + Tsetup ≤ Tclk

你看,数据从 FF1 的 Q 端输出,经过组合逻辑,到达 FF2 的 D 端。时钟同时驱动两个触发器。这条路径能不能正常工作,就看数据到达 FF2 的时间是否满足建立时间和保持时间的要求。

我的习惯: 在做时序分析时,我通常会先画出路径图,标出每个节点的延迟。这样一眼就能看出哪段路径是瓶颈。特别是跨时钟域时,路径上的组合逻辑越少越好——我一般控制在 3 级以内。

2.5 建立时间与保持时间的检查公式

做时序分析,说白了就是算两个不等式:

检查项 公式 说明
建立时间检查 Tclk2q + Tcomb + Tsu ≤ Tclk 数据传播延迟 + 建立时间 ≤ 时钟周期
保持时间检查 Tclk2q + Tcomb ≥ Th 数据传播延迟 ≥ 保持时间

其中:

  • Tclk2q:触发器的时钟到输出延迟
  • Tcomb:组合逻辑路径延迟
  • Tsu:终点的建立时间
  • Th:终点的保持时间
  • Tclk:时钟周期

避坑指南: 我曾经犯过一个错误——只检查了建立时间,忽略了保持时间。结果芯片在低温下工作正常,高温下就出错了。后来一查,是保持时间在高温下变差了。记住:建立时间决定最高频率,保持时间决定能否正常工作。两个都得查。

2.6 跨时钟域中的特殊考虑

在跨时钟域场景下,建立时间和保持时间的问题会更复杂。因为两个时钟的频率和相位都可能不同,数据到达的时间不确定性更大。

举个例子,如果数据从 100MHz 时钟域传到 50MHz 时钟域,数据可能在 50MHz 时钟域的任何时刻到达。这时候,建立时间和保持时间的裕量就很难保证。

常用的解决办法:

  • 两级同步器:降低亚稳态概率,但不能完全消除
  • 握手协议:通过控制信号确保数据稳定后再采样
  • 异步FIFO:用格雷码指针,彻底解决跨时钟域问题

我的建议: 如果你在做跨时钟域设计,别指望靠时序约束来解决所有问题。最好的办法是从架构上避免——能用同步设计就用同步设计,实在不行再用异步FIFO。我见过太多项目,因为跨时钟域没处理好,最后流片回来一堆问题。

好了,建立时间和保持时间就讲到这里。这两个概念是时序分析的根基,你理解得越深,后面做跨时钟域约束就越顺手。记住:建立时间管的是“别迟到”,保持时间管的是“别早退”。

本章小结:

  • 建立时间:时钟沿前数据必须稳定的时间
  • 保持时间:时钟沿后数据必须保持的时间
  • 时序路径:起始点 → 组合逻辑 → 终点
  • 检查公式:建立时间看周期,保持时间看延迟

可可精品资料库