1. 多时钟SoC仿真与CDC验证全景
现代SoC几乎不存在单时钟设计。一颗典型的移动SoC里,CPU簇跑在2.0GHz,GPU在800MHz,DDR控制器在1600MHz,USB PHY在480MHz,I2C只有400kHz,再加上RTC的32.768kHz。这些时钟来自不同PLL、不同分频器,彼此相位和频率毫无固定关系。当信号从一个时钟域传到另一个时钟域时,就产生了跨时钟域(CDC, Clock Domain Crossing)问题。本节要建立的是全局认知:多时钟域仿真到底难在哪里、CDC验证要证明什么、Xcelium在其中扮演什么角色,以及从RTL到门级网表(GLS)的验证流程如何组织。
一、多时钟域仿真的三个核心挑战
第一个挑战是时钟建模的真实性。如果仿真中把两个异步时钟设成同频同相,CDC问题会被完全掩盖——亚稳态不会出现,同步器失效也看不出来。因此必须为每个时钟域定义独立的周期、相位偏移和抖动模型。例如:
// 典型多时钟激励建模(示例参数)
clk_cpu : period = 0.5ns (2.0GHz), phase = 0
clk_gpu : period = 1.25ns (800MHz), phase = 0.3ns
clk_ddr : period = 0.625ns(1.6GHz), phase = 0.17ns
clk_usb : period = 2.083ns(480MHz), phase = 0.9ns
clk_rtc : period = 30517.6ns(32.768kHz), phase = 0
第二个挑战是仿真性能。多时钟意味着事件密度成倍增加,一个包含数十个时钟域的SoC,RTL仿真可能跑几天才覆盖几毫秒。第三个挑战是亚稳态不可见。真实硅片中,触发器在建立/保持窗口内采样会产生亚稳态,输出在0和1之间振荡一段时间后才稳定。而标准RTL仿真器是二值或四值逻辑,无法自然表达这种中间态,必须借助专门的CDC检查工具或SDF反标来近似。
二、CDC验证的目标:不是“跑通”,而是“证明安全”
CDC验证的核心目标可以归纳为三条:结构正确——每个跨域信号都有合法的同步结构;协议正确——多比特信号传递时不会出现数据撕裂;时序收敛——同步器后的时序路径满足目标时钟域约束。常见的CDC结构包括两级触发器同步器(用于单比特电平信号)、脉冲同步器、握手同步器、异步FIFO(用于多比特数据流)以及格雷码计数器(用于指针传递)。
验证时要回答的具体问题包括:跨域信号是否经过了至少两级同步?同步器是否被综合工具正确识别并加了ASYNC_REG属性?多比特总线是否用了格雷码或握手?异步FIFO的读写指针是否真的跨域同步?复位信号跨域时是否做了复位同步?这些问题在RTL阶段靠CDC静态检查工具发现,在仿真阶段靠定向激励和断言验证。
三、Xcelium工具链的定位
Xcelium是Cadence的并行仿真引擎,在多时钟SoC验证中承担三个角色。第一是高性能仿真内核:它支持多核并行编译与仿真,对多时钟域设计的事件调度做了优化,能显著缩短长仿真时间。第二是与CDC检查工具集成:Xcelium可以与Cadence的CDC静态分析工具(如Conformal CDC)配合,把静态检查发现的跨域路径导入仿真环境,生成针对性的激励。第三是支持GLS流程:Xcelium能读取SDF文件进行时序反标,在门级网表仿真中暴露真实的建立/保持违例和亚稳态传播。
-mce选项可以启用多核仿真,-sdf选项用于GLS时序反标,-cdc相关流程则与静态检查工具联动。具体选项名以所用版本手册为准。四、从RTL到GLS的验证流程
完整的CDC验证流程分为四个阶段。第一阶段是RTL功能仿真:用定向测试和随机测试验证同步器逻辑功能正确,配合SVA断言检查跨域信号是否满足同步协议。第二阶段是CDC静态检查:用工具扫描所有跨域路径,识别未同步、同步不足、多比特撕裂等结构问题,输出CDC报告。第三阶段是带时序的RTL仿真:在RTL中反标部分时序信息或使用CDC模型,模拟亚稳态传播效果。第四阶段是GLS门级仿真:用综合后的网表和SDF文件,在真实门延时下验证同步器是否满足时序,这是最接近硅片行为的验证。
下面这张图展示了多时钟域SoC中典型的CDC信号链与验证流程的对应关系。左侧是三个异步时钟域及其跨域信号路径,右侧是Xcelium在各验证阶段的作用。图中标注了同步器结构、跨域信号类型以及每个阶段要检查的关键点。
五、一个具体的CDC验证场景
假设CPU域要向GPU域传递一个32位配置字。如果直接用两级触发器同步32根线,由于每根线的延时不同,GPU域可能采到“半新半旧”的值,这就是数据撕裂。正确做法是:CPU域先把数据写入一个寄存器,拉高req信号;req经过两级同步器进入GPU域;GPU域检测到同步后的req后,用GPU时钟采样整个32位数据总线,然后拉高ack;ack再同步回CPU域,CPU看到ack后才更新下一笔数据。这个握手过程在RTL仿真中要验证:req和ack不会同时有效、数据在req稳定前不会变化、同步器输出不会出现毛刺。在GLS中还要验证:两级触发器的建立时间是否满足,SDF反标后是否出现时序违例。
六、验证流程的组织要点
组织多时钟SoC验证时,建议按以下顺序推进:先建立完整的时钟定义文件,确保每个时钟域的周期、相位、抖动都有明确来源;再用CDC静态检查工具做全芯片扫描,生成跨域路径清单;然后针对每条高风险路径编写定向测试和断言;最后在GLS阶段用SDF反标验证时序。Xcelium的并行仿真能力在最后两个阶段尤其关键,因为GLS的仿真速度通常比RTL慢一个数量级,多核加速能显著缩短回归时间。
需要强调的是,CDC验证不是一次性的任务,而是贯穿RTL、综合、布局布线、GLS的持续过程。每次时钟结构变更、每次跨域信号增减,都需要重新跑CDC检查。只有把静态检查、动态仿真和门级时序验证三者结合,才能对多时钟域SoC的CDC安全性建立足够的信心。