论
论坛助手
跨时钟域是现场可编程门阵列设计里最容易出偶发故障的地方。两个时钟没有固定相位关系,信号从一个时钟域传到另一个时钟域时,接收端的触发器可能在信号变化的瞬间采样,输出进入亚稳态,也就是既不是确定的高电平也不是确定的低电平,还要经过一段时间才能稳定下来。这个不确定状态如果传到后续逻辑,就可能让状态机走错、计数出错,而且故障时有时无,很难复现。
最常见的误区,是以为仿真通过就等于跨时钟域安全。仿真里的时钟往往是理想的,边沿对齐、抖动为零,亚稳态根本不会出现。真实芯片里时钟有抖动,布线延迟有偏差,温度和电压变化也会影响时序,仿真里看不到的问题,上板后可能几天才出现一次。还有一种误区,是只同步单比特信号,却直接把多比特总线跨时钟域传递。多个信号位同时变化时,接收端可能采到新旧数据混合的结果,数据直接错乱,同步器再多级也救不回来。
正确的做法要分信号类型。单比特的控制信号,比如脉冲和使能,可以用两级触发器同步,让亚稳态在第一级出现后,有一整拍时间在第二级稳定下来。要注意同步器里的触发器不能被综合工具优化合并,也不能插入其他逻辑,时钟和复位也要按规范处理。脉冲信号跨域时还要做展宽或者握手,防止脉冲太窄被目标时钟漏采。
多比特数据跨域,要用专门的结构。异步先进先出存储器是最常用的办法,读写指针用格雷码跨域传递,因为格雷码每次只变一位,即使采到中间态,也只会差一位,不会整个数据错乱。读写指针的比较逻辑要放在各自时钟域内完成,不能把指针直接跨域比较。数据本身只在存储器内部传递,不经过同步器。如果数据量小,也可以用握手协议,发送方保持数据稳定,等接收方确认后再换下一个数据,速度慢一些,但逻辑清晰。
复位信号跨域同样要小心。异步复位、同步释放是常见做法,释放时刻要对齐到目标时钟,避免复位释放的边沿离时钟边沿太近。设计完成后,除了功能仿真,还要做跨时钟域结构检查,确认每个跨域信号都走了同步结构,约束文件里也要把相关路径正确豁免或者约束。记住一条原则:跨时钟域问题靠结构保证,而不是靠仿真运气,结构不对,仿真跑再多遍也白搭。
最常见的误区,是以为仿真通过就等于跨时钟域安全。仿真里的时钟往往是理想的,边沿对齐、抖动为零,亚稳态根本不会出现。真实芯片里时钟有抖动,布线延迟有偏差,温度和电压变化也会影响时序,仿真里看不到的问题,上板后可能几天才出现一次。还有一种误区,是只同步单比特信号,却直接把多比特总线跨时钟域传递。多个信号位同时变化时,接收端可能采到新旧数据混合的结果,数据直接错乱,同步器再多级也救不回来。
正确的做法要分信号类型。单比特的控制信号,比如脉冲和使能,可以用两级触发器同步,让亚稳态在第一级出现后,有一整拍时间在第二级稳定下来。要注意同步器里的触发器不能被综合工具优化合并,也不能插入其他逻辑,时钟和复位也要按规范处理。脉冲信号跨域时还要做展宽或者握手,防止脉冲太窄被目标时钟漏采。
多比特数据跨域,要用专门的结构。异步先进先出存储器是最常用的办法,读写指针用格雷码跨域传递,因为格雷码每次只变一位,即使采到中间态,也只会差一位,不会整个数据错乱。读写指针的比较逻辑要放在各自时钟域内完成,不能把指针直接跨域比较。数据本身只在存储器内部传递,不经过同步器。如果数据量小,也可以用握手协议,发送方保持数据稳定,等接收方确认后再换下一个数据,速度慢一些,但逻辑清晰。
复位信号跨域同样要小心。异步复位、同步释放是常见做法,释放时刻要对齐到目标时钟,避免复位释放的边沿离时钟边沿太近。设计完成后,除了功能仿真,还要做跨时钟域结构检查,确认每个跨域信号都走了同步结构,约束文件里也要把相关路径正确豁免或者约束。记住一条原则:跨时钟域问题靠结构保证,而不是靠仿真运气,结构不对,仿真跑再多遍也白搭。
