3. CDC验证计划制定

CDC验证计划不是仿真开始后才补写的文档,而是把设计规格中的时钟信息、跨域路径和同步意图,提前翻译成可执行、可度量、可追踪的验证契约。它的核心价值在于:在写第一条 testbench 之前,团队已经对“有哪些时钟域、哪些信号真正跨域、每条跨域路径用什么同步结构、验证到什么程度算完成”形成一致认识。对于 Versal 这类包含 PL 时钟、PS 时钟、GT 恢复时钟、MMCM/PLL 输出以及 NoC/AXI 时钟的器件,时钟域数量多、来源杂,若不在计划阶段理清,后续 CDC 检查工具报出的成千上万条路径将难以收敛。

一、从设计规格提取时钟域清单

时钟域清单的输入来源通常包括:顶层时钟约束文件(XDC)、时钟向导或 Clocking Wizard 配置、BD 中 Clocking 模块的连接关系、IP 集成后的时钟报告,以及设计规格中的时钟树描述。提取时不能只抄时钟名,而要记录每个时钟的来源、频率、相位关系、是否同源、复位域。Versal 中尤其要区分:PL 侧由外部晶振经 MMCM 分频/倍频产生的时钟、PS 侧 pl_clk 输出、GT 通道恢复出的 rxoutclk、以及 NoC 提供的时钟。同源但经过不同 MMCM 输出的时钟,虽然频率可能相同,仍可能因相位不确定而需要按异步处理。

建议用一张时钟域登记表固化提取结果,字段至少包含:时钟名、来源、标称频率、是否与其它时钟同源、复位信号、所属模块、备注。例如某图像处理设计可登记为:clk_in_100m(外部晶振,100 MHz,源)、clk_pixel(MMCM 输出,148.5 MHz,与 clk_in_100m 同源)、clk_ps(PS pl_clk0,100 MHz,与 PL 时钟异步)、rx_clk(GT 恢复时钟,156.25 MHz,异步)。这张表是后续跨域信号清单和约束文件的共同基础。

二、跨域信号清单:从端口与层次中定位真实跨域

跨域信号清单不能靠人工逐行阅读 RTL 得到,而应结合静态检查工具与设计层次分析。常用做法是:先用综合后的网表或 RTL 运行 CDC 检查工具(如 Vivado 的 report_cdc),得到初步的跨域路径列表;再按模块层次过滤,剔除工具误报(例如同源时钟间被误判、常量或静态配置信号),保留真正需要同步或约束的路径。清单中每条记录应包含:源时钟、目的时钟、信号名、位宽、方向、源寄存器、目的寄存器、是否多比特、同步结构、约束状态。

需要特别关注三类信号:单比特控制信号(如使能、握手请求)、多比特数据总线(如像素数据、配置字)、以及复位信号。多比特信号若逐位独立同步,可能在同一目的时钟沿采样到不同步的位组合,产生数据错位;因此清单中必须标注“是否要求位间一致性”,以决定采用握手、异步 FIFO 还是格雷码。复位跨域则要区分异步复位同步释放与纯异步复位,前者需要专门的复位同步器。

CDC验证计划:从规格到覆盖率目标的映射关系 设计规格输入 • XDC 时钟约束 • Clocking Wizard 配置 • BD 时钟连接关系 • IP 集成时钟报告 • 设计规格时钟树描述 • 复位方案说明 提取与整理的四类清单 时钟域清单 来源/频率/同源/复位 跨域信号清单 源/目的/位宽/方向 同步策略清单 2FF/握手/FIFO/格雷码 验证范围与覆盖率 路径/场景/覆盖目标 验证执行与收敛 • CDC 静态检查 • 同步器功能仿真 • 跨域场景激励 • 覆盖率收集 • 未覆盖路径分析 • 约束与豁免评审 覆盖率反馈与计划迭代 未覆盖路径 → 补充激励或确认豁免;新增跨域 → 回写清单与约束 覆盖率目标未达 → 分析同步结构缺陷或验证盲区 示例:某图像处理设计的跨域信号清单片段(教学假设数据) 源时钟 clk_pixel(148.5M) → 目的时钟 clk_ps(100M):pixel_valid[0](单比特,2FF同步)、pixel_data[23:0](多比特,异步FIFO) 源时钟 rx_clk(156.25M) → 目的时钟 clk_pixel(148.5M):gt_data[31:0](多比特,握手+双口RAM)、frame_start[0](单比特,脉冲同步器) 复位:rst_ps(PS侧)→ clk_pixel 域,采用异步复位同步释放结构,需在清单中标注复位同步器实例位置

三、同步策略清单:为每条跨域路径指定结构

同步策略清单是 CDC 验证计划的技术核心。它把跨域信号清单中的每条路径,映射到具体的同步结构,并说明选择理由。常见策略包括:两级触发器同步器(适用于单比特电平信号)、脉冲同步器(适用于单比特脉冲)、握手同步(适用于多比特低频数据)、异步 FIFO(适用于多比特高速数据流)、格雷码计数器(适用于连续递增/递减的多比特量)、以及异步复位同步释放电路。选择依据是信号位宽、变化频率、位间一致性要求、延迟容忍度和吞吐量。

在 Versal 中还需注意:某些跨域路径可以借助器件原语实现更可靠的同步,例如使用 XPM_CDC_SINGLE、XPM_CDC_ARRAY_SINGLE、XPM_CDC_HANDSHAKE、XPM_CDC_ASYNC_RST 等 XPM 宏。这些宏已包含正确的同步结构和属性,能减少手写代码的 CDC 风险。同步策略清单中应记录每条路径采用的宏名或自定义结构、实例路径、以及是否已添加 set_max_delay -datapath_only 或 set_false_path 约束。约束与结构必须匹配:若使用异步 FIFO,通常对读写指针跨域路径加 set_max_delay -datapath_only,而不是简单 false_path,以保留布线延迟控制。

四、验证范围与覆盖率目标

验证范围要回答“哪些跨域路径必须验证、哪些可以豁免”。必须验证的路径包括:所有单比特控制跨域、所有多比特数据跨域、所有复位跨域、以及所有经过同步器但可能影响功能正确性的路径。可以豁免的典型情况包括:静态配置信号(上电后不再变化)、常量、以及经过形式化或静态检查已证明安全的路径。豁免必须记录理由和评审人,不能默认忽略。

覆盖率目标应分层次设定。第一层是路径覆盖率:跨域信号清单中每条路径是否都被至少一个测试用例激励到,目标通常为 100%(豁免除外)。第二层是同步结构覆盖率:每种同步策略(2FF、握手、FIFO、格雷码等)是否都有对应的功能仿真用例,验证其在正常和边界条件下的行为。第三层是场景覆盖率:包括源时钟与目的时钟的频率比变化、相位漂移、复位插入、数据背压、FIFO 满/空边界等。第四层是断言覆盖率:为同步器编写的 SVA 断言(如“同步后信号不应出现亚稳态传播”“握手请求必须被应答”)是否全部被触发。

覆盖率目标不是越高越好,而要与风险匹配。例如,对图像数据流跨域,应重点覆盖 FIFO 满/空、帧边界、行边界;对控制寄存器跨域,应重点覆盖写后读、读后写、连续写等场景。建议在计划中为每类路径设定明确的覆盖目标值,例如:单比特控制路径 100% 路径覆盖 + 100% 断言覆盖;多比特数据路径 100% 路径覆盖 + 90% 场景覆盖;复位路径 100% 路径覆盖 + 复位释放时序检查。这些目标将作为验证收敛的判据。

实用提示:CDC 验证计划应作为活文档维护。每次设计变更(新增时钟、修改同步结构、调整复位方案)后,都要回写时钟域清单、跨域信号清单和覆盖率目标,并重新运行 CDC 静态检查。计划与设计不同步,是 CDC 问题漏到硅后的最常见原因。

五、可直接使用的 CDC 验证计划模板字段

综合以上内容,一份可执行的 CDC 验证计划至少应包含以下字段,团队可直接据此建立表格或数据库:时钟域登记表(时钟名、来源、频率、同源关系、复位域);跨域信号表(信号名、位宽、源时钟、目的时钟、方向、源/目的寄存器、是否多比特、位间一致性要求);同步策略表(信号名、同步结构、实例路径、约束类型、约束状态);验证范围表(路径、是否豁免、豁免理由、评审人);覆盖率目标表(路径覆盖率、结构覆盖率、场景覆盖率、断言覆盖率、当前值、目标值、差距分析)。这五张表共同构成 CDC 验证计划的骨架,也是评审和签核的依据。

在实际项目中,建议把上述表格与版本管理结合:每次 RTL 提交后自动提取时钟和跨域信息,与计划表比对,发现新增或消失的跨域路径时触发评审。这样 CDC 验证计划就不再是静态文档,而是随设计演进的动态契约,真正支撑 Versal 多时钟设计的 CDC 收敛。