第三章CDC/RDC 时钟域与复位域交叉验证
CDC 基本概念
时钟域交叉是指信号从一个时钟域传递到另一个时钟域的情况。当两个时钟是异步的或频率/相位不同时,如果没有正确的同步,会导致亚稳态(metastability)问题。
时钟域(Clock Domains)
设计中由同一个时钟驱动的寄存器属于同一个时钟域。SoC 通常包含多个时钟域(如 CPU 时钟、总线时钟、外设时钟等)。
亚稳态(Metastability)
当触发器的建立/保持时间不满足时,输出可能进入亚稳态——既不是 0 也不是 1。在跨时钟域路径上,如果没有同步器,亚稳态可能传播导致功能错误。
Glitch(毛刺)
CDC 路径上的任何逻辑都可能产生毛刺,并在下游造成功能错误。文档给出的例子:两条路径 T1 和 T2 的延迟不同,导致 T3 出现瞬时的高电平跳变,而这个跳变可能被采样时钟捕获。
数据一致性 — 汇聚(Data Coherency – Convergence)
文档对 Convergence 的定义是:一组信号、或同一信号的不同 bit,来自相同或不同的时钟域,在同步之后汇聚到目的时钟域的某个组合逻辑中。注意这里包含两种情形——不同源信号的汇聚,以及同一源信号不同 bit 的汇聚。
工具以 CDC group 为单位报告汇聚问题:一个 CDC group 由汇聚到该组合逻辑的那些 CDC pair、以及其后的那个触发器组成。
发散(Divergence)
发散到多条同步路径的逻辑可能造成功能错误。文档给出的例子:传播延迟和不同的亚稳态稳定时间(metastable settling times),可能使 FSM1_en 与 FSM2_en 在不同的时刻开始。
此外,亚稳态信号本身是需要被正确同步的不稳定信号——例如 OUT1 和 OUT2 会在不同的时钟沿出现,因为这些亚稳态信号在两个触发器上的稳定与锁存发生在不同的时间。
RDC(Reset Domain Crossing)
复位域交叉类似于 CDC,但发生在不同复位域之间。
- 复位信号跨时钟域传递
- 同一时钟域内的不同复位域之间的信号交叉
data_1 与 data_2 由 sclk 域的两个触发器(d2、d3)发出,各自经一组 NDFF 同步器(n0、n1)进入 dclk 域,同步后的 sync_data_1 与 sync_data_2 汇入同一个与门,再打入 d4。两条路径的亚稳态稳定时间不同,汇聚点就可能取到本不该同时出现的组合——这正是收敛类违规要检查的场景常见同步方案(Synchronization Schemes)
控制信号同步
- NDFF Synchronizer(多级触发器同步器):最基本的单 bit 控制信号同步方案。最简单的 NDFF 同步器使用 2 个 DFF,也可以增加触发器级数来提高平均无故障时间(MTBF)
- Handshake Synchronization(握手同步):通过握手协议确保数据正确传输
数据同步方案(Data Synchronization Schemes)
- MUX_NDFF 与 MUX_PULSE:控制信号同步后选通数据
- FIFO(异步 FIFO):跨时钟域数据传输的标准方案,使用 Gray 码指针
- Synchronization Enabler:使能式同步
- Glitch Protector(AND-Based Synchronizer):基于与门的毛刺保护同步器
- NDFF_BUS:总线型多级触发器同步
复位同步方案
- Reset Synchronizer:异步复位的同步释放
CDC App 工作流程
- CDC Configuration:配置时钟、复位和 CDC 参数
- Structural Analysis(结构分析):自动检测跨时钟域路径,识别同步器
- Functional Analysis(功能分析):验证同步器协议正确性
- Metastability Analysis(亚稳态分析):注入亚稳态,验证设计的容错性
CDC 意图捕获(Capturing CDC Intent)
时钟声明
# 声明时钟(直接给时钟信号名)
clock clock_control1
clock clock_control2
clock clock_fsm
# 为主输入端口做时钟关联(clock rating)
clock -rate {en_control load_data data_in control_sig} clock_control1
clock -rate {en_fsm reg_mode reg_addr reg_wdata} clock_fsm
# 为黑盒输入端口指定时钟域
check_cdc -clock_domain -port {u_regbank.paddr_i} -clock_signal clock_control1
# 查找时钟域 / 合并时钟域
check_cdc -clock_domain -find
check_cdc -clock_domain -join jg_clock_fsm_aux -into jg_clock_fsm
时钟分组用 check_cdc -clock_group,例如 check_cdc -clock_group -sync {{clock1 clock2} {clock3}} -name sync_groups。
复位声明
复位的低有效(active-low)不是用选项表达的,而是直接在信号名前加 ~:
reset ~reset_n_control1 ~reset_n_control2 ~reset_n_fsm
路径参数配置
通过 CDC Rules File 或命令配置路径参数:
- Constants:常量信号(不会变化,不需要同步)
- Quasi Statics:准静态信号(变化极慢,不认为是 CDC 问题)
- Mutually Toggle Exclusive (MUTEX):互斥切换信号(同一时间只有一个激活)
- Gray Coded:Gray 码信号(每次只变一位,可以直接同步)
- CDC False Path:伪路径(确认安全的 CDC 路径)
- Externally Synchronized:外部已同步的路径
用户自定义同步器
# 基于模块的同步器:把某个模块声明为指定方案
check_cdc -scheme -add fifo -module afifo
# 基于实例的同步器:用 -map 把方案的各个角色映射到具体信号
check_cdc -scheme -add FIFO -map {{Wfull ctrl2fsm_fifo_sync.wfull} \
{Rempty ctrl2fsm_fifo_sync.rempty} \
{Winc ctrl2fsm_fifo_sync.winc} \
{Rinc ctrl2fsm_fifo_sync.rinc} \
{Wptr ctrl2fsm_fifo_sync.write_control.wptr} \
{Rptr ctrl2fsm_fifo_sync.read_control.rptr} \
{Wdata ctrl2fsm_fifo_sync.wdata} \
{Rdata ctrl2fsm_fifo_sync.rdata}}
# 自定义方案
check_cdc -scheme -create my_mux -formal_list {in dout ctrl clk}
# 打开 FIFO 同步器自动识别
check_cdc -check -rule -set {{fifo_detection true}}
运行 CDC 分析
结构分析
# 查找 CDC 路径对
check_cdc -pair -find
# 查找同步器并运行结构检查
check_cdc -scheme -find
# 查找收敛(convergence)
check_cdc -group -find
# 复位分析(RDC)
check_cdc -reset -find
check_cdc -reset -find;命令手册特别提示,复位同步器要用 check_cdc -reset -find 查找,而不是像其他同步器那样用 check_cdc -scheme -find。功能分析(Protocol Check)
# 生成并证明协议检查
check_cdc -protocol_check -generate
check_cdc -protocol_check -prove
# 信号配置检查
check_cdc -signal_config -prove
# 导出协议检查供仿真使用
check_cdc -protocol_check -export -file $PROJ_DIR/cdc_properties.svp -force
亚稳态注入(Metastability Injection, MSI)
# Formal 模式:注入并证明
prove -task {<embedded>}
check_cdc -metastability -inject
check_cdc -metastability -prove
# 导出控制文件,供仿真中做亚稳态注入
check_cdc -metastability -export -time_window 1
调试 CDC 违规
- CDC Violation Tree:以树形结构展示违规路径和原因
- Schematic+Graph:原理图视图可视化 CDC 路径
- Visualize:查看违规波形
Waiver 管理
# 手动豁免:先用 -filter 定义过滤器,再交给 -waiver -add
check_cdc -waiver -add -filter [check_cdc -filter -add \
-source_unit reg_addr -destination_unit {u_regbank\.paddr_i} \
-source_clock clock_fsm -destination_clock clock_control1 \
-tag CDC_NO_SYNC] -comment {Input to be synchronized externally}
# 条件豁免:用 -expression 指定豁免成立的条件
set filter_id_pair [check_cdc -filter -add \
-source_unit reg_mode -destination_unit {u_regbank\.pmodsel_i} \
-source_clock clock_fsm -destination_clock clock_control1 -tag CDC_NO_SYNC]
set waiver_id_pair [check_cdc -waiver -add -comment conditional_waiver_safe \
-filter $filter_id_pair -expression {write_en == control_block.write_en}]
# 验证 waiver 是否成立
check_cdc -waiver -generate
check_cdc -waiver -prove
# 查询某条 waiver 为何成立
check_cdc -waiver -why $waiverId
-waiver 的可用子选项为:-add、-edit、-export、-generate、-prove、-why。自动豁免则是通过 CDC Rules File 中的参数 apply_auto_waivers 打开,写法为 params CDC_APP {apply_auto_waivers="True"}。
附录概要
- 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,验证不传播 | 同步器不足以阻止亚稳态传播 | ——(最严格的检查) |
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/