跨时钟域(CDC)怎么处理?
更新时间:2026-09-21。问题驱动短答页。单 bit 亚稳态见 亚稳态是什么,深稿见 CDC 基础 与 异步 FIFO 与 Gray 码。
一句话回答
先分清是单 bit 还是多 bit:单 bit 控制信号用两级(或三级)同步器/握手;多 bit 数据用异步 FIFO、Gray 码或请求-应答握手,绝不能把总线每位各打两拍。 根源是异步时钟下采样点不可控,既会亚稳也会采到「半新半旧」的数据。
按信号类型选方案
| 场景 | 推荐方法 |
|---|---|
| 单 bit 电平/使能 | 两级同步器(打两拍) |
| 单 bit 脉冲(可能短于目标周期) | 边沿检测同步器 / 脉冲展宽 / toggle 同步 |
| 多 bit 数据、高速流 | 异步 FIFO(指针用 Gray 码跨域) |
| 多 bit、低速、要求可靠 | req-ack 握手(双向同步) |
| 计数器跨域 | 转 Gray 码后再打两拍 |
为什么多 bit 不能逐位打拍
同步器只保证每个 bit「最终稳定到 0 或 1」,但各位跳变时刻不同、亚稳恢复也不同步。总线从 0111 变 1000 时,接收端可能采到任意中间组合,出现从不存在的数据。Gray 码让每次计数只有 1 bit 翻转,配合打拍就不会出现非法中间值,这是异步 FIFO 指针跨域的标准做法。
典型:异步 FIFO
读写各在自己的时钟域,通过互相打拍的 Gray 码读写指针比较产生空满标志;存储用双口 RAM。它天然解耦两边速率,是高速数据流的主力,深稿见 异步 FIFO Gray 码指针,深度怎么算见 FIFO 深度怎么计算。
必须做:CDC 静态检查
CDC 问题是概率性、依赖时序的,普通仿真很难覆盖,流片后才暴露代价极大。要用 SpyGlass CDC / Mentor Reconvergence 一类工具静态扫描,关注报告里的违例类型,验证侧分诊见 CDC/RDC 报告分诊;同时在 SDC 里对跨域路径 set_false_path 或设异步时钟组,避免工具按同步路径硬收敛。
常见坑
- 多位总线逐位打两拍:数据可能半新半旧。
- 同步器中间信号又被别处使用:打拍节点必须「专用」,不能扇出到多个地方。
- 漏做 CDC 约束:综合/STA 把异步路径当同步,时序结果无意义。
- 用同一个复位但异步释放:复位撤离本身也跨域,需同步释放。
- 只靠仿真拍脑袋:没有 CDC 静态检查签核不算完成。
总结
CDC 的本质是异步时钟域间采样不可控,既有亚稳态又有多 bit 不一致;单 bit 用电平两级同步、短脉冲用 toggle/展宽同步,多 bit 高速数据用异步 FIFO(Gray 码指针每次只翻一位)、低速可靠传输用 req-ack 握手,计数器先转 Gray 再跨域,绝不能把数据总线逐位打拍;最后必须用 CDC 静态检查工具签核并在约束里把跨域路径设为 false_path/异步时钟组,因为这类问题概率性强、仿真覆盖不到。