一、DC综合中需要用到的库材料

1、 target_library( .db )
目标库/单元库中囊括了各个门级单元的行为、引脚、面积以及时序信息(有的单元库还有功耗方面的参数),DC在综合时就是根据工艺库中给出的单元电路的延迟信息来计算路径的延迟的,并根据各个单元延时、面积和驱动能力的不同选择合适的单元来优化电路。

2、link_library( .db )

链接库用于设置模块或者单元电路的引用。对于所有DC可能用到的库,都需要在链接库中指定,其中也包括要用到的IP库。另外,在链接库的设置中必须囊括“ * ”,表示DC在引用实例化模块或者单元电路时第一搜索已经调进DC存储区的模块和单元电路,如果在链接库中不包含“ * ”,DC就不会利用DC存储区中已有的模块,因此,会出现无法匹配的模块或单元电路的警告。另外。设置链接库的时候要注意设置search_path,链接库默认在运行DC的目录下寻找相关引用。要找到链接库,就应该指定链接库所在目录。

3、symbol_library( .sdb )

符号库是定义单元电路显示的schemaic的库。启用design_anayzer或design_vision来查看、分析电路都需要设置符号库。符号库的后缀级是.sdb,倘若没有设置,DC会用默认的符号库取代。

4、IP库( .sldb )

在初始化DC的时候,不得设置标准的DesignWare库。standard.sldb用于实现Verilog描述
的运算符。对于扩展的DesionWare库,则需要在IP库(synthetic_library)中设置,同时需要在链接库中设置相应的库以使得在链接的时候DC许可搜索到相应运算符的实现。

二、综合流程——转译、优化、映射

1、读入设计,检查问题,确定综合目标库文件

使用 read_verilog $active_design.v读入设计,直接转换为内部数据库,不经过GTECH;也行采用analyze+elaborate组合读入设计,如:

> set PRJ_DIR. /

> set_app_var search_path [ list $PRJ_DIR/rtl $PRJ_DIR/lib ]

>set_app_var synthetic_library { mydesign.sldb }

> set_app_var target_library {scc018_ss.db }

运用最坏情况工艺角检查建立时间违规)

> set_app_var link_library { list * scc018_ss.db scc018_IO.db macro.db}

(其中 * 表示已经加载到DC内存中的库,如DesignWare组件和通过analyze加载的设计等)

> analyze -formate verilog Top.v

> elaborate Top

通过analyze主要进行语法检查、生成中间数据库文件(.syn)等操作,elaborate核心进行设计实例创建、参数重定义与工艺库映射等操作。该方式将设计映射到GTECH,继而能够映射到目标库。

(GTECH格式是DC先将不同语言的RTL网表转化成统一的与工艺无关的门级网表形式,转化的过程中,DC会利用其内部的DesignWare库对RTL代码进行结构级和逻辑级的优化)。

2、确定时钟信号及接口模块的时序约束

set_input_delay $OP_DELAY -clock clk [remove_from_collection[all_inputs] clk] 是一个集合操作,表示从所有输入端口中移除名为clk的端口,然后对剩下的输入端口设置输入延迟。

这里假设大家的设计由一个D触发器驱动,因此这里的输入延迟基本上是ck-Q的延迟;并假设设计驱动一个D触发器,输出延迟设定为触发器的建立时间以及额外的互连线延迟。实际场景中可能还会有其他逻辑的延迟。


例如SMIC0.18um工艺库中DRQHDV0模块的建立和保持时间均为1ns:

时序检查架构任务$setuphold(specify块中):


条件路径延迟声明(specify块中):

该语句表示从时钟CK的上升沿到输出Q的时序弧,并且输出Q的值取决于输入D的值。延迟被指定为(1.0,1.0),分别代表上升延迟和下降延迟,即这个D触发器的t_ck-Q延迟是1ns。


输入延迟等于从时钟上升沿到信号到达输入端口的延迟,一般为t_ck-Q delay;

Tcp >= input_delay + t_logic1 + t_su + t_uncertainty

由此可计算出logic1的最大延迟;

输出延迟等于信号离开输出端口到时钟上升沿的延迟,一般为t_setup;

Tcp >= t_ck-Q + t_logic2 + output_delay + t_uncertainty

由此可计算出logic2的最大延迟;


eg:假设t_logic2已给定,对于RH module你得确定多大的输入延迟?

>input_delay = t_ck-Q + t_logic2

3、确定综合目标,优化设计与时序

如想要最小面积,则只需set_max_area 0

DesignWare是Synopsys提供的IP库,在最初的映射阶段,Synopsys可能已经利用该库构建了某些部分(例如加法器),为了将设计重新映射到我们的工艺库(如SMIC018),并为逻辑简化创造空间,可以使用replace_synthetic -ungroup命令取消分组,使其成为扁平化设计,以便进行逻辑优化。

>check_design

>link

>compile_ultra -map_effort medium

compile语句将进行逻辑优化,将通用的GTECH网表转换并优化成选定的目标工艺库,运行启发式算法来尝试接近最优的逻辑,并指定运行启发式算法的努力程度,即开始对设计进行综合compile_ultra现代设计的普遍选择。就是是更高级的综合命令,相比compile具有更强大的逻辑优化能力,

>report_timing -delay max -nworst 30>timing_report_max_30.rpt

新建或替换原有文件;

>report_timing -delay max -nworst 30>>timing_report_max_30.rpt

在文件结尾开始写,不改变原有文件内容。


建立时间检查结束后,还应该检查保持时间违规,因此需要将设计转译到最快的工艺角:

(最快工艺,最低温度,最高电压)

> set_app_var target_library {scc018_ff.db }

> set_app_var link_library { * scc018_ff.db }

> translate

translate相比compile只进行简单的门级映射,而不进行深入优化,可以认为是compile的一个子步骤;

之后进行时序约束;

> set_fix_hold clock

该命令使DC关注并修复指定时钟域下的保持时间违例,核心手段是通过在内容路径上插入缓冲器来增加数据路径的延迟;

> compile only-design-rule -incremental

该命令表示对当前设计进行增量编译增量编译;就是,并且只修复设计规则违例。由于我们已经完毕了主编译,之后的所有编译都应该

>report_timing -delay min -nworst 30 > timing_report_min_30.rpt

检查是否有保持时间违例。


为了修复保持时间违规,综合程序很可能会插入逻辑门电路,这可能会导致建立时间违规,于是我们需检查设计在慢速版本的时序:

> set_app_var target_library {scc018_ss.db }

> set_app_var link_library {* scc018_ss.db }

> translate

>report_timing -delay max -nworst 30 > timing_report_max_30.rpt

进行最大延时分析,检查是否有建立时间违规;如果存在,则必须在慢速库进行增量编译,然后重复检查建立保持时间。若是没有障碍,则可以输出最终结果:

>report_area

> report_power

保存设计:


> write -hierarchy -output ./Top.db Top

将当前设计连同其完整的层次结构,保存到当前目录下的Top.db文件中,使用DC的专用二进制数据库格式,采用以下语句再次读入与解析:

> read_db ./Top.db

> current_design Top#指定顶层

> link#建立Top与其他子模块的实例连接关系,绑定工艺库单元到实际库模型等


> write -hierarchy -formate verilog -output ./Top.v Top

> write_sdf Top.sdf

> write_sdc Top.sdc

.v,.sdc,.sdf主要用于综合后仿真。 如在门级仿真时在tb材料中加入以下语句,将.sdf文件标注到测试记录中:

initial $sdf_annotate("Top.sdf",u_Top);


参考资料:

【精品课程】芯片设计与综合 第19课 综合优化、时序验证与网表生成_哔哩哔哩_bilibili

《ASIC设计理论与实践》

Deepseek