ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CDC(1)

2022-04-08 09:01:56  阅读:193  来源: 互联网

标签:bclk CDC flop pulse synchronizer 信号 时钟


跨时钟域(CDC)

毛刺(glitch):由于信号在走线和通过逻辑单元时造成的延迟,在多路信号变化的瞬间,组合逻辑的输出常常产生一些小的尖峰 。

组合逻辑会在输入变化的时候输出会产生毛刺,而存储元件只有在时钟沿来时才变化,所以同步电路可以消除组合电路中的毛刺。

时钟周期的大小取决于最长的传输延时(propagation delay)。同步电路的好处是时序很清晰,电路中的存储元件例如触发器都是依照一个固定的节拍来工作,便于EDA工具来进行延时的分析和计算。

而异步电路就没有时钟的概念了,存储元件所存的状态跟随了输入信号的变化立刻发生变化。信号之间的传递通常通过握手(handshake)来完成,因为没有时钟的约束,每一级存储元件之间的逻辑电路都是各自独立的,可以各自进行优化,这样可以达到很好的性能。但是这既是优势,也是劣势。劣势就在于EDA工具没有满足每一级都单独优化的计算能力,而且由于相邻的级之间互相影响,使得计算总的时序时变得异常复杂,所以异步电路的规模通常无法做大,进而也限制了它的用途。

基本概念:(D触发器)

setup time: 时钟沿到来之前输入信号D必须保持稳定的最小时间

hold time: 时钟沿到来之后输入信号D必须保持稳定的最小时间

clk-to-q time: 输入D满足setup/hold time要求,从时钟沿到来时刻到输出端Q变化至稳定的时间

那么当输入信号D无法满足setup time 或者hold time的要求,我们称之为产生了setup time / hold time violation, Flop Q的输出这个时候是0还是1是不确定的,需要一定的时间才能够稳定在0或者1。所以如果当Q端在clk-to-q时间之后才变得稳定的话,我们就说这个触发器产生了亚稳态metastability。

D触发器为什么会有setup time和hold time的要求?

D触发器内部结构是一个主从锁存器:

Latch能够存储住状态,靠的是上面的背靠背的反相器。而这个背靠背的反相器能够锁住状态是需要时间的。

setup time: 在clk的上升沿到来之前,D要传输到Z的时间。因为当Z的值还没有稳定的时候,D如果变化,那么这个背靠背的反相器就无法锁住值。

hold time:  第一个传输门关闭需要的时间,在传输门关闭期间,D->W要保持稳定,这样在传输门关闭之后,W稳定才不会导致背靠背反相器锁住的值发生变化。

所以我们可以看出,当D在setup/hold time window内发生变化,锁存器可能无法锁住一个稳定的值,会发生的结果是

  • Q的值可能不是正确的D

  • 随着D的变化越靠近时钟沿,Q变稳定的时间越长

  • 最后Q稳定到的值可能是随机的

注意我们并不是说Q最后的值不是稳定的1或者0, Q的值最后一定会稳定下来,稳定在高电平或者低电平,这是由于背靠背的反相器会产生正反馈,最终一定会稳定下来。但是当这个稳定的时间超出了clk-to-q的限制,我们就说产生了亚稳态。

亚稳态的出现并导致逻辑错误并且芯片失效是一个概率事件,而不是一个100%会发生的确定性事件。

那么我们能够完全消除亚稳态吗?答案是否定的。其实我们关心的并不是亚稳态,而是说能否避免由于亚稳态而造成的逻辑问题。

MTBF-- mean time between failure. 意思是两次失效之间的平均时间。简单来说,就是这个芯片或者这个IP或者这个电路发生两次发生错误之间的间隔。

MTBF反比于采样时钟频率(destination clock frequency),反比于数据变化频率(source data change frequency),还和工艺、电压、温度等因素相关。

 

https://mp.weixin.qq.com/s/_5bsiEYsVhK1W0ziUMV7kA

 

single-bit level 信号的跨时钟域

single bit 直接被destination domain的flop去sample产生的问题的解决方法:

之后再加一个flop,也就是说用两级的flop来同步source domain的signal。我们通常把这种synchronizer 叫做2flop synchronizer或者double flop synchronizer,俗称“打两拍”。

 

 

回顾metastable产生的原因。第一级flop产生metastable的原因是flop里面没有及时锁住该锁的值,所以我们无法直接使用第一级flop的Q来直接用于bclk时钟域。但是要注意,我们之前说过,第一级flop的Q会最终稳定下来的,而且在绝大多数时候,可以在一个bclk周期内稳定下来,这样第二级flop的D输入就是一个稳定的值,进而第二级flop的Q是满足clk-to-q的,没有亚稳态的产生。如上图所示,尽管bdata0产生了metastable,但是bdata是stable的。

double flop synchronizer不能完全消除亚稳态!但是很多有经验的工程师会告诉你,用个double flop synchronizer就够了,那是因为double flop会使得metastable产生的概率显著降低。随着sample clock frequency的提升,以及工艺节点越来越小,有些时候打两拍已经不太够了,那么就简单粗暴来一个打三拍,就能够保证了。

使用double flop来同步,有个最基本的“3个沿”要求:就是source data必须保证稳定不变至少碰见destination clock 3个连续的沿,这个沿可以是上升沿也可以是下降沿,持续3个沿之后才能变,否则就有可能在destination clock domain根本看不到这个data的变化。

 

 

adata第一次变高,只碰到了bclk的2个沿,就可能导致bdata根本没有看到这个pulse,而第二次adata变高,持续了3个沿,这样bdata就能够确保也可以变高了。

所以如果bclk的频率是1.5倍的aclk频率以上,即使adata是aclk域的一个短pulse,也可以保证3edge要求。如果没有这样频率的关系,那就得对adata有要求了,adata的变化不能很迅速,要稳定足够长的时间,这样才不会让bclk域错过值,具体怎么做呢?

如果必须要求adata的每一次翻转都同步到bclk,一个办法就是利用反馈。也就是说信号从aclk域同步到bclk域,再同步回aclk域。aclk的data只有看到同步回来的值之后才能再翻转。但是这样做的缺点也很明显,就是将aclk的data进行了扩展,两次的同步也增加了延时,这是为了达到每次变化都同步而付出的代价。大多数时候,设计者知道adata变化的频率很低,比如是一个软件配置位,配置好之后可能不轻易更改;比如是一个中断信号,中断发生之后可能需要很长时间才会被软件清除,这些时候就没有必要设计反馈电路了。

最后再讲两个知识点,也是非常关键的知识点。

 第一,利用double flop,bdata发生变化可能是在adata翻转之后1个周期,也可能是2个周期,这是由于第一级flop的metastable可能会resolve在不同的值。如果第一级flop 稳定在和adata相同的值,那么就只需要1个周期就能看到bdata翻转。而如果第一级flop 稳定在和adata相反的值,那么则需要再多一个周期。所以在设计和仿真验证中,不能假定bdata一定会在2个周期之后发生变化,而是将这个因素随机在仿真中,有的时候真的会暴露出设计中的问题。

第二,我们说的单bit信号,有人可能会说,组合逻辑的输出可不可以用double flop呢?比如一个AND门的输出,不也是单bit吗?答案很简单,不可以。原因就是组合逻辑的输出可能会有毛刺,这些毛刺会增大第一级flop产生metastable的概率,进而影响整个synchronizer的MTBF,更严重的问题是由于第一级flop可能稳定在和输入adata不同的值,会导致bdata出现一个不该出现的值。所以对于任何单bit信号,在跨时钟域之前一定要先寄存(flop),只有flop的输出才能经过synchronizer.

 

 

 

 在这个例子中,adata在aclk域一个周期就翻转了,其实是aclk域的一个pulse信号。对于pulse信号,我们其实不应该用double flop来同步。

https://mp.weixin.qq.com/s/ZuG11UtW3aBumt2yznM0sQ

 

 pulse信号在设计当中很常见,通常在某个时钟沿变高,在下一个时钟沿变低。可见当aclk频率比bclk频率高的时候,adata变高一个周期,那么有可能bclk的时钟沿根本看不到这个变化,或者有时候即使能被bclk采到一次,也可能无法满足3个沿的要求,导致无法用常见的2flop synchronizer来去sync。

什么时候会需要使用pulse信号,而将aclk的pulse同步到bclk时钟域呢?

信号为高时,就要有相应的操作发生,为高一个周期,就操作一次,再次为高时,就需要再操作一次,这是和另外一些状态信号(status signal)的差别。对于那些状态信号,它们为高或低只表示一种状态,而与它们为高为低经过了多少个时钟周期没有关系。我们在上一讲说到的用2flop来同步的单bit信号,几乎都是针对的那些状态信号。而对于active时需要进行相应操作的信号来说,很显然由于2flop synchronizer的限制,adata同步到bclk时钟域就无法保证持续相应的周期数,这里可能是最开始的例子bclk连一个cycle的pulse都没有,也可能是持续了多个cycle,自然不能用2flop synchronizer了

当我们要同步aclk时钟域的一个单周期的pulse到bclk时钟域时,我们期望bdata是什么样呢?答案就是,bclk时钟域也是单周期的一个pulse。

如何克服2flop synchronizer的问题呢?

  1. 将aclk时钟域的pulse信号转为一个level信号

  2. 用2-flop synchronizer来同步这个level信号

  3. 在bclk时钟域将同步过来的level信号转化为pulse

 

 

 

 当输入是一个单周期的pulse时,里面Toggle flop的输出只会翻转一下。这样我们就把一个pulse转化成为了level,这个level信号直到下一个pulse来之前都是稳定的,于是我们就可以利用2flop synchronizer来将这个level信号同步到bclk时钟域,然后我们再借助一个XOR和一个flop来重新创造出一个pulse。

pulse synchronizer的局限性:我们转化成为的level的信号Tq要足够长。如果Tq不满足bclk的3edge要求,那么这个level信号我们就无法同步过去,也就无法产生bclk的pulse了。而Tq每次变化是由于aclk来了一个新的pulse,这也就是要求aclk的连续两个pulse之间的间隔要足够大,要满足bclk的3edge要求。

如何满足3edge?:反馈或FIFO

 

 https://mp.weixin.qq.com/s/ThzV5dvRhq8NsscFkQ6oQg

 

标签:bclk,CDC,flop,pulse,synchronizer,信号,时钟
来源: https://www.cnblogs.com/chenjc98/p/16115234.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有