异步复位

 长时间以来,异步复位在电路设计中经常被采用,特别是ASIC设计中。这样的设计非常受欢迎,比如一个异步输入到器件,然后给该异步信号分配全局布线资源,并连接这个异步信号到器件中每一个(几乎所有)寄存器的异步复位引脚。在某些情况下,这种方法有它的优点,但是它并不是没有缺陷。比如并不是每一个设计,器件中的每一个寄存器都需要复位的。所以说这个方法也不是完全不需要消耗布线资源以及LAB范围控制信号,最好的做法是只将复位连接到那些需要复位的寄存器。

         异步复位的一个最大优点是,它们没有象同步复位那样插入到数据路径中。因此,异步复位对寄存器之间的数据到达时间不产生任何负面影响。另一个优点是,它们一般都是即刻生效。只要寄存器收到复位脉冲,寄存器将被即刻复位,而不管相对于时钟的时序关系。所以异步复位不象同步复位那样依赖于时钟。

         电路使用异步并没有任何问题,只是在复位被释放的时候可能会出现问题,所谓的复位释放(Release)有时候也被称为复位去除(Removal)。当复位撤除时,它必须满足异步微建立时间,即µtSU。这个可以在TimeQuest里使用Recovery时间检查来得到确认。此外,复位撤除时,它也必须要满足微保持时间,即µtH。同样可以在TimeQuest使用Removal时间检查来得到确认。总之,上述两种Check被称为Rcovery/Removal分析。

         当复位信号为置无效(Deasserted)时,并且不能通过时序分析里的Recovery和Removal检查时,那么复位信号边沿就会很可能落入了一个亚稳态区域,如图1所示。

 

1.jpg

 

图1:亚稳态曲线

         亚稳态带来的后果是寄存器的输出(基于输入到寄存器的输入数据)需要花费更多的时间来回复到其正确的状态。这个额外增加的时间可能会导致寄存器下一级的建立时间失败,从而导致系统错误。显然,需要不惜一切代价来避免这种情况。

         避免亚稳态的方法之一是在寄存该异步复位的寄存器后增加一系列寄存器,然后使用这些寄存器的输出作为设计的复位。后面增加的寄存器通过将数据同步到时钟的方式来去除亚稳态问题。设计中后续寄存器越接近这些寄存器越好,这样可以最大限度减少布线延时,降低了数据的到达时间,从而增加了平均无故障时间(MTBF)。需要注意,重要的是这些额外增加的寄存器本身不但没有被复位,而且有几个时钟周期通过“冲刷”掉它们当前或者初始状态而被初始化。图2显示了这样一个电路的例子。

1.jpg

 

图2:异步复位跟随几个寄存器的原理图

         在一般情况下,象图12所示的没有反馈电路的流水线设计,它不依赖于时序电路的初始状态,并如果电路能够在跳出复位状态后等待几个周期才开始运作的话,这种类型的复位还是可以接受的。

         图2所示电路的Verilog代码如图3所示。请注意与同步复位代码的差异。现在,复位的有效沿已经位于进程的敏感列表中了。同样重要的是,后续两个寄存器不是在第一个进程的“else”部分,而是位于另外一个进程中,因为如果位于第一个进程的“else”部分,复位信号取反后被连接到寄存器的时钟使能端口,从而将会被推导出时钟使能。可以看到后面两个寄存器在第二个进程中使用了非阻塞赋值。

 

1.jpg

 

图3:异步复位跟随寄存器代码

         约束一个异步复位非常简单,根据定义,异步复位和它们将要复位的寄存器的时钟域之间没有任何确定的时间关系。因此,对这些复位进行静态时序分析是不太可能,它们通常在SDC文件中使用set_false_path语句来进行切割,如图4所示。由于寄存器的复位和时钟之间的时序关系是未知的,所以在TimeQuest中无法对这些路径进行Recovery和Removal分析,即使试图尝试这样做,也不会获得期望的路径报告。即使没有使用假路径约束语句对路径进行切割,也不会有这些路径上的Recovery和Removal报告。

 

1.jpg

 

图4:SDC中对异步复位的约束

         异步复位除了上述潜在的亚稳态问题,另一个问题是它们对噪声的易感染性。一个“嘈杂”的异步复位,很可能导致虚假的复位。出于这个原因,对异步复位进行滤波和去抖是非常重要的。如前所述,由于同步复位经过了时钟寄存,所以同步复位是不太容易出现此问题(虽然不是绝对免疫)。后面我们将看到的同步化的异步复位,会讨论完全避免这个问题的方法。

         同样的,异步复位最大的问题也许还是涉及到复位的释放(移除)。除了潜在的亚稳态问题外,无法保证每个寄存器的异步复位和时钟之间时序关系都是一样的,因为这些寄存器被布局布线于整个器件的各处。如此带来的影响是有些寄存器会及时复位,而有些寄存器不会,而是要等到下一个时钟周期才能复位。对于类似这种一个寄存器的下一个输出依赖与其它寄存器的当前输出反馈电路将带来潜在的灾难性影响。一个常见的例子就是带状态机的电路。One-Hot状态机尤其会有这种问题,因为其一次只有一个状态位被设置。由于有些状态位跳出复位状态,而其它状态位没有,那么就会有多于一个状态位被置高(即有效),这样这个状态机就会进入非法状态。如果使用二进制编码状态机,它可以创建未使用的状态来过渡到复位状态,这使得其成为一个确定性的状态机。这样就允许一个非法的或者闲置的状态得到完美的恢复。

注:现在的Quartus II软件中有一个“Safe State Machine”的综合设置,可以用来保证设计的状态机从非法状态完美恢复。只是这个设置默认是没有打开的。

         尽管我们看到有办法解决异步复位产生的这些问题,但是还是尽可能避免使用异步复位。如何避免上述复位的问题,只能是改变复位的结构,后面我们将会看到一种不同的复位机制,即同步化的异步复位。

原文地址:https://www.cnblogs.com/lueguo/p/3346972.html