亚稳态与 MTBF
一句话回答
异步信号在时钟沿附近变化、不满足建立/保持时间时,触发器输出会卡在非 0 非 1 的亚稳态,要等随机一段时间才稳定;用两级(或更多)触发器做同步器,给亚稳态留出「解析时间」,可把出故障的概率压到极低——这个概率用 MTBF 衡量,而解析时间在 MTBF 公式里是指数项,所以多加一级、降点频效果非常显著。
一、亚稳态怎么发生
- 每个触发器有建立时间 t_su(数据提前稳定)和保持时间 t_h;
- 异步输入(别的时钟域、外部引脚)无法保证这些窗口;
- 一旦违反,输出进入临界平衡点,可能振荡/滞留后才随机落到 0 或 1;
- 若在亚稳期间被下游采样,就可能出现一部分逻辑看到 0、一部分看到 1,系统出错。
二、MTBF 的直觉
常用形式:
bash
MTBF = exp(t_r / τ) / (f_clk · f_data · T0)t_r:给亚稳态的解析时间(同步器第一级到第二级之间接近一个时钟周期);τ:工艺决定的解析时间常数;f_clk·f_data:时钟和数据跳变越频繁,撞上的机会越多;- 关键:t_r 在指数上——加一级同步器、降低采样频率,MTBF 成倍指数增长,因此两级同步通常就能做到「几十年才可能出一次」。
三、同步器
systemverilog
// 单 bit 跨域:两级触发器
always_ff @(posedge dst_clk) begin
q1 <= async_in;
q2 <= q1; // q2 大概率已稳定
end- 不能只打一级:没有解析余量;
- 高频/深亚微米或高可靠要求用三级;
- 多 bit 不能逐位同步(位间延迟不一致会拼错),用握手使能 + 数据保持或异步 FIFO(见 异步 FIFO CDC);
- 同步器要加约束/属性(false path),让工具别用普通时序去卡,但也别优化掉。
常见坑
- 异步信号直接进逻辑:无同步器,MTBF 很差。
- 只打一级:解析时间不足。
- 多 bit 逐位打拍:各位到达时刻不同导致数据撕裂。
- 同步器被综合优化合并:要标 ASYNC_REG/同步器属性保留多级。
- 复位跨域也算 CDC:异步复位释放同样要同步。
- 以为同步器消除亚稳态:它只是把概率降到可接受,数学上不为零,靠 MTBF 工程保证。
总结
违反建立保持会让触发器进入随机时长的亚稳态;两级同步器通过增加指数级解析时间 t_r 把 MTBF 拉到足够大,单 bit 打两拍、多 bit 走握手或异步 FIFO,并加 CDC 约束;同步器不是消灭亚稳态,而是用 MTBF 把故障概率降到工程上可忽略。