跨时钟域 CDC 基础:亚稳态、两级同步器与多 bit 怎么办
更新时间:2026-09-06。本文是「集成电路大类 · 芯片设计」进阶层(intermediate)第八篇新正文(#10)。真实芯片从不只有一个时钟:CPU 几百 MHz、DDR 接口另一套频率、UART 几十 MHz、PCIe SerDes 又是恢复时钟——模块间信号必然跨时钟域(CDC, Clock Domain Crossing)。入门层 时钟与复位入门 讲了时钟是什么,这一篇讲域与域之间怎么安全过信号。多 bit 跨域的标准答案异步 FIFO 见 下一篇(#11),复位与时钟域的配合见 复位设计(#12)。
本文要回答的问题
- 什么是亚稳态?为什么它偶发、难复现、害死人?
- 单 bit 信号跨域为什么打两拍就安全?打一拍行不行?
- 一个时钟脉冲怎么跨到另一个域?
- 多 bit 总线为什么不能逐位同步?怎么办?
一、亚稳态:触发器的「薛定谔输出」
触发器要求输入在采样沿前后 setup/hold 窗口内稳定(回顾 STA 概念)。若跨域信号恰在窗口内跳变,采样结果既不干脆是 0 也不干脆是 1,输出会停在中间电平一段时间才收敛到 0 或 1——这段时间叫 resolution time。收敛方向是随机的,收敛时间可能超过一个时钟周期:下一级触发器再采到中间电平,就可能传播错误值,导致整条逻辑链行为异常——仿真里极少出现、芯片上偶发难复现,是数字工程师最怕的 bug 类型之一。
亚稳态不能消灭,只能把概率压低。平均无故障时间 MTBF ≈ e^(tr/τ) /(f_clk × f_data × 参数),tr(留给收敛的时间)每增加一级触发器的延迟,MTBF 指数级增长。
二、单 bit:两级触发器同步器
标准做法:目的域用两级串联 D 触发器采样跨域信号。第一级可能进入亚稳态,但有整整一个目的时钟周期去收敛;到第二级采样时,输出已是稳定 0/1,失败概率从「每月几次」降到「几千年一次」的可接受水平。
注意:同步器只保证「最终收敛到合法电平」,不保证不丢信号——若源脉冲比目的时钟周期还短,可能根本采不到。所以跨域的应该是电平/状态,不是窄脉冲。
三、脉冲跨域:toggle + 边沿检测
要把源域一个「只持续一拍」的脉冲传到目的域(如「启动一次 DMA」的请求),标准电路:源域每来脉冲把一个 toggle 寄存器翻转一次(电平翻转天然足够宽);该电平经 2-FF 同步到目的域;目的域对同步后的信号做边沿检测(当前值 ≠ 上一拍值),检出的脉冲就在目的域的时钟拍上。双向则用 req/ack 握手:源发 req → 目的同步到、处理完回 ack → 源同步到 ack 后允许发下一次,天然带流控。
四、多 bit 为什么不能逐位同步
数据总线(地址、计数值、状态向量)跨域时,逐 bit 各打两拍是错的:每 bit 的线延迟和收敛路径略有差异,目的域可能采到「高 bit 已变、低 bit 未变」的中间组合——例如二进制 0111→1000 跳变中采到 1111 或 0000,值完全错误。三条出路:
| 方案 | 适用 | 要点 |
|---|---|---|
| Gray 码计数器 + 2-FF | 连续递增/递减值(FIFO 指针) | 每次只变 1 bit,采到旧值或新值都合法 → 异步 FIFO 的核心(#11) |
| 握手(req/ack DMUX) | 低速、任意多位数据 | 源域把数据放稳 → 拉 req;目的域同步到 req 才一次性采样整个总线(此时数据已稳定多拍)→ 回 ack;期间数据保持不变 |
| 异步 FIFO | 高速、流式多 bit | 双口 RAM 缓冲 + Gray 码指针,见下一篇 |
工程上还有一条铁律:CDC 路径不能做常规时序收敛(两个时钟本就异步,没有时序关系可满足),要在 SDC 里设 set_clock_groups -asynchronous 或 set_false_path 告诉工具别报这条路径的时序(约束写法见进阶 #13),但同步器本身的两级触发器要被工具识别、不得被优化打散。
五、CDC 必须工具签核
CDC bug 仿真难覆盖(亚稳态是概率事件),所以行业惯例是用 Spyglass CDC / Questa CDC 等静态检查签核:它自动识别所有跨域信号,检查「单 bit 是否有同步器、同步器是否被插了组合逻辑、多 bit 是否走了 Gray/握手/FIFO、复位是否跨域安全」(复位问题见 #12、#38)。CDC 报告与 lint、RDC(复位域交叉)一起是流片前的硬性门禁,详见进阶 #38 Lint·CDC·RDC 检查。
相关与延伸
下一篇:多 bit CDC:异步 FIFO 与 Gray 码指针(#11);复位跨域见 复位设计(#12)。入门铺垫:时钟与复位入门、静态时序分析 STA、FIFO 深度计算(同步 FIFO 的深度问题);异步约束写法见进阶 #13 SDC 约束实战,CDC 签核流程见 #38。
总结
CDC 的本质是管理亚稳态:单 bit 电平用两级触发器同步器(一级留足收敛时间、第二级输出稳定),脉冲先 toggle 翻转再边沿检测,多 bit 绝不能逐位同步——走 Gray 码(连续值)、req/ack 握手(低速数据)或异步 FIFO(高速流),最后必须过 Spyglass CDC 静态签核。