第三章CDC/RDC 时钟域与复位域交叉验证
CDC 基本概念
时钟域交叉是指信号从一个时钟域传递到另一个时钟域的情况。当两个时钟是异步的或频率/相位不同时,如果没有正确的同步,会导致亚稳态(metastability)问题。
时钟域(Clock Domains)
设计中由同一个时钟驱动的寄存器属于同一个时钟域。SoC 通常包含多个时钟域(如 CPU 时钟、总线时钟、外设时钟等)。
亚稳态(Metastability)
当触发器的建立/保持时间不满足时,输出可能进入亚稳态——既不是 0 也不是 1。在跨时钟域路径上,如果没有同步器,亚稳态可能传播导致功能错误。
Glitch(毛刺)
跨时钟域的组合逻辑路径可能产生毛刺,在目标时钟域被错误采样。CDC 信号应该直接通过寄存器输出,不应经过组合逻辑。
数据一致性(Data Coherency)
多 bit 信号跨时钟域时,即使每个 bit 都同步了,由于各个 bit 的延迟不同,目标时钟域可能采样到不一致的数据。
- 汇聚:多个 CDC 信号汇聚到同一个逻辑,需要确保它们的一致性
- 发散:一个信号分发到多个同步器,可能导致不同的同步延迟
RDC(Reset Domain Crossing)
复位域交叉类似于 CDC,但发生在不同复位域之间。
- 复位信号跨时钟域传递
- 同一时钟域内的不同复位域之间的信号交叉
常见同步方案(Synchronization Schemes)
控制信号同步
- 2-FF Synchronizer(两级触发器同步器):最基本的单 bit 控制信号同步方案,用两级串联的触发器降低亚稳态传播概率
- 3-FF Synchronizer:在高可靠性要求下使用三级触发器
- Handshake Synchronization(握手同步):通过 req/ack 握手协议确保数据正确传输
数据信号同步
- Enable-based MUX Synchronizer:控制信号同步后选通数据
- Async FIFO(异步 FIFO):跨时钟域数据传输的标准方案,使用 Gray 码指针
- DMI (Data-Mover Interface):专用的数据传输接口
复位同步方案
- Reset Synchronizer:异步复位的同步释放
CDC App 工作流程
- CDC Configuration:配置时钟、复位和 CDC 参数
- Structural Analysis(结构分析):自动检测跨时钟域路径,识别同步器
- Functional Analysis(功能分析):验证同步器协议正确性
- Metastability Analysis(亚稳态分析):注入亚稳态,验证设计的容错性
CDC 意图捕获(Capturing CDC Intent)
时钟声明
# 声明时钟
clock -clk {clk1 clk2} -module top
# 声明异步时钟关系
clock -async -group {clk1} -group {clk2}
复位声明
reset -rst {rstN} -active_low -async
路径参数配置
通过 CDC Rules File 或命令配置路径参数:
- Constants:常量信号(不会变化,不需要同步)
- Quasi Statics:准静态信号(变化极慢,不认为是 CDC 问题)
- Mutually Toggle Exclusive (MUTEX):互斥切换信号(同一时间只有一个激活)
- Gray Coded:Gray 码信号(每次只变一位,可以直接同步)
- CDC False Path:伪路径(确认安全的 CDC 路径)
- Externally Synchronized:外部已同步的路径
用户自定义同步器
# 基于模块的同步器
cdc_synchronizer -module sync2ff -din d -dout q -clk clk -rst_n rstN
# 基于实例的同步器
cdc_synchronizer -instance top.u_sync -din d -dout q -clk clk
# 自定义同步器
cdc_synchronizer -type user_sync -din data_in -dout data_out
运行 CDC 分析
结构分析
# 运行 CDC 结构检查
check_cdc -structural
# 运行 RDC 结构检查
check_rdc -structural
功能分析(Protocol Check)
# 在 Formal 模式下运行协议检查
check_cdc -protocol -formal
# 在 Simulation 模式下运行协议检查
check_cdc -protocol -sim
亚稳态注入(Metastability Injection, MSI)
# Formal 模式 MSI
check_cdc -msi -formal
# Simulation 模式 MSI
check_cdc -msi -sim
调试 CDC 违规
- CDC Violation Tree:以树形结构展示违规路径和原因
- Schematic+Graph:原理图视图可视化 CDC 路径
- Visualize:查看违规波形
Waiver 管理
# 单个违规豁免
waive_cdc -violation <id> -reason "2-FF synchronizer present"
# 成组豁免
waive_cdc -group <group_name>
# 按层级豁免
waive_cdc -hierarchy top.submodule
# 条件豁免(表达式)
waive_cdc -condition {mode == TEST}
# 自动/安全豁免流程
check_cdc -auto_waive
Waiver 可以导出/导入,便于团队协作和回归管理。
附录概要
- Appendix A:CDC Parameters(所有 CDC 参数的详细说明)
- Appendix B:CDC Violations(所有违规类型及含义)
- Appendix C:Customizing the Rules File(规则文件定制语法)
- Appendix D:Supported SDC Commands(支持的 SDC 时钟约束命令)
CDC/RDC 更多界面截图
CDC 验证方法论
为什么传统仿真难以发现 CDC 问题
跨时钟域(CDC)问题的根本原因是亚稳态(metastability):当信号在一个时钟域变化、被另一个时钟域采样时,如果变化恰好落在采样时钟的建立/保持时间窗口内,输出端会进入亚稳态。亚稳态是物理现象,RTL 仿真使用 0/1/X 三值模型,无法真实模拟亚稳态行为。因此:
- RTL 仿真中亚稳态表现为 X 值,但在实际硅片中可能传播为 0 或 1 的任意值
- 门级仿真虽然更精确,但速度太慢无法穷举所有 CDC 场景
- 形式验证是 CDC 验证的黄金标准:能穷尽分析所有跨域路径的同步正确性
三级验证各解决什么问题
| 级别 | 检查内容 | 能发现 | 不能发现 |
|---|---|---|---|
| Structural(结构检查) | 识别跨域路径、同步器结构 | 完全缺少同步器的路径 | 同步器逻辑本身有 bug(如使能信号错误) |
| Protocol(协议检查) | 验证同步器行为正确 | 同步器设计错误、握手协议违规 | 亚稳态穿透同步器传播 |
| MSI(亚稳态注入) | 在同步器第一级注入 X,验证不传播 | 同步器不足以阻止亚稳态传播 | ——(最严格的检查) |
建议:不要只做 Structural 检查就 signoff。Structural 只确认"有同步器",Protocol 确认"同步器对不对",MSI 确认"同步器能拦住亚稳态"。三级都通过才算 CDC 验证完成。
CDC 验证常见误区
- 只做结构检查不做 MSI:结构正确的同步器可能在极端情况下失效(如同步器使能信号本身跨域)
- 漏掉收敛逻辑:多个跨域信号收敛到同一逻辑时,单独同步正确但组合后可能出错
- Waiver 滥用:将无法解释的违规标记为"waived"而不真正分析根因。waiver 必须有充分理由,最好使用条件 waiver(-expression 指定安全条件)
- 忽视复位同步:异步复位释放也需要同步,否则不同时钟域的复位解除时间不确定
Waiver 策略
什么时候可以 waive CDC 违规?
- 信号在系统级已被外部逻辑同步(需要文档证明)
- 多 bit 信号使用格雷码编码,虽然每位单独跨域但每次只有一位变化
- 使用条件 waiver 指定安全条件(如"当 write_en==1 时信号是稳定的")
来源文档
jaspergold_cdc_userguide.pdfjaspergold_cdc_reference.pdfexample_jaspergold_apps/CDC/