协会网站建设计划,做宣传网站买什么云服务器,外贸wordpress模板,大二学生做网站难吗首先来复习一个更加基础的概念#xff1a;同步reset和异步reset。
同步reset#xff08;synchronous reset#xff09;是说#xff0c;当reset信号为active的时候#xff0c;寄存器在下一个时钟沿到来后被复位#xff0c;时钟沿到来之前寄存器还是保持其之前的值。
异步…首先来复习一个更加基础的概念同步reset和异步reset。
同步resetsynchronous reset是说当reset信号为active的时候寄存器在下一个时钟沿到来后被复位时钟沿到来之前寄存器还是保持其之前的值。
异步resetasynchronous reset是说当reset信号为active的时候寄存器立刻被复位与时钟沿到来与否没有关系。
注意这里作者没有说reset信号为1的时候而是说active因为有的时候是为1能够使寄存器复位这个时候我们说high active而有的时候是0能够使得寄存器复位这个时候我们说low active。
同步reset和异步reset的区别算是数字芯片设计的入门知识点一般第一轮面试就会考察如果这个问题回答的不好那么大概率会被面试官认为一般无论是初学还是工作几年的工程师很有可能不注意这些基本功但是基本功在数字芯片设计中的非常重要的。
首先同步reset和异步reset最主要的区别从定义上就可以看出来同步reset需要时钟而异步reset不需要时钟如果说你的模块需要在没有时钟的时候复位那只有异步reset能够做到这也是绝大多数芯片的上电复位信号Power Reset以及一些PHY比如USB的内部需要异步reset的原因而在一些IP中如果你可以等到时钟开始反转之后再复位时钟开始翻转之前内部即使没有复位也没有关系的话那么就可以用同步reset。
其次一个差别即同步reset信号在综合后reset信号和其他的datapath信号一样时一起算在两个寄存器之间的logic深度里D寄存器本身时没有复位的pin的而异步reset信号通常会综合出一个带有 复位pin的D寄存器一般来说工艺厂家的standard cell library都会提供两种不同的寄存器只要你的coding style正确综合工具会选择适当的flop。 上图是同步reset综合出来之后的netlist可以看出reset_n使得两级寄存器之间的组合逻辑多加了一个AND门。
always_ff (posedge clk) beginif (!reset_n) beginq2 1b0;endelse begin// q2 ...end
end
对于异步reset综合出来的flop自带reset pin所以reset不参与中间的组合逻辑如下图D2所示。 always_ff (posedge clk or negedge reset_n) beginif(!reset_n) beginq2 1b0;endelse begin//q2 ...end
end
【同步reset劣势】从综合出来的逻辑可以看出异步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 timehold timemin pulse等一系列check在timing close的情况下我们可以拍着胸脯保证寄存器不会因为reset的变化产生metastable所以同步reset信号的跨时钟域咱们就不废话了可是对于异步reset就没有那么简单了既然是异步那就是在任何时候都可能变化现在STA所以叫static timing anslysis是因为工具是静态分析电路的给定一个时钟沿的起始点然后后面每一级的delay都是纯粹的累加晚到就是violation可是如果一个信号什么时候来都无法确定那么就无法判断这个信号的datapath上最后能否满足required time换句话说纯粹的异步reset在当前STA check中是没有办法检查的。
那么怎么办呢难道对于异步reset信号就听之任之放任不管吗当然不是我们做IC设计的当然要对每一个细节都要研究清楚我们这里要分两种情况1reset assertion2reset release。好直接上结论
如果使用异步resetreset assertion是异步的但是reset release一定是和时钟同步的
因为对于reset assertionreset active之后flop的值是稳定在reset value的只要reset急促active来多少个clcok其他datapath上的信号怎么变flop的值都不会变化所以reset在什么时候assertion都没有关系但是reset release就不一样了一旦reset从active de-assertion在STA里有两个专门的参数来check叫做recovery time和removal time。
recovery time和removal time的意义请异步
什么是寄存器的recovery time和removal time_recover time-CSDN博客
换句话说reset release必须在recovery time和removal time加起来这个窗口之外就保持稳定这样才能保证寄存器不会产生metastable。
好下面的问题就变成了我们如何设计可以使得异步reset信号是异步assertion同步 release呢终于要引出本文的主题了将一个异步的reset信号同步到一个时钟域并且还要保证assertion是异步的但是release是同步于这个时钟的我们把这样的电路叫做reset synchronizer如下图所示。 可以看到当src_reset_n asset时两个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的概率。
这里还要注意一点就是上述只是对reset_n release做了到dst_clk的同步如果dst_clk 的频率很高recovery time和removal time不能meet怎么办呢
那就需要对异步reset的time constrain进行特殊的设置了。 文章前面借鉴了Reset信号 如何同步