跨复位域小结

跨时钟域我们比较熟悉,但跨复位域可能就比较陌生了。在平头哥实习的一面中,面试官问了我较多跨复位域的问题,主要还是自己在简历里挖了个坑(就不该写设计复位网络的TAT),所以这篇文章就来简要介绍一下跨复位域中存在的一些问题及解决方法。

异步复位导致的亚稳态

异步复位的释放

复位如果在时钟采样沿的前后的一个时间窗口内释放的话会导致输出的Q端存在亚稳态问题,本质上也是触发器建立时间和保持时间的要求,对复位而言就是Recovery Time和Removal Time的要求。

1

为解决异步复位释放的亚稳态问题,我们可以使用异步复位,同步释放的方式来解决。

2

异步复位的置位

复位的置位也可能导致亚稳态问题,主要场景是电路中有多复位域,我们分析一下下图所示场景。

3

dff1和dff2分别使用不同的时钟和复位信号,dff1先复位,之后dff2再复位。可能存在的问题是arst1置位时,dff1的Q端数据从data向Reset-value跳变时可能不满足dff2的建立/保持时间要求,从而使dff2的Q端出现亚稳态。

以下关于时钟复位的5种情形都可能导致亚稳态

1、clk1和clk2是一样的/同步的;

4

2、clk1和clk2是异步的;

5

3/4、对arst1和arst2均做异步复位,同步释放操作;

6

5、rst2做同步复位;

7

如何安全地处理跨复位域

1、对复位的顺序提出要求

8

arst2在arst1之前置位的话,就不存在dff2的亚稳态问题,这种先复位后级模块的策略可以有效避免亚稳态。

2、增加数据隔离单元

9

在dff1的arst1置位前隔离dff1的输出,将输出钳位到0,避免arst1置位时导致dff2出现亚稳态;

3、通过时钟门控进行数据隔离

10

与数据隔离单元的思想类似,只不过通过门控dff2的方式来完成数据隔离。(门控时钟也可以有效解决异步复位的recovery和removal time的问题,异步复位后再开时钟就不用考虑上述time的检查。

4、通过打拍降低亚稳态概率

11

通过增加一个dff3来减少亚稳态发生的概率。

小结

安全处理跨复位域的做法:

  • 依序对模块进行复位,后级模块先复位
  • 通过数据隔离单元或门控时钟进行数据隔离,避免出现亚稳态;
  • 后级模块通过两级同步寄存器降低亚稳态发生的概率;

平头哥一面中,面试官提问我,ASIC中复位网络的扇出很大,很难保证所有寄存器都满足recovery和removal time的要求,异步复位/同步释放的方式也解决不了该问题,因为有Skew存在,问此时如何保证正常的异步复位功能,且不用考虑recovery和removal time?

当时面试过程中没答出来,于是问了面试官,面试官说异步复位前先把clock关了,复位后再开clock,这样就可以避免考虑recovery和removal time,这个答案震惊到我了,作下记录,感谢平头哥的面试官!

Reference

Reset Domain Crossing