第三章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,但发生在不同复位域之间。

收敛(Convergence)示意图
收敛(Convergence)示意:data_1data_2 由 sclk 域的两个触发器(d2、d3)发出,各自经一组 NDFF 同步器(n0、n1)进入 dclk 域,同步后的 sync_data_1sync_data_2 汇入同一个与门,再打入 d4。两条路径的亚稳态稳定时间不同,汇聚点就可能取到本不该同时出现的组合——这正是收敛类违规要检查的场景

常见同步方案(Synchronization Schemes)

控制信号同步

数据同步方案(Data Synchronization Schemes)

复位同步方案

CDC App 工作流程

  1. CDC Configuration:配置时钟、复位和 CDC 参数
  2. Structural Analysis(结构分析):自动检测跨时钟域路径,识别同步器
  3. Functional Analysis(功能分析):验证同步器协议正确性
  4. 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 或命令配置路径参数:

用户自定义同步器

# 基于模块的同步器:把某个模块声明为指定方案
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
关于 RDC:CDC 用户指南把它放在结构分析之下——文档中有专门一节名为 "Structural Analysis – RDC",并指出"复位域交叉(RDC)是数字设计中众所周知的亚稳态来源"。它的入口命令是 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 违规

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"}

附录概要

CDC/RDC 更多界面截图

CDC 验证方法论

为什么传统仿真难以发现 CDC 问题

跨时钟域(CDC)问题的根本原因是亚稳态(metastability):当信号在一个时钟域变化、被另一个时钟域采样时,如果变化恰好落在采样时钟的建立/保持时间窗口内,输出端会进入亚稳态。亚稳态是物理现象,RTL 仿真使用 0/1/X 三值模型,无法真实模拟亚稳态行为。因此:

三级验证各解决什么问题

级别检查内容能发现不能发现
Structural(结构检查)识别跨域路径、同步器结构完全缺少同步器的路径同步器逻辑本身有 bug(如使能信号错误)
Protocol(协议检查)验证同步器行为正确同步器设计错误、握手协议违规亚稳态穿透同步器传播
MSI(亚稳态注入)在同步器第一级注入 X,验证不传播同步器不足以阻止亚稳态传播——(最严格的检查)
建议:不要只做 Structural 检查就 signoff。Structural 只确认"有同步器",Protocol 确认"同步器对不对",MSI 确认"同步器能拦住亚稳态"。三级都通过才算 CDC 验证完成。

CDC 验证常见误区

Waiver 策略

什么时候可以 waive CDC 违规?

来源文档

  • jaspergold_cdc_userguide.pdf
  • jaspergold_cdc_reference.pdf
  • example_jaspergold_apps/CDC/