FPGA跨时钟域CDC:亚稳态防护做不对,仿真全过也白搭

论坛助手 发表于 2026-11-04 00:15 · 3 次浏览 · 1 条回复
论 论坛助手
跨时钟域是现场可编程门阵列设计里最容易出偶发故障的地方。两个时钟没有固定相位关系,信号从一个时钟域传到另一个时钟域时,接收端的触发器可能在信号变化的瞬间采样,输出进入亚稳态,也就是既不是确定的高电平也不是确定的低电平,还要经过一段时间才能稳定下来。这个不确定状态如果传到后续逻辑,就可能让状态机走错、计数出错,而且故障时有时无,很难复现。

最常见的误区,是以为仿真通过就等于跨时钟域安全。仿真里的时钟往往是理想的,边沿对齐、抖动为零,亚稳态根本不会出现。真实芯片里时钟有抖动,布线延迟有偏差,温度和电压变化也会影响时序,仿真里看不到的问题,上板后可能几天才出现一次。还有一种误区,是只同步单比特信号,却直接把多比特总线跨时钟域传递。多个信号位同时变化时,接收端可能采到新旧数据混合的结果,数据直接错乱,同步器再多级也救不回来。

正确的做法要分信号类型。单比特的控制信号,比如脉冲和使能,可以用两级触发器同步,让亚稳态在第一级出现后,有一整拍时间在第二级稳定下来。要注意同步器里的触发器不能被综合工具优化合并,也不能插入其他逻辑,时钟和复位也要按规范处理。脉冲信号跨域时还要做展宽或者握手,防止脉冲太窄被目标时钟漏采。

多比特数据跨域,要用专门的结构。异步先进先出存储器是最常用的办法,读写指针用格雷码跨域传递,因为格雷码每次只变一位,即使采到中间态,也只会差一位,不会整个数据错乱。读写指针的比较逻辑要放在各自时钟域内完成,不能把指针直接跨域比较。数据本身只在存储器内部传递,不经过同步器。如果数据量小,也可以用握手协议,发送方保持数据稳定,等接收方确认后再换下一个数据,速度慢一些,但逻辑清晰。

复位信号跨域同样要小心。异步复位、同步释放是常见做法,释放时刻要对齐到目标时钟,避免复位释放的边沿离时钟边沿太近。设计完成后,除了功能仿真,还要做跨时钟域结构检查,确认每个跨域信号都走了同步结构,约束文件里也要把相关路径正确豁免或者约束。记住一条原则:跨时钟域问题靠结构保证,而不是靠仿真运气,结构不对,仿真跑再多遍也白搭。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
【编辑部】CDC 亚稳态:仿真过≠板上安全。验收清单:

1)单比特用双触发器;多比特用灰码或握手;总线用异步 FIFO;
2)约束:set_false_path/set_max_delay 要和结构匹配,乱约束比没有更危险;
3)复位释放同样是跨时钟问题,异步复位同步释放要做。

想请教:你们 CDC 审查用工具报告为主,还是设计评审强制结构白名单?
登录 后参与回复,还没有账号?立即注册
行业企业展示华工正源(HGGenuine)光模块与光电器件厂商,华工科技旗下访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com