电子说
一、DFF的类型介绍
寄存器默认值,也叫复位值,是当reset或者set有效时寄存器输出的值。对于一个DFF来说,如下图,当reset为0时,Q输出0;当set为0时,Q输出为1(外部使用时保证reset与set不同时为0)。
(图一)
也就是说,当需要复位值为1时,把set拉低;当需要复位值为0时,把reset拉低,如下图。一般来说寄存器的默认值不是1就是0,所以接死掉的reset和set pin就可以省掉。
(图二)
因此,stdcell库里的dff可以分成以下几种:
DFFSR,同时带set和reset pin
DFFR,只带reset pin
DFFS,只带set pin
另外,QN是Q的取反,很多时候只需要用到其中的一个,所以QN也不一定有。总结成下表:
带QN | 不带QN |
DFFSRN | DFFSR |
DFFRN | DFFR |
DFFSN | DFFS |
(表一)
二、修改默认值的方法
方法一:如果DFF同时带RN和SN,交换RN和SN的连线
这种方法最简单,premask和postmask eco都适用。但一般自动综合工具是不会同时用同时带RN和SN的DFF的,因为这样面积不是最优。所以需要在综合阶段人为强制让综合工具只用同时带RN和SN的DFF,如果面积不是瓶颈的情况下。
方法二:如果只带RN或者SN,换DFF类型(Premask ECO)
在Premask ECO时,我们完全可以像重新综合的网表一样直接换DFF类型。这种方法对于premask eco非常友好,不需要增加逻辑单元,也不会恶化时序。
方法三:如果只带RN或者SN,互换DFF(Postmask ECO)
在Postmask ECO时,我们没办法随意替换DFF类型。因为DFF的个数和类型是固定的,这时只能修改金属层。
如果修改默认值的两个dff,一个需要“0变1”,另一个需要“1变0”,且这两个dff物理位置很近,那么可以互换这两个dff的连线。如果是同一个时钟域、复位域,那么就只需要交换D、RN(SN)、Q/QN这三组pin。
这个方法除了上面提到的限制,还有如果“0变1”和“1变0”的dff个数不相等,那么就无法完全交换成功。
方法四:如果只带RN或者SN,D和Q端插inverter(Postmask ECO)
这是一种普遍适用的方法,只需要在D和Q端各插一个inverter。如果带QN,又可以省一个inverter。如下图,通过反相器可以等价变换只带RN或SN的DFF。
(图三)
(图四)
这种替换方法操作简单,易实现,不会带来连线拥挤,利于DRC收敛。因为不需要修改时钟pin,不会动到时钟树,只需要数据通路插入一个inverter,所以对时序影响也非常小。
但这个方法也会带来一个问题,就是在做LEC(逻辑等价性检查)时,需要让工具开启phase inversion的检测,不然会报很多虚假non equal。
三、使用GOF来自动修改寄存器的默认值
方法二:换DFF类型(Premask ECO)
set_top("digital_top");run_lec;fix_design();run_lec();report_eco;
GOF默认就是用换DFF类型的方法,所以自动ECO脚本比较简洁,读进library和design后,先run_lec确认待eco的点是否正确,接下来做ECO,做完后再运行一次run_lec确认是否eco成功。
方法四:D和Q端插inverter(Postmask ECO)
set_top("digital_top");set_flop_default_eco(1);run_lec;fix_design();set_top("digital_top");set_mapping_method("-phase");run_lec();report_eco;
与方法二相比,需要设置修改寄存器的方式后,再做ECO。做完ECO后需要设置phase inversion,让工具自动检测phase inversion的keypoint,以防虚假的non equal。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !