欢迎光临散文网 会员登陆 & 注册

CDC (Clock Domain Crossing) Metastable

2022-03-25 15:52 作者:不吃葱的酸菜鱼  | 我要投稿

亚稳态(Metastable): 亚稳态是由于电路setup/hold不满足导致的不确定的一个状态,它会维持很长一段时间,并且可以传播。在亚稳态状态下,无法判断电路的逻辑值是0还是1。

一旦产生了亚稳态,那么后面的组合逻辑就会把亚稳态传播下去,这是非常危险的。

如图中clkRx在采Tx信号时,由于setup/hold不满足要求,导致采样到的Rx就处于亚稳态。也即,采样的寄存器不满足setup/hold要求就会导致亚稳态。

影响亚稳态的持续时间的因素: ① process ② temperature ③ Voltage ④ Electromagnetic wave (工艺、温度、电压、电磁波干扰)

注意,不要把亚稳态和竞争冒险概念混淆!!!

竞争冒险是组合逻辑电路里的概念,亚稳态是时序逻辑电路里的概念。

        单比特跨时钟域电路,消除Metastable的办法就是在目的时钟域用两个寄存器做两级同步,也即打两拍,具体电路如图:

采用两级同步后,他的MTBF(mean time between failure)平均无故障工作时间会到10的几十次方量级年,而一个电路的使用年限不可能到那么多年,所以我们认为两级同步基本可以消除亚稳态。

        Rx时钟域的第一个寄存器,在第i个上升沿对Tx传过来的数据进行采样,会出现亚稳态,然后第二个寄存器在下一个周期,再对数据进行采样,因此时亚稳态数据因为过了一个周期,亚稳态持续结束,信号保持已经稳定。(虽然亚稳态会导致电路有一段长时间的不稳定状态,这长时间是相对原来的ck_to_q而言的,我们说亚稳态持续时间长,也不会超过一个时钟周期,所以打一拍之后亚稳态数据就稳定了。如果时钟频率很高很高的话,那可以打三拍。)


        由于STA分析时序,只能分析同步电路的时序是否满足要求,对异步的时序不好检测(在STA笔记里谈到,如果STA考虑所有异步时钟,会去找异步时钟setup/hold最容易违例的地方,而实际上电路设计可能这些违例是没关系的,异步时钟如果做STA分析非常容易不过,所以通常我们都把跨时钟域的时钟设置false_path),所以在写完RTL codes的时候,通常再用CDC工具做跨时钟域检查,而不是去综合然后做时序分析,因为如果你综合完同步时序没问题,但是最后发现有跨时钟域问题,那还得重新综合,所以写完RTL codes在综合之前,下一步就是用CDC工具(Spyglass)做跨时钟域检查。


典型的跨时钟域问题:

① 亚稳态:跨时钟域由于两个时钟域的发射时钟和采样时钟之间关系不明确,如果采样寄存器的建立保持时间违例,那么就会出现亚稳态(Metastable)。

打两拍

        用两个寄存器做两级同步,来解决亚稳态问题。


② data hold 问题:数据从一个快时钟域到慢时钟域,可能会出现数据维持时间不够长,导致目的时钟域没法采样到原时钟域的信号。

 为了增加A信号持续的时间,给A信号打两拍。

假如D输入了一个脉冲,那么:

第一个寄存器在第一个时钟周期输出1,第二个周期输出0

第二个寄存器在第一个时钟周期输出0,第二个周期输出1

令A等于两者取或就能把一个周期扩展到两个周期了(打两拍)。


如果信号是下降沿有效,那么两输入或门应该换成什么门?

如果clk_A是clk_B频率的四倍,那需要打多少拍?几个寄存器?(打四拍,用四个寄存器)


③ Reconvergence :多比特数据经过组合逻辑跨时钟域的时候,由于组合逻辑延时不同,导致打两拍后的数据结果不同,所以多比特数据传输时,变化不能超过1bit,这也是为什么在跨时钟域传输的时候要把地址用格雷码编码,就是为了解决reconergence问题。

        信号X和信号Y进行跨时钟域传输两者同时从0变1,由于delay A和delayB的不同,可能在目的时钟域的第一个寄存器采样X为1,采样Y为0,第二个周期时,第一个寄存器采样X为1,Y为1,那么打两拍之后,X比Y提前一个周期为1的状态就会一直传递下去(如图),但实际上在原时钟域X和Y是同时从0到1翻转的。

        所以在跨时钟域传输多bit数据时,一次我们只允许数据的1bit发生翻转。不允许多bit发生翻转。

④ 有大量数据需要跨时钟域传递的时候怎么做?用握手信号handshake,或者异步FIFO传输。vld和vld_sync就是一对握手信号

提高跨时钟域的数据传输效率,vld信号为交互信号,打两拍后送到目的时钟域,然后用双边沿检测电路(vld_sync1和cld_sync2)检测到一个时钟沿,产生一个pulse,然后抓取一次data数据。

用异步FIFO传输则效率更快。

⑤ 异步复位要考虑什么问题?异步复位,打两拍,同步释放。(异步复位同步释放的电路可以看我写的数字IC手撕代码专栏)

下面为6种典型的犯错的跨时钟域问题:

① 打两拍的寄存器不是同一个时钟   。 

② 给两级同步的寄存器加复位信号。

③ 没有打两拍再输出,打一拍就输出了。

④ 打两拍的第二个寄存器的en端由clk1时钟域的寄存器提供,这是不对的,应该在同一个时钟域。

⑤ 在打两拍的寄存器中间插组合逻辑。

⑥ 原时钟域的组合逻辑输出没有打一拍再输出。


CDC的验证要等到布局布线知乎的后仿才能验证出来。



CDC自测题:

  1. 什么会造成Metastable?

  2. 如何解决Metastable问题?

  3. 多比特数据跨时钟域数据怎么解决亚稳态问题?

  4. 跨时钟域可能出现哪些问题?

  5. 同步电路和异步电路有什么区别?

  6. 同步电路的时序就一定是安全的吗?     

  7. 跨时钟域数据传输是否和目的时钟域的频率有关?

  8. STA分析能否检测跨时钟域问题?(不行,STA只能分析同步时钟问题,不能分析异步时钟问题)

  9. 跨时钟域问题,能用时钟树综合解决吗(Clock Tree Synthesis,CTS)?(不行,解决问题还是得用上面的方法,比如data hold 问题,快时钟域到慢时钟域的数据传输,如果快时钟域的失踪频率比慢时钟域快很多,那怎么调时钟树,快时钟域一个周期的信号,不可能永远能被慢时钟域抓到,所以综合时钟树不能解决问题。)


CDC (Clock Domain Crossing) Metastable的评论 (共 条)

分享到微博请遵守国家法律