热度 16| |
什么是复位同步电路 reset synchronizer?
下图是一个最简单的复位同步电路。 这个电路的输出rstn_sync 用作后续电路中D flip flop的复位信号。
这个电路的工作原理是:
- 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?
这和 D flip flop 一个比较隐蔽的 timing 指标有关 – removal/recovery time。 D flip flop 对时钟沿 active edge 和复位的 release edge 是有时序要求的。通常,D flip flop 复位端的 release edge 必须要滞后时钟 active edge 一段时间(removal time),而且还要超前下一个时钟active edge 一段时间(recovery time)。 如果有违例,那这个 D flip flop 就会进入亚稳态,在后仿中显示为 X。
复位同步电路 reset synchronizer 的输出 rstn_sync 相对于时钟 clk 有一个固定的时序关系。 在 PnR (place & route) 中,工具构造 buffer tree 去 buffer rstn_sync,并算出 buffer 后 rstn_sync 到后续每个 D flip flop 复位端的时间,通过插入或调整 buffer, 保障后续电路中每一个 D flip flop 的复位端都满足 removal/recovery 要求。 反之,如果 rstn_sync 相对于时钟 clk 没有有一个固定的关系,那工具就无从下手了,也就无法保障 removal/recovery 要求了。
顺便说一下,综合工具是不查 removal/recovery time 的。 如果复位电路上有错,通常会在设计流程很后面才发现,改起来代价也会高一些。 所以一定要在一开始就重视复位电路。
为什么复位同步电路 reset synchronizer 自己不会进入亚稳态?
前面讲了,第一级的 D flip flop 是有可能进入亚稳态。 关键在于第二级。第二级的 D 输入端在第一个 clk 到来的时刻仍是稳定的低电平(第一级的输出此时尚未变成亚稳态 X),第二级的的状态不需要改变,仍旧保持原来复位后的0 状态。 等到第二个 clk 到来的时候,如果第一级已经不在亚稳态了,第二级的 D 输入就是一个稳定的1,那第二级的输出rstn_sync自然就变成稳定的1了。 即使第一级在第二个 clk 到来的时候没有完全走出亚稳态, 只要第一级的输出不在中间值附近,第二级仍会把第一级的输出当成0或1,第二级的输出 rstn_sync也就因此为稳定的0或1。 这也就是为什么有时候复位同步电路 reset synchronizer 的 latency 是在1-3个时钟之间。
有条件的同学,不妨跑一下Spectre sim, 观察一下 D flip flop内部的信号,加深 removal/recovery time 的理解。 眼见为实。
如果两个D flip flop 还不够 MTBF 指标(发生亚稳态的概率仍不够小),可以再加第三级。
有些标准元库中有专门的同步电路,synchronizer cell。 应该尽量使用这种synchronizer cell, 比自己用两个 D flip flop 搭更可靠。 专门的 synchronizer 第二级是高增益的,大大降低第二级进入亚稳态的可能性。
复位同步电路 reset synchronizer 能加到扫描链里吗?
这里加了两个MUX,这样可以让工具把同步复位电路的两个D flip flop 连到 scan chain 里,增加 test coverage。
使用复位同步电路 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了。 内部产生复位信号是一个很有效的设计技巧。 这个技巧复用现成的 reset network 同时将很多D flip flop 清零,省去了在 D flip flop 的 D 输入逻辑(D input logic cone)加上清零条件,可以节省很多门。
复位同步电路 reset synchronizer在RTL里的实现
通常做成一个单独的module,在主设计中例化这个 module。
好了,希望复位同步讲全面了。