• 注册
  • 查看作者
  • 深度揭秘数字IC设计中异步复位同步释放原理

     在数字IC设计中肯定会涉及到异步复位的问题,因为需要对电路进行复位操作。以吾爱IC社区小编多年的数字IC行业工作经验,很多芯片出问题都出在复位问题上了。其实这种复位设计主要依靠前端设计以及工具来检查,从数字IC后端的角度上讲,只要在timing signoff阶段检查好removal和recovery的check就好。

     

    Removal timing check

     

     

    Removal time是指在时钟有效沿来临之后,异步复位信号需要继续保持有效的最短时间。满足这个最短时间才能确保对寄存器进行正常的复位。Removal time check的波形图如下图所示。Removal timing check与hold time check类似。

     

     

    Recovery timing check

     

    Recovery time是指在时钟有效沿到来之前,复位信号保持高电平的最短时间。即复位信号变到非复位状态的电平必须在clk之前一定的时间到达。满足这个Recovery time,可以确保在时钟有效沿来临时,异步复位信号处于无效状态,从而确保正常的数据采样。Recovery time的检查波形如下图所示。它的检查和setup 检查类似。

     

     

    从Removal 和Recovery time的定义知道,只要DFF的复位信号不在时钟有效沿附近变化(复位信号远离时钟有效沿),就可以保证电路的正常复位和撤销。

     

    在实际的设计中,比如有的模块是先复位再给模块供应时钟,即保证了复位信号与时钟在时间上是错开的,这种流程可以保证不会出现recovery和removal的问题,因为复位置起撤销时都没有时钟。即使操作流程保证不了,出现recovery和removal违例,由于模块此时都不会工作,也没什么问题。

    同步复位

     

     

    复位信号可以理解为一个普通的数据信号,它只有在时钟的跳变沿才会其作用,一般只要复位信号持续时间大于一个时钟周期,就可以保证正确复位。

    异步复位

    复位可以在任何时候发生,表面上看跟时钟没有关系,但真实情况是异步复位也需考虑时钟跳变沿,因为时钟沿变化和异步复位都可以引起Q端数据变化。如果异步复位信号跟时钟在一定时间间隔内发生变化,Q值将无法确定,即亚稳态现象。这个时候既是异步复位信号持续时间再长都没有办法,因为不定态已经传递下去。

     

    同步复位虽然解决了当时钟的有效沿来临的时候rst_n的边沿也正好来临所出现的冒险与竞争。但是从综合的电路上可以看出,多了一个组合逻辑MUX。

     

    如果设计中所有的复位都是这样的,那会增加很多的资源,导致芯片面积很大。那么有没有更好的解决办法呢?答案是有,那就是异步复位同步释放机制

     

    异步复位,同步释放

    异步复位,同步释放就是指在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。

    如上图,单独看方框2的复位策略,是一个异步复位电路,即复位信号有效时不管时钟信号是否处于有效沿,输出都会被复位。但是如果复位信号在时钟信号的上升沿撤销时,这时候的输出就是亚稳态。

    方框1中电路图是实现异步复位同步释放的关键。

    异步复位

    当rst_async_n有效时,第一个D触发器的输出是低电平,第二个D触发器的输出rst_sync_n也是低电平,方框2中的异步复位端口有效,输出被复位。

    同步释放

    假设rst_async_n撤除时发生在clk上升沿,如果不加此电路则可能发生亚稳态事件(有的时候会打三拍)。但是加上此电路以后,假设第一级D触发器clk上升沿时rst_async_n正好撤除,则D触发器1可能输出高电平“1”,也可能输出亚稳态,也可能输出低电平。但此时第二级触发器不会立刻更新输出,第二级触发器输出值为前一级触发器Q1的输出状态。显然Q1之前为低电平,故第二级触发器输出保持复位低电平。直到下一个时钟有效沿到来之后,才随着变为高电平。即实现同步释放

    在数字后端实现时,如果发现第一级寄存器的异步复位端存在removal和recovery的timing violation,我们可以不用管。因为这一级只是作为过渡,我们不care timing。

     

    异步复位同步释放电路Verilog代码实现:

     

    always @ (posedge clk, negedge rst_async_n)

    if (!rst_async_n) begin

    rst_s1 <= 1'b0;

    rst_s2 <= 1'b0;

    end

    else begin

    rst_s1 <= 1'b1;

    rst_s2 <= rst_s1;

    end

    assign rst_sync_n = rst_s2;

    endmodule

     

     

    小编知识星球简介:

    在这里,目前已经规划并正着手做的事情:

    • ICC/ICC2 lab的编写

    • 基于ARM CPU的后端实现流程(已经发布

    • 利用ICC中CCD(Concurrent Clock Data)实现高性能模块的设计实现(已经发布

    • 其他内容待定

    在这里,各位可以就公众号推文的内容或者实际项目中遇到的难题提问,小编会在24小时内给予解答(也可以发表你对数字后端设计实现中某个知识点的看法,项目中遇到的难点,困惑或者职业发展规划等)。

    星球二维码如下,可以扫描或者长按识别二维码进入。目前已经有二十九星球成员,感谢这二十九位童鞋的支持!欢迎各位铁杆粉丝加入!终极目标是打造实现本知识星球全员年薪百万的宏伟目标。(星球的门槛将会越来越高,有需求的朋友趁早上车

     

     

    【粉丝福利】

     

    小编的知识星球目前已经开通分享有赏金功能,只要分享星球上任意一个主题到朋友圈或者给好友后,每成功邀请一个好友,即可获得现金奖励

     

     

    好了,今天的码字就到这里了,原创不容易,喜欢的可以帮忙转发和赞赏,你的转发和赞赏是我不断更新文章的动力。小编在此先谢过!与此同时,吾爱IC社区(52-ic.com)也正式上线了。吾爱IC社区(52-ic.com)是一个专业交流和分享数字IC设计与实现技术与经验的IC社区。如果大家在学习和工作中有碰到技术问题,欢迎在微信公众号给小编留言或者添加以下几种联系方式进行提问交流。

     

     

     

  • 0
  • 0
  • 0
  • 759
  • 单栏布局 侧栏位置: