在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5249|回复: 11

[原创] 同步复位电路 reset synchronizer

[复制链接]
发表于 2021-1-14 10:09:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
什么是同步复位电路 reset synchronizer?  
下图是一个最简单的同步复位电路。 这个电路的输出rstn_sync用作后续电路中Dflip flop的复位信号。
image.png
这个电路的工作原理是:
-       PorZ 低电平,同步复位电路里的两个 D flip flop 都被复位。电路的输出 rstn_sync 为0,后续电路被复位。
-        PorZ 由低变高。clk上升沿到来时,第一个 D flip flop 先变1。 过一个周期,第二个 D flip flop 变1,rstn_sync变1,后续电路离开复位状态,开始正常工作。
-       如果 PorZ 由低变高和 clk 上升沿离得很近,第一个 D flip flop 可能进入亚稳态 (metastability)。 不过没关系,第二个 D flip flop 的输出rstn_sync还是稳定的。 同步复位的主要功能就是保障rstn_sync 是稳定的0或1,在芯片的有生之年不发生亚稳态(或亚稳态的机率小到忽略不计)。同时,保障rstn_sync相对于 clk 有一个固定的时序关系。下面详细讨论。   
为什么需要同步复位电路 reset synchronizer?  removal/recoverytime
这和 D flip flop 一个比较隐蔽的 timing 指标有关 – removal/recovery time D flip flop 对时钟的沿 activeedge 和复位的 release edge 是有时序要求的。通常,Dflip flop复位端的 release edge 必须要滞后时钟 active edge 一段时间(removaltime),而且还要超前下一个时钟activeedge一段时间(recoverytime)。 如果有违例,那这个 D flip flop 就会进入亚稳态,在后仿中显示为 X
同步复位电路 reset synchronizer 的输出 rstn_sync 相对于时钟 clk 有一个固定的时序关系。 PnR(place & route) 中,工具构造buffertree buffer rstn_sync,并算出buffer rstn_sync 到后续每个 D flip flop 复位端的时间,通过插入或调整buffer 保障后续电路中每一个Dflip flop 的复位端都满足 removal/recovery 要求。 反之,如果rstn_sync相对于时钟 clk 没有有一个固定的关系,那工具就无从下手了,也就无法保障removal/recovery要求了。
顺便说一下,综合工具是不查removal/recoverytime的。 如果复位电路上有错,通常会在设计流程很后面才发现,改起来代价也会高一些。 所以一定要在一开始就重视复位电路。
为什么同步复位电路 reset synchronizer 自己不会进入亚稳态?
前面讲了,第一级的 D flip flop 是有可能进入亚稳态。 关键在于第二级。第二级的D输入端在第一个 clk 到来的时刻仍是稳定的低电平(第一级的输出此时尚未变成亚稳态 X),第二级的的状态不需要改变,仍旧保持原来复位后的0状态。 等到第二个 clk 到来的时候,如果第一级已经不在亚稳态了,第二级的D输入就是一个稳定的1,那第二级的输出rstn_sync自然就变成稳定的1了。 即使第一级在第二个 clk 到来的时候没有完全走出亚稳态, 只要第一级的输出不在中间值附近,第二级仍会把第一级的输出当成01,第二级的输出rstn_sync也就因此为稳定的01 这也就是为什么有时候同步复位电路 reset synchronizerlatency是在1-3个时钟之间。
有条件的同学,不妨跑一下Spectresim, 观察一下 D flip flop内部的信号,加深removal/recoverytime的理解。 眼见为实。
如果两个Dflip flop 还不够 MTBF 指标(发生亚稳态的概率仍不够小),可以再加第三级。
有些标准元库中有专门的同步电路,synchronizercell 应该尽量使用这种synchronizercell 比自己用两个 D flip flop 搭更可靠。 专门的 synchronizer 第二级是高增益的,大大降低第二级进入亚稳态的可能性。
同步复位电路 reset synchronizer能加到scanchain里吗?  
image.png
这里加了两个MUX,这样可以让工具把同步复位电路的两个Dflip flop 连到 scan chain里,增加testcoverage
使用同步复位电路 reset synchronizer需要注意的地方
一个同步复位电路 reset synchronizer只能用到一个时钟域。如果有几个不同步的时钟域,就要考虑使用多个同步复位电路。同步的时钟域可以考虑复用一个同步复位电路 reset synchronizer,但要做得仔细一些。
同步复位电路 reset synchronizer有什么弊病吗
同步复位电路 reset synchronizer其实只在复位信号release的时候派上用场。复位结束后,这个电路其实就没用了。 但这个电路的时钟还在switch,这个电路还在耗电。 如果是高速时钟,这个耗电就可观了。 低功耗设计,就要考虑是否可以关掉时钟。 这个根据不同场景,就非常复杂了,需要非常小心。
同步复位电路 reset synchronizer是必须的吗?
很多人通常不加思索一上来就加上同步复位电路 reset synchronizer。这种条件反射本身是好习惯。
如果精益求精,那就要多思考一下了。 有些场景是不需要同步复位电路 reset synchronizer的。
复位的目的是让电路有个明确的起始状态。 如果不需要明确的初始状态,而且电路跑一段时间后能清除所有不确定状态,进入正常状态,那就可以考虑不用同步复位。 例如FIR 如果使用场景中可以容忍初始输出为垃圾,异步复位是可以的。
还有一个被99%的设计者忽略的场景。 如果复位信号release的时候,时钟还没有启动,那就根本不需要同步复位电路 reset synchronizer 很多时候,芯片是内部oscillator,PLL 提供时钟的。 oscillator,PLL启动都需要时间的。如果复位在这段时间内 release 那就不需要同步复位电路 reset synchronizer 了。 在低功耗设计中,尤其是多个内部时钟域的场景,省下的功耗就可观了。 当然,设计要做得非常仔细。
还有一个场景就是内部产生的复位信号。 做得精妙的设计,可以保证在内部复位release的时候没有时钟,也就不需要什么同步复位电路 reset synchronizer了。 内部产生复位信号是一个很有效的设计技巧。 这个技巧复用现成的resetnetwork同时将很多Dflip flop清零,省去了在Dflip flopD输入逻辑(Dinput logic cone)加上清零条件,可以节省很多门。
同步复位电路 reset synchronizerRTL里的实现
通常做成一个单独的module,在主设计中例化这个 module  
  
好了,希望复位讲全面了。


发表于 2021-1-14 10:18:09 | 显示全部楼层
支持.......thanks...
发表于 2021-1-14 11:11:24 | 显示全部楼层
mark,多谢分享
发表于 2021-2-4 10:01:16 | 显示全部楼层
mark 学习受教
发表于 2021-2-4 10:59:01 | 显示全部楼层
thanks for sharing
 楼主| 发表于 2021-2-4 12:17:29 | 显示全部楼层


谢谢! 尽量挤出时间把这些 fundamental 的概念写下来,希望能能有点帮助。

发表于 2021-2-4 13:09:17 | 显示全部楼层


jake 发表于 2021-2-4 12:17
谢谢! 尽量挤出时间把这些 fundamental 的概念写下来,希望能能有点帮助。

...


多谢.
不过最好有波形图结合说明,这样更直观.
坛里另外一个高手就以这种方式发了一篇"乒乓效应"的文章,很不错,受益匪浅.
希望楼主多发文章,让我们多学习学习.
发表于 2021-2-20 19:50:23 | 显示全部楼层
Jake,如果异步复位,那工具是不会查recovery/removal timing,所以不能保证,但是如果做了同步释放,那recovery/removal timing是可以靠工具去保证,可以这么理解吗
 楼主| 发表于 2021-2-21 01:10:07 | 显示全部楼层


andywang3791 发表于 2021-2-20 05:50
Jake,如果异步复位,那工具是不会查recovery/removal timing,所以不能保证,但是如果做了同步释放,那rec ...


是的。
约束里异步复位输入通常有个 set_false_path,如果设计中没有复位同步电路,工具遵循这个 set_false_path 是不会查每个 flop removal/recovery timing 的。

加了复位同步电路,工具知道这个电路的输出与时钟有固定关系,工具会自动查与这个输出相连的所有 flop 的 removal/recovery。

发表于 2021-7-7 17:47:58 | 显示全部楼层
多谢分享。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 01:10 , Processed in 0.023041 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表