关于复位的一些总结

同步reset(synchronous reset)是说,当reset信号为active的时候,寄存器在下一个时钟沿到来之后被复位,时钟沿到来之前寄存器还是保持其之前的值。

异步reset(asynchronous reset)是说,当reset信号为active的时候,寄存器立刻被复位,与时钟沿到来与否没有关系。

注意这里老李没有说reset信号为1的时候,而是说active,因为有的时候是为1能够使寄存器复位,这个时候我们说high active,而有的时候是0能够使寄存器复位,这个时候我们说low active。

同步reset和异步reset的区别算是数字芯片设计的入门知识点,一般第一轮面试就会考察。如果这个问题回答不好的话,那么你在面试官心里的印象一定是低于平均值的。老李在这里带大家简单复习一下,如果你对下面这些内容已经烂熟于心,就直接跳过吧。

首先同步reset和异步reset最主要的区别,从定义上就可以看得出,同步reset需要时钟,而异步reset不需要时钟。如果说你的模块需要在没有时钟的时候复位,那只有异步reset能够做到,这也是绝大多数芯片的上电复位信号(PowerOn Reset)以及一些PHY比如USB的内部需要异步reset的原因。而在一些IP中,如果你可以等到时钟开始翻转之后再复位,时钟开始翻转之前内部即使没有复位也没有关系的话,那么就可以用同步reset。

其次一个差别,即同步reset信号在综合后,reset信号和其他的datapth信号一样,是一起算在两个寄存器之间的logic深度里,D寄存器本身是没有复位的pin的。而异步reset信号通常会综合出一个带有复位pin的D寄存器。一般来说工艺厂家的standard cell library都会提供两种不同的寄存器,只要你的coding style正确,综合工具会选择适当的flop。

在这里插入图片描述
上图是同步reset综合出来之后的netlist,可以看出reset_n使得两级寄存器之间的组合逻辑多加了一个AND门。

always_ff @(posedge clk) begin
if (!reset_n) begin
q2 <= 1’b0;
end
else begin
// q2 <= …
end
end
对于异步reset,综合出来的flop自带reset pin,所以reset不参与中间的组合逻辑,如下图D2所示

在这里插入图片描述
always_ff @(posedge clk or negedge reset_n) begin
if(!reset_n) begin
q2 <= 1’b0;
end
else begin
//q2 <= …
end
end
从综合出来的逻辑可以看出,异步reset由于对寄存器之间的datapath没有贡献,所以在timing上面能够略微比同步reset好一些,特别是reset信号作为一个负载很大的信号,如果reset tree做得不好可能使得reset path的combo delay变得很大,反而限制了performance的提高。所以在对logic depth抠得很细的设计中,可以使用异步reset来避免引入更多的combo delay。

但是同步reset还有一个优势,由于reset信号会最终起作用在寄存器的D输入端,那么通过reset的组合逻辑都会被STA所约束,也就是说reset信号和其他datapath的信号一起要满足寄存器的setup time, hold time, min pulse等一系列check,在timing close的情况下我们可以拍着胸脯保证:寄存器不会因为reset信号的变化产生metastable。(所以同步reset信号的跨时钟域咱们就不废话了)可以对于异步reset就没有这么简单了,既然是异步,那么就是在任何时候都可能变化。现在STA之所以叫static timing analysis,是因为工具是静态分析电路的:给定一个时钟沿的起始点,然后后面每一级的delay都是纯粹的累加,最后再和required time来进行比较,比required time早到,就是满足timing,晚到就是violation。可是如果一个信号什么时候来都无法确定,那么就无法判断这个信号的datapath上最后能否满足required time。换句话说,纯粹的异步reset在当前的STA check中是没有办法检查的。

那么怎么办呢?难道对于异步reset信号就听之任之放任不管吗?当然不是,我们做IC的当然要对每一个细节都要研究清楚。我们这里要分两种情况:1. reset assertion; 2. reset release。老李直接上结论:

如果使用异步reset,reset assertion是异步的,但是reset release一定要和时钟同步!

因为对于reset assertion,reset active之后flop的值是稳定在reset value的,只要reset继续active,来多少个clock,其他datapath上的信号怎么变,flop的值都不会变化,所以reset 在什么时候assertion都没关系。但是reset release就不一样了,一旦reset从active变为in-active,那么flop之后的值就得取决于其他信号输入和时钟沿的关系了,所以对于reset de-assertion,在STA里有两个专门的参数来check,叫做recovery time和removal time。

recovery time指的是reset release之后要求距离下一个时钟沿的最小间隔,可以类比于其他信号datapth上的setup time。

removal time指的是reset release之后要求距离上一个时钟沿的最小间隔,可以类比于其他信号datapth上的hold time。
换句话说,reset release必须在recovery time和removal time加起来这个窗口之外,这样才能保证寄存器不会产生metastable。

在这里插入图片描述
好,下面的问题就变成了,我们如何设计可以使得异步reset信号是异步assertion, 同步release呢? 终于要引出我们今天的主题,将一个异步的reset信号同步到一个时钟域,并且还要保证assertion是异步的,但是release是同步于这个时钟的,我们把这样的电路叫做reset synchronizer, 如下图所示。
在这里插入图片描述
可以看到,当src_reset_n assert时,两个flop被异步reset,它们的Q会经过reset-to-q的延时之后立刻发生变化,使得dst_reset_n assert。
而当src_reset_n release后,dst_reset_n并不是立刻发生变化,而是要等待dst_clk的时钟沿,并且打两拍之后才能将1传递到dst_reset_n。因为dst_reset_n是来自于flop的Q,而Q是经过dst_clk上的同步信号。那为什么要两级flop,还是为了减小产生metastable的概率。

复位信号不满足recovery time和removal time本质上就是不满足setup/hold。进一步解释:复位信号也可以把它看成是一种输入的数据信号,当复位释放时,如果没满足setup/hold(即复位释放点实在触发器的setup/hold窗口内),那么此时触发器不确定这个复位信号到底生不生效,也就是说不确定是输出复位值(复位生效)还是数据输入端的值(复位不生效),这就是说图中的reg1会发生亚稳态的原因,那为什么reg2不会发生亚稳态呢?因为reg2的输入是reg1的输出,复位释放之前这里是0,那么就算reg2发生了亚稳态,reg2不确定是输出复位值还是输入的数据,但是因为复位值和数据输入都是0,所以无论reg2判定复位有不有效,输出都是0,可以看成是不会发生亚稳态(即不确定输出是0还是1)。但是其实reg2本质上是发生了亚稳态的,它输出的0不能确定是复位信号导致的还是说是数据输入端来的。
避免复位亚稳态发生就是避免在reg输入数据跳变的时候复位,可采用的方法是:
对于REG2而言,其D输入和CDN复位值可能出现竞争。在复位时之前就保证上游模块出口数据处于某一个稳定状态。
注意,对于一个使用异步reset的模块,reset synchronizer是必须的,但是也不要对一个异步reset信号进行多次reset synchronizer,否则同样的会产生coherency的问题。

有人会问了?什么是coherency?下面这张图就明白了:
在这里插入图片描述

如果复位的释放与时钟异步(通常就是这种情况),那么就无法保证所有触发器都能在同一个时钟边缘释放(图2)。
在这里插入图片描述

。当在A时刻释放reset时,触发器将在第一个时钟边沿检测到有效的释放信号;在C时刻释放reset时,复位的释放将直到下一个时钟边沿才被检测到;B时刻时钟上升沿时触发器检测到的reset状态很难确定(可能高电平,也可能低电平),可能导致亚稳态。
异步复位的复位信号必须满足一定的恢复时间和解除时间,否则没法确定时钟沿是否起作用了,即判断不了到时是复位了还是没复位。D触发器如果不复位,那么输出就是输入的数据。

1). 不满足复位恢复时间或者撤离时间,可能会导致亚稳态问题。(注意是可能)因为如果输出本身就是复位后的值,即使当前时钟沿不能判断是否复位,输出也是复位值,这时候就不会产生亚稳态,因为已经是复位态了。

2). 不满足复位恢复时间或者撤离时间可能会导致不同FF复位状态不一致的问题。复位信号和时钟信号一样,通过复位网络到达各个触发器。复位网络具有非常大的扇出和负载,到达不同的触发器存在不同的延时,不满足复位恢复或者解除时间的情况下,**就有可能在不同的触发器的不同时钟周期内进行解复位。**注意,这里的假设条件是复位树和时钟树已经做成立平衡状态,不再考虑复位树和时钟树没做好的情况。异步复位可能导致复位解除(reset removal) 发生在不同的触发器的不同时钟周期

Does It Really Matter?
好消息是,在99.99%的情况下,全局复位的异步释放对系统没什么影响,所以大多数电路都能正常工作。如果一个电路不工作,那可能恰好是遇到了另外的0.01%,不幸地在错误的时间释放了复位。

在图4所示的流水线场景中,复位释放的时间并不重要。
在这里插入图片描述
当数据通过流水线进程时,复位的释放时间无关紧要。即使出现了错误,在经过一定时钟周期后整个系统就能恢复。这种情况下,复位是没有意义的。当有效的数据输入时,初始状态或者未知的状态将从系统中清除。

但是,在图5显示了的独热码状态机场景中复位释放的时间非常重要。
在上面的独热码状态机中,有明显的失败可能性。如果第一个触发器在第二个触发器的前一个时钟周期释放,那么独热码的热状态将丢失,状态机将永远变冷(状态机无法恢复)。将所有的触发器尽可能的靠近布局能够降低错误的发生概率(在局部重置网络上的低倾斜)。然而,除非Set-up timie建立时间得到保证,否则这种错误情况仍有可能发生。如果所有触发器没有在同一个时钟周期中释放,编码后的状态机可能进入意外状态或则会非法状态。

最后,需要仔细考虑复位的是包含反馈路径的电路。

没有反馈的电路实际上根本不需要复位。在数字信号处理应用中,有限脉冲响应滤波器(FIR)是没有反馈的。在有效数据填充了所有的抽头之前,输出样本实际上没有有效的值,所以复位抽头寄存器没有任何效果。然而,无限脉冲响应滤波器(IIR)包含反馈。如果因为不干净的复位释放而产生了一些不符合预期的输出,该输出结果又会返回到输入,那么会在很长一段时间内无法获取真实的输出结果(反馈环路互相影响了)。在最坏的情况下,由于不稳定,滤波器可能会完全失效。

一般逻辑对此时序不用关心,比如很多模块的操作流程是复位完了,才开启模块时钟,再启动模块工作。这种流程可以保证不会出现recovery和removal的问题,因为复位置起撤销时都没有时钟;即使操作流程保证不了,出现recovery和removal违例,由于模块此时都不会工作,也没什么问题。

需要关心recovery和removal问题的最常见模块应该是CPU,因为一般CPU是在复位撤销后就开始工作。想象一下,CPU的工作其实是在很多个DFF一起配合完成的,如果复位撤销时刻在DFF的clock沿附近,势必导致各个DFF开始动作的步调不一致,导致无法预料的错误情形。

处理办法就是讲需要考虑recovery和removal问题模块的复位信号,用模块的工作时钟同步后,再送进模块使用。这样PR工具是会自动检查这个模块的DFF的时序并修正,直到没有recovery和removal的violation。对于其他没有要求的模块复位信号,设置false path不去检查这个时序即可。

另外,复位还需要注意RDC处理的问题,也就是比信号跨复位域传播的问题。后续补充。。。。。

  • 6
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值