跨时钟域为什么要两级触发器?级数怎么权衡?
更新时间:2026-09-21。问题驱动短答页。亚稳态见 metastability,CDC 总论见 跨时钟域处理,建立保持见 setup/hold。
一句话回答
异步信号可能在时钟沿正跳变的窗口内到达,第一级触发器的建立/保持时间被破坏,输出会进入既非 0 也非 1 的亚稳态,需要一段“收敛时间”才随机稳定到 0 或 1。单级时下游逻辑可能直接拿到这个不确定值;串两级触发器后,第一级有整整一个时钟周期去完成亚稳收敛,第二级再采样,能把错误传播概率降到极低,这就是经典“两级同步器”。级数越深、可用收敛时间越长、平均无故障时间 MTBF 越高,但每加一级多一个周期延迟;多比特和脉冲不能这么处理,要靠握手或异步 FIFO。
结构
verilog
always @(posedge dst_clk or negedge rst_n)
if (!rst_n) begin s1 <= 1'b0; s2 <= 1'b0; end
else begin s1 <= async_in; s2 <= s1; end
assign sync_out = s2;s1:可能亚稳的一级,给它时间收敛。s2:采已收敛的值给下游使用。- 高可靠/高频/先进工艺可加到 3、4 级。
MTBF 直觉
同步失效概率大致随可用收敛时间指数下降:
- 可用时间 ≈ 时钟周期 − 第一级 clk→Q − 第二级建立时间;
- 器件有亚稳收敛时间常数 τ(越小越好);
- 信号跳变频率、时钟频率越高,进入亚稳的机会越多。
周期越短(频率越高)、留给收敛的时间越少、MTBF 越低,所以高速设计常需加深级数或用专用同步单元。目标是把 MTBF 做到远超产品寿命(如多年才可能一次)。
适用边界
- 只适合单比特、稳定电平/控制位:多比特总线逐位打拍会因各 bit skew 采到“中间组合值”。
- 单周期脉冲会漏采:要用 toggle 脉冲同步器,见 脉冲跨域。
- 多比特数据/突发:用异步 FIFO(格雷码指针,见 异步 FIFO 格雷码)或 req/ack 握手。
- 复位释放走专用复位同步器,见 异步复位同步释放。
常见坑
- 只打一级触发器就当下游可用。
- 工具优化把两级同步合并/重定时,破坏收敛时间;应标 ASYNC_REG / 同步器属性约束。
- 给多位数据每一位各加两级同步,采到不一致的组合。
- 两级之间布线延迟过大,吃掉收敛余量。
总结
跨域信号在第一级触发器可能违反建立保持进入亚稳态,需要时间收敛,第二级给足一整个周期再采样,把错误概率降到 MTBF 远超寿命;时钟越快、留给亚稳收敛的时间越短,就需要更多级数,但代价是逐级增加延迟,而且两级同步只适用于单比特稳定电平,脉冲要 toggle 化、多比特要 FIFO 或握手,绝不能逐位打拍。