3. CDC基础与亚稳态机理

跨时钟域(CDC)问题的本质,是信号在从一个时钟域传递到另一个时钟域时,其变化时刻与目的时钟的采样沿之间没有固定相位关系。当源域信号在目的时钟的建立时间(tsu)与保持时间(th)窗口内发生跳变,目的触发器第一级就可能进入既非稳定高电平、也非稳定低电平的中间状态,这就是亚稳态。亚稳态不会永久保持,但它需要一段不确定的恢复时间才能随机地稳定到 0 或 1,这段不确定时间正是 CDC 验证要重点约束的对象。

亚稳态产生的三个必要条件

亚稳态并非“只要跨时钟域就一定发生”,它需要同时满足三个条件:第一,存在异步采样关系,即源信号跳变与目的时钟沿之间无固定相位;第二,跳变落入采样窗口,即信号变化发生在目的触发器 tsu 与 th 构成的孔径时间内;第三,触发器存在正反馈再生过程,其输出在有限时间内无法立即判定为 0 或 1。三者缺一不可。若源信号与目的时钟同源同相,或跳变始终远离采样窗口,亚稳态概率会显著降低,但工程上不能依赖“碰巧避开”,而应通过同步器结构把风险降到可接受水平。

亚稳态的恢复时间通常用时间常数 τ 和分辨率时间 tr 描述。触发器离开亚稳态的概率随时间指数上升,因此多级同步器每增加一级,就把“未恢复”的概率再乘一次。这也是两级触发器同步器成为默认选择的原因。

MTBF 计算:把概率变成可评估的指标

MTBF(平均无故障时间)用于量化同步器失效的平均间隔。常用估算式为:

MTBF = e^(t_r / τ) / (f_clk × f_data × T_0)

其中:
t_r   :留给第一级触发器恢复的可用时间(通常约等于一个目的时钟周期)
τ     :触发器亚稳态时间常数,由工艺与器件决定
f_clk :目的时钟频率
f_data:异步数据跳变频率
T_0   :亚稳态窗口宽度参数,与工艺相关

以 Zynq-7000 为例,假设目的时钟 fclk = 100 MHz,异步数据跳变率 fdata = 1 MHz,τ = 0.05 ns,T0 = 0.1 ns,tr = 10 ns(一个时钟周期)。则指数项 e^(10/0.05) = e^200,数值极大,MTBF 会达到天文数字级别。但若把 fdata 提高到 50 MHz、tr 缩短到 2 ns,MTBF 会急剧下降。这说明:MTBF 对 tr/τ 极其敏感,对数据跳变率也呈线性反比。工程上通常要求 MTBF 大于系统寿命若干数量级,例如 10^9 小时以上。需要强调,上述数值为教学示例假设,实际 τ、T0 应以器件厂商数据手册或时序库为准。

同步器类型选择

不同信号类型需要不同同步策略,不能一律用两级触发器解决:

  • 单比特电平信号:采用两级触发器同步器,第一级可能亚稳态,第二级在下一个时钟沿前完成稳定,输出给目的域逻辑。
  • 单比特脉冲信号:不能直接打两拍,否则窄脉冲可能丢失。应先用源域寄存器展宽脉冲,或使用脉冲同步器(toggle 同步器)把脉冲转换为电平翻转,再在目的域边沿检测还原。
  • 多比特总线:禁止对每位独立打两拍,因为各位亚稳态恢复时间不同,可能在同一目的时钟沿采到“混合值”。应使用异步 FIFO、握手同步或格雷码编码,保证数据一致性。
  • 复位信号:异步复位、同步释放,常用复位同步器,避免复位撤销时产生亚稳态。

选择同步器时,先判断信号是电平、脉冲还是总线,再判断是否需要保持数据一致性,最后结合目的时钟频率和 MTBF 要求确定级数。Zynq 中还可使用 Xilinx 原语如 FDRE、FDCE 配合 ASYNC_REG 属性,帮助工具识别同步寄存器并优化布局。

Zynq 实现约束与 CDC 验证要点

在 Zynq 器件中实现 CDC,除了逻辑正确,还必须满足实现约束。第一,同步器第一级和第二级触发器应尽量放在同一 SLICE 或相邻位置,减少布线延迟差异,Vivado 中可用 ASYNC_REG = "TRUE" 属性标记。第二,跨时钟域路径必须被时序分析正确识别,通常需要设置 set_false_path 或 set_clock_groups -asynchronous,否则工具会按同步路径分析并报大量无法满足的时序。第三,CDC 验证不能只看功能仿真,还要结合静态检查:Vivado 的 report_cdc 可列出跨时钟域路径、同步器类型和未约束路径;report_clock_interaction 可查看时钟对之间的交互关系。

注意:set_false_path 只是告诉时序分析工具“不要按同步关系分析”,并不代表电路自动安全。若没有正确的同步器结构,false path 会掩盖真实亚稳态风险。CDC 约束必须与同步器实现配套使用。

一个典型的验证闭环是:先用 report_cdc 找出所有跨时钟域路径,逐条确认同步器类型;再检查约束是否覆盖这些路径;然后通过仿真注入异步跳变,观察目的域是否出现亚稳态传播或数据不一致;最后结合 MTBF 估算判断同步级数是否足够。对于多比特总线,还要检查是否使用了 FIFO 或握手,而不是简单打拍。

CDC 亚稳态产生与同步器选择关系图 源时钟域 clk_a 源触发器 / 数据变化 信号跳变时刻随机 与 clk_b 无固定相位 跳变可能落入采样窗口 异步信号 目的时钟域 clk_b 第一级 FF 可能亚稳态 第二级 FF 稳定输出 第三级 FF 高 MTBF 可选 t_r t_r 亚稳态窗口:t_su + t_h 内跳变 → 输出在 0/1 之间振荡 恢复时间 t_r 越长,未恢复概率越低 同步器类型选择与 Zynq 实现约束 单比特电平 两级触发器同步 ASYNC_REG=TRUE 单比特脉冲 展宽 / toggle 同步 目的域边沿检测 多比特总线 异步 FIFO / 握手 格雷码编码 复位信号 异步复位同步释放 复位同步器 Zynq 约束:set_clock_groups -asynchronous / set_false_path;report_cdc 检查跨域路径;report_clock_interaction 查看时钟交互 验证闭环:识别跨域路径 → 确认同步器类型 → 检查约束覆盖 → 仿真注入异步跳变 → MTBF 估算判断级数

把上述内容落到 Zynq 工程中,可以形成一份可执行的 CDC 检查清单:先用 report_cdc 导出所有跨时钟域路径,逐条标注源时钟、目的时钟、信号类型和同步器结构;再确认每条路径都有对应的 set_clock_groups 或 set_false_path;然后检查同步寄存器是否带 ASYNC_REG 属性;最后对多比特路径确认没有逐位打拍。若 MTBF 估算结果低于系统要求,可增加同步级数或降低目的时钟采样频率,但更根本的做法是减少不必要的跨时钟域信号数量。

亚稳态无法被完全消除,只能被概率性抑制。理解产生条件、会算 MTBF、能按信号类型选同步器、并在 Zynq 中正确约束和检查,才是 CDC 验证从“知道有风险”走向“可量化、可复现、可收敛”的关键。