Design Compiler:触发器的复制(set_register_replication命令)

相关阅读

Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm=1001.2014.3001.5482


简介

其实在下面这篇关于Formality的文章中,笔者已经介绍了触发器的复制,但仅提了一句"在某些情况下,Design Compiler可能为了性能而复制触发器",本文旨在详细讨论Design Compiler对触发器复制的优化方式。

Formality:时序变换(五)(触发器复制)https://chenzhang.blog.csdn.net/article/details/145521510

复制触发器可以提高时序结果质量(QoR)、拥塞和扇出问题,要在线负载模式或拓扑模式下启用手动触发器复制,可以使用set_register_replication命令,该命令会在指定的时序单元上设置register_splitting属性和register_replication属性,从而允许对这些对象进行触发器复制;要在拓扑模式下启用自动触发器复制,可以使用compile_register_replication变量(默认值为false)。

手动触发器复制

set_register_replication命令的BNF范式(有关BNF范式,可以参考以往文章)为:

复制代码
set_register_replication
    object_list
    [-max_fanout max_fanout_value | -num_copies copy_value]
    [-include_fanin_logic cell]
    [-include_fanout_logic cell]
    [-driven_by_original_register end_points_list]
    [-replicate replicate_switch]
    //注:该命令的选项和参数顺序任意

指定触发器列表/集合

指定一个触发器列表/集合,包含触发器对象。对于列表而言,如果有多于一个对象,需要使用引号或大括号包围(对使用集合无效),关于列表和集合的区别,可以参考下面的博客。

SDC命令详解:使用集合(Collection)而不是字符串(String)/列表(List)作为命令参数https://chenzhang.blog.csdn.net/article/details/147144571

指定最大扇出数量

-max_fanout选项指定了触发器复制后,每个触发器(如果使用了-include_fanout_logic选项选项,则还包括组合逻辑单元)的最大扇出数量,是一个大于等于1的整数值。需要注意的是,这里的扇出数量与set_max_fanout命令中扇出负载的概念是不一样的,扇出负载可以是小数,而扇出数量只由引脚/输出端口数量决定。

Design Compiler会尽量均衡每个触发器的扇出数量,例如指定-max_fanout为8,而原始触发器的扇出数量为17,则复制后触发器的扇出数量为6, 6, 5。

-max_fanout选项和-num_copies选项不能同时使用。

下面以图1为例展示了该选项的基本使用方式。

图1 综合前设计

复制代码
dcnxt_shell> set_register_replication -max_fanout 3 [get_cells t_reg]

图2展示了这种情况下的综合结果。

图2 综合后设计(对应图1)

register_replication_naming_style变量(默认值为%s_rep%d)决定了新增触发器/组合逻辑单元的名字,字符串值必须包含%d(表示原始触发器/组合逻辑单元的名字),可以包含%s(表示编号)。

指定复制后数量

-num_copies选项指定了触发器复制后的数量,是一个大于等于2的整数值。需要注意的是,如果触发器复制后的数量超过了让每个触发器的扇出数量为1的限制,则以实际情况为准,例如指定-num_copies为10,但原始触发器的扇出数量为6,则触发器只会复制5次,而不是9次。

Design Compiler会尽量均衡每个触发器的扇出数量,例如指定-num_copies为3,而原始触发器的扇出数量为17,则复制后触发器的扇出数量为6, 6, 5。

-max_fanout选项和-num_copies选项不能同时使用。

下面以图1为例展示了该选项的基本使用方式。

复制代码
dcnxt_shell> set_register_replication -num_copies 2 [get_cells t_reg]

图3展示了这种情况下的综合结果。

图3 综合后设计(对应图1)

从2018版本开始,手动触发器复制得到了增强,考虑图4所示的情况。

图4 综合前设计

复制代码
dcnxt_shell> set_register_replication -num_copies 2 [get_cells "t_reg x1_reg"] 
// 如果使用两条命令分别设置两个触发器,结果是一样的,且与命令的前后顺序无关

图5展示了这种情况下的综合结果。

图5 综合后设计(对应图4)

在之前的版本中只有触发器t_reg会得到复制,因为对于原始触发器而言,x1_reg的扇出数量为1,现在的Design Compiler可以先完成触发器t_reg的复制,再完成触发器x1_reg的复制。

指定复制包含扇入逻辑

-include_fanin_logic选项用于指定触发器复制过程中,同时复制触发器以指定组合逻辑单元为起点的扇入逻辑锥。需要注意的是,只能指定一个组合逻辑单元,且该组合逻辑单元只拥有唯一一条通向触发器的路径,否则会报错。

如果使用了-include_fanin_logic选项,则触发器列表/集合中只能指定一个触发器。

下面以图6为例展示了该选项的基本使用方式。

图6 综合前设计

复制代码
dcnxt_shell> set_register_replication -num_copies 2 -include_fanin_logic [get_cells x1] [get_cells t_reg]

图7展示了这种情况下的综合结果。

图7 综合后设计(对应图6)

如果使用了-include_fanin_logic选项,扇入逻辑锥中的组合逻辑单元及新增/原始触发器会被设置size only属性,确保其不会在综合过程中被优化掉(需要注意的是,此时的size_only属性是隐式设置的,这与使用set_size_only命令显式设置不同,无法使用report_attribute命令或get_attribute命令直接查看,而只能使用report_cell命令或report_size_only命令间接查看,隐式size_only属性的优先级高于显式size_only属性),使用list_size_only_types命令可以列出叶单元被设置size_only属性的原因(显式或隐式)。

指定复制包含扇出逻辑

-include_fanout_logic选项用于指定触发器复制过程中,同时复制触发器以指定组合逻辑单元为终点的扇出逻辑锥,这是因为有些情况下,扇出瓶颈点(chokepoint)不是触发器的输出,而是其扇出逻辑锥中的某个组合逻辑单元。需要注意的是,只能指定一个组合逻辑单元,且触发器只拥有唯一一条通向该组合逻辑单元的路径,否则会报错。

下面以图8为例展示了该选项的基本使用方式。

图8 综合前设计

复制代码
dcnxt_shell> set_register_replication -num_copies 2 -include_fanout_logic [get_cells x1] [get_cells t_reg]

图9展示了这种情况下的综合结果。

图9 综合后设计(对应图8)

从2019版本开始,-include_fanout_logic选项得到了增强,触发器列表/集合中可以指定多个触发器,要求触发器都只拥有唯一一条通向该组合逻辑单元的路径,考虑图10所示的情况。

图10 综合前设计

复制代码
dcnxt_shell> set_register_replication -num_copies 2 -include_fanout_logic [get_cells x2] [get_cells "t_reg x1_reg"]

图11展示了这种情况下的综合结果。

图11 综合后设计(对应图10)

需要注意的是,使用该功能要求在触发器列表/集合中同时指定多个触发器,而不能先后指定,如下所示。

复制代码
dcnxt_shell> set_register_replication -num_copies 2 -include_fanout_logic [get_cells x2] [get_cells t_reg]
dcnxt_shell> set_register_replication -num_copies 2 -include_fanout_logic [get_cells x2] [get_cells x1_reg]

图12展示了这种情况下的综合结果。

图12 综合后设计(对应图10)

如果使用了-include_fanout_logic选项,扇出逻辑锥中的组合逻辑单元及新增/原始触发器会被设置size only属性,确保其不会在综合过程中被优化掉(需要注意的是,此时的size_only属性是隐式设置的,这与使用set_size_only命令显式设置不同,无法使用report_attribute命令或get_attribute命令直接查看,而只能使用report_cell命令或report_size_only命令间接查看,隐式size_only属性的优先级高于显式size_only属性),使用list_size_only_types命令可以列出叶单元被设置size_only属性的原因(显式或隐式)。

指定由原始触发器驱动

从2018版本开始,-driven_by_original_register选项可以指定一个路径终点列表/集合,包含触发器对象或输出端口对象,只有这些对象在寄存器复制后将由原始触发器驱动(因此原始触发器可能不满足最大扇出数量的要求),下面以图1为例展示了该选项的基本使用方式。

复制代码
dcnxt_shell> set_register_replication -max_fanout 3 -driven_by_original_register [get_ports "q1 q2 q3 q4"][get_cells t_reg] 

图13展示了这种情况下的综合结果。

图13 综合后设计(对应图1)

-driven_by_original_register选项不能与-include_fanin_logic选项或-include_fanout_logic选项一起使用。

指定是否启动触发器复制

从2022版本开始,-replicate选项指定是否开启触发器复制,默认为true,当其设置为false时,将忽略其它选项并删除触发器列表/集合中指定触发器的register_replication属性并将register_splitting属性设置为false(经过笔者测试,该选项和-include_fanin_logic选项或-include_fanout_logic选项似乎又不兼容的问题,这可能是个bug)。

自动触发器复制

拓扑模式的Design Compiler可以进行布局感知的自动触发器复制,有助于减少拥塞,两种方法可以启用该功能。

1、将compile_register_replication变量(默认值为default)设置为true后使用compile_ultra命令进行综合。

2、保持compile_register_replication变量为默认值default并使用compile_ultra -spg命令进行综合。

register_replication_naming_style变量(默认值为%s_rep%d)决定了新增触发器/组合逻辑单元的名字,字符串值必须包含%d(表示原始触发器/组合逻辑单元的名字),可以包含%s(表示编号)。

边界优化

手动触发器复制和自动触发器复制默认情况下不能跨越层次结构,因为这会导致子设计引脚增加,如果在开启边界优化的基础上将compile_register_replication_across_hierarchy变量(默认值为false)设置为true,则触发器复制可以跨越层次结构,下面给出了一个例子。

图14 综合前设计

如果使用compile_ultra -no_boundary_optimization命令进行综合(禁止边界优化),则触发器复制不会发生,如果使用compile_ultra -no_autoungroup命令进行综合(禁止自动解组)且将compile_register_replication_across_hierarchy变量设置为true,则综合结果如图15所示。

图15 综合后设计(对应图14)

不进行触发器复制的情况

1、被设置dont_touch属性的触发器不进行触发器复制。

2、重定时(Retiming)触发器不进行触发器复制。

3、扫描单元已连接的设计不进行触发器复制。

4、多比特(Multibit)触发器不进行触发器复制。

5、使用set_register_replication命令时,使用了-include_fanin_logic选项或-include_fanout_logic选项,且逻辑锥中存在被设置了dont_touch属性的组合逻辑单元,不进行触发器复制(如果是先使用set_register_replication命令,后设置dont_touch属性,则触发器复制可以进行,这可能是个bug)。

6、使用set_register_replication命令时,使用了-include_fanin_logic选项或-include_fanout_logic选项,且逻辑锥跨越了层次结构,不进行触发器复制。

7、当compile_register_replication_do_size_only变量(默认值为true)被设置为false时,如果触发器被设置显式size_only属性(通过set_size_only命令)时,不进行触发器复制。

8、当compile_enable_register_replication_without_reset_pin变量(默认值为true)被设置为false时(该变量在2024版本引入),不带复位/置位端的触发器不会被复制,因为原始触发器和新增触发器的初始状态可能会不同,可能导致仿真问题。

相关推荐
日晨难再5 天前
Design Compiler:不可读单元的移除
数字ic
日晨难再6 天前
SDC命令详解:使用write_parasitics命令进行输出
数字ic
日晨难再12 天前
Design Compiler:增强型引脚负载电容建模(LoadUR、LoadUF、LoadLR、LoadLF)
数字ic
日晨难再16 天前
SDC命令详解:使用annotate_trace命令进行调试
数字ic
日晨难再18 天前
Design Compiler:Multibit优化(增强型布局感知的Multibit Banking流程)
数字ic
日晨难再21 天前
我在CSDN的三年创作历程
数字ic
日晨难再1 个月前
Design Compiler:Multibit Banking(一)
数字ic
日晨难再1 个月前
Design Compiler:Early Data Flow
数字ic
日晨难再2 个月前
Design Compiler:SDC相关运行时间问题的报告和修复
数字ic