1. 多时钟系统与CDC验证导论
在Lattice FPGA的实际工程中,单时钟域设计已经越来越少。只要板级存在晶振、外部接口、视频像素时钟、以太网PHY恢复时钟、ADC采样时钟或DDR控制器时钟中的任意两类,FPGA内部就几乎必然出现多个时钟域。多时钟系统本身不是错误,真正带来风险的是信号从一个时钟域进入另一个时钟域时,没有经过正确的同步处理,这就是CDC(Clock Domain Crossing,跨时钟域)问题。
本节先建立三个基本认识:Lattice FPGA中典型的多时钟场景长什么样;CDC失效在工程上会造成什么后果;以及本课程后续要完成的验证任务地图。理解这三点之后,后续章节中的同步器结构、约束写法、仿真激励和形式验证才有明确的落点。
一、Lattice FPGA中的典型多时钟场景
以常见的Lattice ECP5或iCE40系列为例,一个中等复杂度的系统通常包含以下时钟:
- 系统时钟:由板载晶振经PLL/DLL倍频得到,例如25 MHz输入、100 MHz输出,作为主控逻辑时钟。
- 接口恢复时钟:以太网RGMII/GMII的RX_CLK、视频输入的像素时钟,频率与系统时钟无固定整数比。
- 低速外设时钟:I²C、SPI、UART等分频时钟,通常远低于系统时钟。
- 采样/转换时钟:ADC或传感器接口时钟,可能与系统时钟同源但相位关系不确定。
这些时钟之间往往没有固定的相位关系,甚至频率比也不是整数。例如系统时钟100 MHz、像素时钟74.25 MHz,二者比值约为1.347,无法用简单分频对齐。当控制信号、状态标志、数据总线跨越这些时钟边界时,就构成了CDC路径。
二、CDC问题的工程危害
CDC失效最直接的物理机制是亚稳态。当源域信号在目标域时钟的建立/保持窗口内发生跳变时,目标触发器的输出可能在一段时间内既不是高电平也不是低电平,而是处于中间不确定状态。如果这个不确定值被后续逻辑采样,就会产生不可预测的行为。
亚稳态带来的工程危害通常表现为以下几类:
- 随机性功能错误:状态机跳转到非法状态、计数器误加、FIFO读写指针错位。这类问题在实验室可能几天才出现一次,量产中却可能批量暴露。
- 数据损坏:多比特总线跨域时,各比特到达目标域的时间不一致,采样到的是新旧数据的混合值。例如源域从0x0F变为0xF0,目标域可能采到0xFF或0x00。
- 系统死锁:握手信号丢失或重复,导致请求方永远等待应答,或应答方重复响应。
- 时序收敛假象:静态时序分析(STA)默认所有路径都有确定的时钟关系,CDC路径若未正确约束,STA可能报告时序满足,但实际硬件行为仍然错误。
三、验证目标与课程任务地图
CDC验证的核心目标可以归纳为三条:识别所有跨时钟域路径;确认每条路径都有正确的同步结构;证明同步结构在目标时钟域下功能正确且时序收敛。这三条对应不同的验证手段:
| 验证目标 | 主要手段 | 输出证据 |
|---|---|---|
| 识别CDC路径 | 代码审查、CDC静态检查工具、综合报告 | CDC路径清单、跨域信号列表 |
| 确认同步结构 | 结构检查、约束文件审查、形式验证 | 同步器类型与位置、SDC约束 |
| 证明功能正确 | 定向仿真、随机仿真、形式验证 | 波形、断言通过、覆盖率报告 |
本课程后续将围绕这条主线展开:先讲清单比特同步器(两级触发器、脉冲同步器)和多比特同步方案(异步FIFO、握手、格雷码),再讲Lattice工具链中的CDC约束写法(set_false_path、set_max_delay、set_clock_groups),然后进入仿真验证方法(定向激励、随机激励、亚稳态注入建模),最后用形式验证和板级调试收尾。
需要特别强调的是,CDC验证不是仿真通过就结束。仿真中如果不显式建模亚稳态,跨域路径可能“碰巧”正确;而实际硬件中,亚稳态发生的时刻与温度、电压、时钟相位都有关系。因此,CDC验证必须同时依赖结构正确性、约束完整性和仿真/形式验证三方面证据,缺一不可。