马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
什么是同步复位电路 reset synchronizer? 下图是一个最简单的同步复位电路。 这个电路的输出rstn_sync用作后续电路中Dflip 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? 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 到来的时候没有完全走出亚稳态, 只要第一级的输出不在中间值附近,第二级仍会把第一级的输出当成0或1,第二级的输出rstn_sync也就因此为稳定的0或1。 这也就是为什么有时候同步复位电路 reset synchronizer的latency是在1-3个时钟之间。 有条件的同学,不妨跑一下Spectresim, 观察一下 D flip flop内部的信号,加深removal/recoverytime的理解。 眼见为实。 如果两个Dflip flop 还不够 MTBF 指标(发生亚稳态的概率仍不够小),可以再加第三级。 有些标准元库中有专门的同步电路,synchronizercell。 应该尽量使用这种synchronizercell, 比自己用两个 D flip flop 搭更可靠。 专门的 synchronizer 第二级是高增益的,大大降低第二级进入亚稳态的可能性。 同步复位电路 reset synchronizer能加到scanchain里吗?
这里加了两个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 flop的D输入逻辑(Dinput logic cone)加上清零条件,可以节省很多门。 同步复位电路 reset synchronizer在RTL里的实现 通常做成一个单独的module,在主设计中例化这个 module。 好了,希望复位讲全面了。
|