同步时钟域存在亚稳态吗
某网站上有人提问,同步时钟域是否会存在亚稳态的问题?
答案是肯定的,同步时钟域同样可能存在亚稳态,关于具体原因,我们从本质上进行初步分析。
1.什么是亚稳态?
在数字电路中,每一位数据不是1就是0。当然对于电路来说,并非1就是1V,0就是0V,对于不同的器件它们都有不同的对应区间。对于某个器件来说,0.55V以上可以识别出来是高电平,0.25V以下可以识别出来是低电平,但是如果信号的电压处于0.25~0.55V之间,器件也就无法识别是高电平还是低电平(最终的结果可能是高电平也可能是低电平,无法预测),这种状态也就是亚稳态。
2.为什么会出现亚稳态?
亚稳态的出现归根到底就是因为建立时间和保持时间不满足要求。
建立时间:时钟沿到来之前数据所要保持稳定的时间。
保持时间:时钟沿到来之后数据所要保持稳定的时间。
具体关于这个的解释,其实有很多资料,在此就不做过多解释。根据这个原因,我们可知,如果在同步时钟域中存在建立时间或者保持时间不满足的情况,那么就会出现亚稳态问题。一般情况下,EDA工具在进行STA分析时,就会保证在同步时钟域下的timing问题,保证timing最终会收敛。但是如果一不小心,还是会有EDA在进行STA分析时检查不到的地方,下面就举两个小栗子。
同步时钟域下的亚稳态小栗子1-异步复位
在数字电路中,常常采用的DFF是异步复位同步释放的电路,这样的电路和同步复位电路之间的区别在此也不再多讲。
如下图所示电路
如果两个DFF在连接的是同一个clk,那么这段电路就是同步时钟域下的电路。如果存在前者的reset和后者的reset不是同一个reset信号,换句话说,两者不是同时复位的,甚至前者比后者更早复位,那么就会出现亚稳态的问题。
原因在于EDA在STA时会做reg2reg的timing收敛,但是注意,STA能够做的是分析从DFF的Tclk2q 再加上组合逻辑延迟是不是满足reg2reg的setup/hold timing。但是它不会check从reset端发出的timing,因为复位是可能在任何时候发生的,所以没法进行STA分析。所以这就是现在不仅仅只是check CDC,也得注意check RDC的原因。
如果需要解决这样的问题,主要有以下几种方式。
1.同步时钟域内使用同一个reset源。
2.保证reset sequence,保证后面的reset不晚于前序reset复位。
3.同CDC类似,做同步处理,即在两个DFF之间再插入同步器,这里需要注意的是,需要保证logic和原有一致,有些电路对timing 有严格需求可能不能这么做。
4.在第一级DFF后面添加clamp电路,这样钳制DFF的输出值不会对后续电路造成影响,clamp可以是组合电路,这样就不会带来timing cycle的问题。(具体操作下次可以开一篇文章再讲讲)。
同步时钟域下的亚稳态小栗子2-可变延迟链
电路中存在延迟链,特别是可编程的延迟链时,是很容易发生亚稳态问题的,如下图所示。
这种电路在进行STA分析的时候,一般会采取两种方式。
1.set_false_path,直接不检查这段path的timing
2.set_case_analysis multi_cycle。
无论哪种,我们都无法保证遍历到所有情况下,都不会触发hold/setup violation,因此也是存在亚稳态概率的。