修改寄存器默认值有几种方法?

电子说

1.3w人已加入

描述

一、DFF的类型介绍

寄存器默认值,也叫复位值,是当reset或者set有效时寄存器输出的值。对于一个DFF来说,如下图,当reset为0时,Q输出0;当set为0时,Q输出为1(外部使用时保证reset与set不同时为0)。

也就是说,当需要复位值为1时,把set拉低;当需要复位值为0时,把reset拉低,如下图。一般来说寄存器的默认值不是1就是0,所以接死掉的reset和set pin就可以省掉。

reset

(图二)

因此,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。

reset

(图三)

reset

(图四)

这种替换方法操作简单,易实现,不会带来连线拥挤,利于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。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分