建立保持时间与亚稳态深入
更新时间:2026-09-10。本文是「芯片设计 · 进阶层(intermediate)」数字逻辑基础收尾篇。入门 锁存器与触发器 只点了 setup/hold 的名,本篇把它升级为可量化、可设计的判据,工程收口于 CDC 基础、异步 FIFO 与 复位设计。
这一篇在体系里的位置
建立/保持是单触发器的时序契约,亚稳态是违反契约的物理后果,CDC 是"异步世界如何安全交互"的系统解法。本篇处在三者中间,给出为什么与量化直觉,让 CDC 篇里的"打两拍""用 Gray 码"不再是教条。
本文要回答的问题
- 建立/保持时间在触发器内部是怎么产生的(主锁存器采样窗口)?
- 亚稳态是什么?亚稳窗口、收敛时间常数 τ、为什么最终会随机落定?
- MTBF 公式里哪些项决定可靠性?为什么两级同步器能把 MTBF 提到极长,却仍非零?
- 单 bit 能打拍,多 bit 总线为什么不行(可能采样到变化中途的组合)?握手、Gray、异步 FIFO 各自适用场景?
- 复位也有类似约束吗?recovery/removal 与异步断言同步释放是什么关系?
- 高频率、低电压、先进工艺下亚稳态窗口怎么变化?
一、建立/保持时间的电路来源:主从锁存的采样窗口
边沿 D 触发器由两级锁存器串联:时钟低电平期间主锁存器透明、从锁存器保持;上升沿瞬间主级关门、从级打开,把主级采到的值送到 Q。数据要被正确捕获,必须在主级关门之前就通过输入传输管、把内部节点充放电到正确电平——这段提前量叫建立时间(setup time);沿后主级输入管不会瞬间关断,数据还须多保持一会儿,免得新旧值在门内「打架」——这段时间叫保持时间(hold time)。
所以 setup/hold 不是工具的规矩,而是触发器内部晶体管开关的物理窗口。标准单元库 .lib 为每个触发器给出 setup/hold 时序弧,STA 逐拍沿做两条方向相反的检查:
| 检查 | 物理含义 | 直观不等式(暂忽略 skew) |
|---|---|---|
| setup(捕获沿前数据须就绪) | 路径不能太慢 | T_clk ≥ t_co + t_logic + t_setup |
| hold(沿后旧数据别太快穿到下一级) | 路径不能太快 | t_co(min) + t_logic(min) ≥ t_hold |
setup 违例靠降频、插流水线、减逻辑层级修;hold 违例靠在过快路径上插延迟缓冲修,且与时钟周期无关——频率降到 1 MHz,hold 违例照样在。时钟偏斜 skew 同时进入两个式子(一端放松、另一端收紧),这正是 CTS 时钟树拼命压 skew 的原因;报告读法见 STA 入门、SDC 约束、STA 报告解读。
二、亚稳态:双稳态器件的「第三平衡点」
触发器核心是两个交叉耦合反相器,它有两个稳定态(0、1),还存在一个数学上的第三点:两个反相器都停在开关阈值附近、电压不高不低——这是个不稳定平衡点,像停在山顶正中央的小球。数据恰在采样窗口内跳变时,触发器可能被「踢」到这个山顶:Q 既非 0 也非 1,徘徊一段后才随机滚向 0 或 1。
这段徘徊时间叫分辨时间(resolution time),收敛近似指数过程 ΔV(t) = ΔV₀·e^(t/τ),τ 由触发器增益、负载和 PVT 决定。三条必须接受的事实:
- 收敛方向随机:落 0 落 1 无法预测;
- 收敛时间随机:多数很快,但分布带长尾,偶尔超过一个时钟周期,下一级就会采到中间电平并把错误传播开;
- 不可消灭、只能压概率:只要存在与采样时钟异步的输入,风险永不为零。
这也解释了它为什么是工程师最怕的 bug:RTL 仿真里几乎不出现、上硅后偶发难复现,与纯逻辑功能对错无关。
三、MTBF 与两级同步器
风险大小用平均无故障时间 MTBF 衡量,经典模型:
e^(tr/τ)
MTBF = ─────────────────────────────
fc · fd · T0fc:接收时钟频率;fd:异步数据翻转率;T0、τ:触发器的亚稳态参数(工艺库给出,τ 量级几十 ps);tr:留给第一级分辨亚稳态的时间——设计师唯一能动手的项。
单级触发器时 tr 只有「路径剩余时间」,MTBF 可能只有几天甚至几小时;在后面再串一级触发器,第一级万一亚稳,就有整整一个目的时钟周期去收敛,第二级采到的几乎总是干净值。tr 增加约一个周期,指数项 e^(tr/τ) 爆炸式增大,MTBF 从「几天」跳到「几千年」量级;高频、先进工艺可加到三级。
同步器四条铁律:①两级都用目的时钟;②两级之间不许插任何组合逻辑(会吃掉分辨时间);③第一级输出不得另接扇出;④用库同步器单元或加 ASYNC_REG/syn_keep 属性,防止综合优化把两拍合并打散。
同步器只保证「最终收敛到合法电平」,不保证不丢信号:比目的周期还短的脉冲可能根本采不到。跨域要传电平或翻转事件,窄脉冲先展宽(详见 CDC 基础)。
四、多 bit 为什么不能逐位打拍
单 bit 打两拍安全,多 bit 总线逐位打拍是错的:各位的线延迟、两级触发器各自的收敛时间互不相同,目的域可能采到「高 bit 已是新值、低 bit 还是旧值」的中间组合。二进制 0111→1000 一拍翻 4 位,采到 1111 或 0000 都可能,值完全非法。三条标准出路:
| 方案 | 机理 | 适用场景 |
|---|---|---|
| req/ack 握手(DMUX) | 只有单 bit 的 req 打两拍;数据总线在握手期间保持稳定,目的端同步到 req 后整字一次采样 | 低速、任意位宽的配置/状态字 |
| Gray 码 + 同步器 | 相邻码每次只变 1 bit,采到旧值或新值都合法 | 连续递增/递减的 FIFO 读写指针 |
| 异步 FIFO | 双口 RAM 缓冲 + Gray 指针 + 跨域空满比较,数据本身不直接跨域 | 高速、流式数据 |
共同本质:让跨时钟域边界每拍只有一个 bit 在变,或在数据保持不变时才采样。脉冲跨域则在源端 toggle 翻转、目的端边沿检测还原。实现细节见 异步 FIFO 与 Gray 码指针、FIFO 深度计算、valid/ready 握手。
五、复位侧的对应物:recovery / removal
复位的断言与释放也有采样窗口,和 setup/hold 严格对应:
- recovery time(恢复时间):异步复位撤销(deassert)必须早于下一个时钟沿多久,触发器才能可靠恢复——复位侧的 setup;
- removal time(移除时间):复位断言(assert)后至少保持多久,复位才可靠生效——复位侧的 hold。
若异步复位恰在时钟沿附近释放,同一片触发器可能一部分采到「已释放」、一部分仍在复位,FSM 起不来或计数器值错乱。标准写法是异步断言、同步释放(async assert, sync deassert):复位源直接接异步复位脚(任何时刻都能立刻复位),释放动作先过目的时钟的两到三级触发器链,对齐到时钟沿后再供往全片,并满足 recovery 检查。多时钟域共用一个异步复位源、各自做一套同步释放链。完整拓扑、复位顺序与 RDC 检查见 复位设计。
六、PVT 影响与工程签核
亚稳时间常数 τ 随工艺/电压/温度漂移:低电压时反相器增益变弱、τ 显著增大,DVFS 低压点和先进工艺必须按最坏角复核 MTBF;低温、慢角同样恶化。工程上的处置:
- CDC/RDC 路径本就没有可满足的常规时序关系,SDC 用
set_clock_groups -asynchronous/set_false_path显式切断,但同步器两级要被工具识别、不得优化,并单独用库亚稳参数核 MTBF; - 芯片异步输入管脚(按键、外部中断、来自异步时钟域的信号)默认先进同步器,再进任何功能逻辑;
- 多路同步后信号再汇聚(reconvergence)须按同拍同源规则设计,防止各自收敛时间不同制造新的不一致;
- 亚稳态是概率事件、仿真难覆盖,必须过 Spyglass CDC / Questa CDC 一类静态签核:查单 bit 有无同步器、同步器间有无组合逻辑、多 bit 是否走 Gray/握手/FIFO、复位释放是否同步。
知识脉络
与现有篇目的衔接
总结
一句话总结:建立/保持时间是主从触发器内部晶体管开关的物理采样窗口——数据须在沿前 setup 内就绪(路径不能太慢,STA 按 T ≥ t_co+t_logic+t_setup 查)、沿后 hold 内不变(路径不能太快,近路径要插缓冲,且 hold 违例与频率无关);一旦违反,交叉耦合反相器可能停在非 0 非 1 的亚稳平衡点,经随机的指数收敛时间后随机落定,方向和时长都不可预测、仿真难复现;其概率用 MTBF = e^(tr/τ)/(fc·fd·T0) 量化,设计师唯一的抓手是分辨时间 tr——两级触发器同步器让第一级拥有一整个周期去收敛,把 MTBF 从几天指数级抬到几千年,但两拍之间不能插组合逻辑、不能只打一级、要用库同步器单元并过 CDC 静态签核;多 bit 总线逐位打拍必错(各 bit 收敛不同步会采到非法中间值),只能走 req/ack 握手(低速整字)、Gray 码(FIFO 指针每次只变 1 bit)或异步 FIFO(高速流);复位侧的 recovery/removal 是 setup/hold 的翻版,工程定式是「异步断言、同步释放」加每时钟域独立同步链;低电压、先进工艺会让 τ 恶化,必须按坏角复核——理解亚稳态不可消灭、只能用结构把概率压到可接受,才真正掌握了跨时钟域设计的第一性原理。