跨复位域小结
跨复位域小结
跨时钟域我们比较熟悉,但跨复位域可能就比较陌生了。在平头哥实习的一面中,面试官问了我较多跨复位域的问题,主要还是自己在简历里挖了个坑(就不该写设计复位网络的TAT),所以这篇文章就来简要介绍一下跨复位域中存在的一些问题及解决方法。
异步复位导致的亚稳态
异步复位的释放
复位如果在时钟采样沿的前后的一个时间窗口内释放的话会导致输出的Q端存在亚稳态问题,本质上也是触发器建立时间和保持时间的要求,对复位而言就是Recovery Time和Removal Time的要求。
为解决异步复位释放的亚稳态问题,我们可以使用异步复位,同步释放的方式来解决。
异步复位的置位
复位的置位也可能导致亚稳态问题,主要场景是电路中有多复位域,我们分析一下下图所示场景。
dff1和dff2分别使用不同的时钟和复位信号,dff1先复位,之后dff2再复位。可能存在的问题是arst1置位时,dff1的Q端数据从data向Reset-value跳变时可能不满足dff2的建立/保持时间要求,从而使dff2的Q端出现亚稳态。
以下关于时钟复位的5种情形都可能导致亚稳态:
1、clk1和clk2是一样的/同步的;
2、clk1和clk2是异步的;
3/4、对arst1和arst2均做异步复位,同步释放操作;
5、rst2做同步复位;
如何安全地处理跨复位域
既然跨异步复位域容易出问题,这里给出3种RDC相关信号的设计方法。
首先,我们要识别哪些信号穿越Reset Domain,处理这些信号的大原则如下:
一个Reset Domain复位后,RDC信号不能产生翻转,至少不能被另一个复位域采到。
从上面的原则我们可知,跨复位域的控制信号最好是脉冲而非电平信号,因为电平信号更容易触发RDC的X态传播。
主要解决方法有以下几种:
1、人工确认RDC信号复位时不翻转(不推荐)
如果我们能确认RDC信号不翻转,自然不会带来亚稳态。
但这个方法基本不建议使用,因为很难分析RDC信号复位时是否翻转。
举例来说,假如生成RDC信号的是组合逻辑,如下图。
这种情况下RST0复位了,DFF1和DFF2复位时间可能不相同,显然会给DFF3造成亚稳态。
那么是否信号由寄存器输出就高枕无忧了?
显然不是,我们看下图这种情况
如果实际电路中,DFF3收到的RST0信号比DFF1和DFF2晚,DFF3恰好在采值的过程中被复位了,A点还是亚稳态。
此处我们想一个问题,如果一个处于RST0复位域的异步FIFO为空,如果复位的话会对空/满信号造成毛刺吗?
直观上我们觉得不会,因为FIFO都空了凭什么不让复位。但是注意跨异步复位域的条件,RDC信号不发生翻转。FIFO为空,只能说明读/写指针相等,但他俩不一定为零。
如果把上图中的DFF1当做读指针,DFF2当做写指针,DFF3当做空/满信号,我们就会发现,复位的时候,异步FIFO的空满信号可能会发生跳变。
上面的内容体现了保证RDC信号在reset的时候不发生跳变是一件很难的事。建议还是以下面的方式保证RDC信号的正确性。
2、对复位的顺序提出要求(不推荐)
arst2在arst1之前置位的话,就不存在dff2的亚稳态问题,这种先复位后级模块的策略可以有效避免亚稳态。
但在实际模块设计中,这个很难做到保证。
3、增加数据隔离单元(推荐,需要加钳位寄存器)
在dff1的arst1置位前隔离dff1的输出,将输出钳位到0,避免arst1置位时导致dff2出现亚稳态;
Isolation enable实际上就是一个钳位寄存器,复位流程要进行修改:
- 先配置钳位寄存器为0
- 拉低arst1
- 然后配置钳位寄存器为1
该方法需要注意的是,钳位寄存器需要单独复位。不要错误的将钳位寄存器的复位端连到arst1。
4、通过时钟门控进行数据隔离(推荐,需要dest domain支持CG)
该方法值得推荐,但需要dest domain能单独关闭时钟。与数据隔离单元的思想类似,只不过通过门控dff2的方式来完成数据隔离。
我把DFF2在arst1复位的时候提前关掉,自然复位导致的不稳定信号就不能传递过来了。
一般来讲这种方法是可行的。因为既然单独复位,arst2复位域一般会留出强制关钟的寄存器配置信号。
但这种方法需要在EDA上进行验证,DFF2在工作状态突然关闭时钟,会不会造成其它功能错误。
如果可行,我们要在arst1复位流程中加入clk2关钟流程,等arst1复位信号生效后再开dff2的时钟。
小结
安全处理跨复位域的做法:
- 增加钳位寄存器,在前级模块进行复位前进行数据隔离;
- 复位前级模块时,关闭Dest domain的CG时钟;
有趣的问题
平头哥一面中,面试官提问我,ASIC中复位网络的扇出很大,很难保证所有寄存器都满足recovery和removal time的要求,异步复位/同步释放的方式也解决不了该问题,因为有Skew存在,问此时如何保证正常的异步复位功能,且不用考虑recovery和removal time?
当时面试过程中没答出来,于是问了面试官,面试官说异步复位前先把clock关了,复位后再开clock,这样就可以避免考虑recovery和removal time,这个答案震惊到我了,作下记录,感谢平头哥的面试官!