SDC命令详解:使用uniquify命令进行唯一化
相关阅读
SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm=1001.2014.3001.5482
唯一化简介
在了解uniquify命令前,首先需要知道唯一化的定义:唯一化指的是在综合过程中Design Compiler会自动检测当前设计层次结构中对同一设计(或者说模块)的多次引用(例化),并为每个实例生成一个独立的设计副本。
该过程首先复制(已设置的约束也会进行复制和调整)并重命名被多次引用的设计(不包括有dont_touch属性的实例和设计),命名规则由uniquify_naming_style变量(默认为%s_%d,其中%s指的是原设计名,%d是一个确保名称唯一所需的最小整数)控制。原始设计将不再可访问,原始设计或其中对象的将从包含它们的集合中删除。复制后Design Compiler可以针对每个唯一副本基于其所在环境进行单独优化,如图1所示。
图1 唯一化的结果
uniquify命令
除了使用综合类命令(如compile和compile_ultra命令)外,用户可以使用uniquify命令显式进行唯一化(其实它并不是一个SDC命令,归为此类只是为了方便管理)。
本文针对Design Compiler,但该命令同样存在于IC Compiler等工具中,它们大致相同,略有差别。uniquify命令的BNF范式(有关BNF范式,可以参考以往文章)为:
uniquify[-base_name base_name][-force | -cell cell_list [-new_name new_design_name]| -reference design_name][-dont_skip_empty_designs]//注:该命令的选项和参数顺序任意
指定基名字
-base_name选项用于指定一个基名字,以取代uniquify_naming_style变量中%s代表的原设计名。
强制唯一化
-force选项用于指定即使实例已唯一或带有dont_touch属性,也强制重命名(顶层设计不受影响)。
-force选项、-cell选项和-reference选项是互斥的,只能使用其中一个。
指定单元列表
-cell选项指定一个列表/集合,包含层次单元对象,为其中每个层次单元进行唯一化(即使实例已唯一或带有dont_touch属性)。对于列表而言,如果有多于一个对象,需要使用引号或大括号包围(对使用集合无效),关于列表和集合的区别,可以参考下面的博客。
SDC命令详解:使用集合(Collection)而不是字符串(String)/列表(List)作为命令参数https://chenzhang.blog.csdn.net/article/details/147144571 需要注意的是,如果层次单元对象的父实例尚未唯一化,则也会进行唯一化。如果使用了-cell选项,则原始设计在复制后不会删除。
-force选项、-cell选项和-reference选项是互斥的,只能使用其中一个。
指定单元名字
只有当使用了-cell选项且只指定了一个层次单元才能使用该选项,指定一个设计名作为该单元唯一化后的名字(若该设计名已被使用,则该选项失效)。
指定设计名
-reference选项用于指定一个设计名,为当前设计中引用此设计的实例进行唯一化(即使设计已唯一或带有dont_touch属性)。
如果使用了-reference选项,则原始设计在复制后不会删除。
-force选项、-cell选项和-reference选项是互斥的,只能使用其中一个。
指定不跳过空设计
-dont_skip_empty_designs选项指定即使是黑盒设计也会进行唯一化;默认情况下黑盒设计保持不变。
简单使用
以图2所示的层次结构为例。
图2 层次结构
综合时的唯一化
首先使用list_designs命令查看内存中的所有设计。
dc_shell> list_designs
leaf_module middle_module top_module (*)
随后使用compile命令(如果使用compile_ultra命令需要添加-no_autoungroup选项防止自动解组)进行综合并再次使用list_designs命令查看内存中的所有设计,可以发现此时进行了唯一化。
dc_shell> compile
dc_shell> list_designs
leaf_module_0 leaf_module_1 middle_module_0 middle_module_1 top_module (*)
用户显式进行唯一化
首先使用list_designs命令查看内存中的所有设计。
dc_shell> list_designs
leaf_module middle_module top_module (*)
随后使用uniquify命令进行唯一化并再次使用list_designs命令查看内存中的所有设计,可以发现此时进行了唯一化。
dc_shell> uniquify
dc_shell> list_designs
leaf_module_0 leaf_module_1 middle_module_0 middle_module_1 top_module (*)