CDC/RDC 静态验证:用结构分析抓住仿真看不见的亚稳态(B2)
设计侧 CDC 概念见 跨时钟域 CDC、异步 FIFO、RDC 跨复位,报告分诊见 CDC/RDC 报告分诊;本篇讲工具怎么分析、违例怎么收敛清零。Lint 工具治理见 B1,属性形式验证见 B3,本篇专讲时钟/复位域。
一、为什么仿真测不出 CDC 问题
当数据在两个异步时钟域之间传递,寄存器的建立/保持时间可能被违反,输出进入亚稳态——它最终会随机收敛到 0 或 1,且收敛时间不固定。问题在于:
- RTL/门级仿真用的是理想 0/1、零随机延迟的离散模型,亚稳态根本不会发生,跨域信号总是「某个干净值」;
- 真实硅片上的失败依赖具体时钟相位、工艺角、电压、温度的巧合,在仿真里几乎无法定向激励覆盖;
- 它不是功能逻辑写错(功能仿真全对),而是结构性的同步缺失。
所以 CDC 不靠激励覆盖,而靠静态结构分析:工具读 RTL + 时钟/复位约束,自动识别时钟域、画出跨域信号、检查每个跨域点是否用了正确的同步结构。这与 lint 同属「不用跑激励」的静态族,但规则聚焦时钟/复位拓扑。

二、工具在查什么:三类核心规则
1. 单 bit 跨域有没有同步器
最基础检查:从快/慢域 A 直接进域 B 的单 bit 控制信号,必须经过至少两级同步寄存器(2-FF synchronizer)或握手。缺同步器直接报 Ac_sync/data_loss 类违例。工具要能识别出同步器结构(两级相邻、无组合逻辑、同复位),否则会把正确的两级同步误报为违例——所以要告诉工具哪些是同步器、源端何时允许变化。
2. 多 bit 跨域的协议一致性
数据总线不能每 bit 各加两级同步(各 bit 亚稳态收敛不同步,会拼出错误值)。多 bit 必须走协议:
工具检查协议是否被遵守:data 在同步的控制信号生效期间是否可能变化(data_enable/async_reset 协议违例)、FIFO 满空标志是否格雷码、指针是否正确跨域。
3. Reconvergence(重汇聚)与扇出
同一跨域信号扇出到多个目的、或经不同同步路径后在域内重新汇聚,可能导致各副本延迟不一致产生功能错误;组合逻辑跨域(跨域后先做组合再进寄存器)尤其危险,因为毛刺会被带进同步器。工具报 reconvergence/combo 违例,要求跨域信号在源端先寄存、单点同步、域内再分发。
三、RDC:复位域,CDC 的孪生问题
RDC(Reset Domain Crossing)查信号在不同复位域(异步复位、不同复位极性/不同释放时刻)间传递:
- 一个域在复位、另一个在工作时,跨域信号可能处于非法/翻转态,被工作域当成有效数据;
- 复位释放(reset release/removal)若不做同步,复位释放时刻违反寄存器 recovery/removal,导致部分触发器初始值不确定——需要 reset synchronizer(异步断言、同步释放),见 复位设计。
RDC 规则体系与 CDC 平行:识别复位域、跨域信号、复位值传播(reset value propagation)、复位顺序。常与 CDC 在同一工具(SpyGlass CDC/RDC、Questa)同一套约束里一起跑。
四、约束:静态分析也要「告诉它真相」
CDC 工具不吃 SDC 时序约束,而要时钟/复位域定义:哪些时钟是真正异步关系(set_clock_groups -asynchronous 同源思想)、哪些是同步分频可视为同域、哪个是复位信号及其极性/异步性、哪些是准静态/配置信号(可正当豁免)。
约束错了分析就错:漏声明异步关系 → 真实跨域被当同域漏报(最危险);把同步时钟也标异步 → 海量伪报,逼工程师乱 waive。域定义要和 SDC 的 set_clock_groups、UPF 电源域(F7,跨电源常伴跨复位)保持一致并评审。
五、违例收敛顺序(不是逐条 waive)
成熟团队的收敛节奏:
- 先清结构性硬伤:缺同步器、组合逻辑跨域、多 bit 裸跨——这些必须改 RTL,不许豁免;
- 再处理协议/reconvergence:确认 FIFO/握手正确、跨域信号源端已寄存、单点同步;
- 核对同步器识别:把符合规范的同步器正确建模(约束/
set_sync类),消除误报,而不是当违例 waive; - 最后才用 waiver:仅限真准静态(上电配置后不再变)、测试/扫描专用路径等,每条带原因/owner/版本,规则纪律同 lint waiver;
- 回归零新增:CDC/RDC 纳入每次 RTL 合入的回归,违例数只准下降,新增必须当场解释。
报告怎么分诊(按严重度、按模块、区分真违例/误报)见 CDC/RDC 报告分诊。CDC clean 是综合前前端签核的硬门槛,问题带到后端再修要回改 RTL、重综合,代价高一个量级(X3 传播)。
相关与延伸
- 同线:C1 综合;静态族姊妹:lint waiver(B1)、属性形式(B3)、LEC(B4)。
- 数据/电源:F7 UPF、S1 RTL 数据。
- 设计侧:CDC 基础、异步 FIFO、RDC、复位设计、无毛刺时钟切换。
总结
CDC/RDC 抓的是仿真在理想 0/1 模型下永远看不见、只在真实相位与角电压温度巧合下才爆的亚稳态,因此不用激励而用静态结构分析:工具先靠准确的时钟/复位域约束识别域、枚举所有跨域信号,再查单 bit 是否有可被正确识别的两级同步、多 bit 是否走异步 FIFO/握手/使能协议、有无组合逻辑跨域与重汇聚扇出,RDC 平行地查跨复位与同步释放;收敛时先改缺同步器和裸跨多 bit 这类硬伤、再核协议与同步器识别消除误报、最后只对准静态等极少数情况留带原因 owner 版本的 waiver,并把零新增纳入每次 RTL 合入——漏声明异步导致的漏报远比伪报危险,CDC clean 必须卡在综合之前。