Adaptive retiming是指在组合逻辑中向前或向后移动寄存器和latch来优化worst negative slack (WNS)的一种高级时序优化方法。
如下图,当寄存器前后的组合逻辑有松有紧时,寄存器向时序紧的一边移动,把紧的组合逻辑拆出一部分,挪到时序松的一边来,让两边的逻辑延时更均匀一些。寄存器在移动的同时,为了保证逻辑等价,会根据需要自动进行复制与合并。
图一
对于寄存器D端的data path,这个data path的组合逻辑有M个输入,一个输出。当发现这个data path时序是瓶颈,需要进行retime拆分。假设我们把它拆分两部分A和B,准备把B挪到寄存器右边去,以此来进行延时优化。逻辑B有N个输入一个输出,那么执行retime后,就需要在B的左边复制N个寄存器。
图二
所以逻辑向右拆分会引起寄存器复制,显著变多。相反,如果是把拆分A往左边一级挪,则会寄存器合并和减少。
另一个角度看,对于一个子模块,如果只在模块内部进行Adaptive retiming优化,那么从模块的输入输出上来看功能不变。也就是说,如果寄存器只是前后几拍挪动,挪动之后的这几拍总体上看逻辑是不变的。如图三。
图三
在进行逻辑等价性检查(LEC)时,由于组合逻辑有过拆分,寄存器B和C在retime之前和之后逻辑一定不等价。但从寄存器A到D这个整体来看又是等价的。因此,我们要忽略B和C,只拿A和D作为关键点(Keypoint)。从寄存器A的输出Q端直到寄存器D的D端这个整体当作一个检查单位。这个检查单位与一般的逻辑锥不同,中间包含两级寄存器打拍。对这个检查单位施加激励,需要等两个时钟周期才会在寄存器D的D端看到结果。这种带时钟周期的LEC也叫Sequencial LEC。
图四
实际LEC工具有一些内部算法来检测网表是否有过retime优化,及如何进行的retime优化。在此基础上进行Sequencial LEC检查。