一、DC综合概述
DC(Design Compile)是将行为级(RTL)的源码转换为门级网表的过程。大体上可以分为三个步骤:
综合=转化+逻辑优化+映射
综合步骤
GTECH格式
GTECH格式是DC先将不同语言的RTL网表(如Verilog,VHDL等),转化成统一的与工艺无关的门级网表形式。
转化的过程中,DC会利用其内部的DesignWare库对RTL代码进行结构级和逻辑级的优化。
比如,通过共用表达式,进行结构级优化:
结构级优化
通过展平,把组合逻辑路径减少两级,变为乘积之和的电路,进行逻辑优化
逻辑级优化
约束
下图是经典的时序路径图,设时钟周期为,触发器FF3的建立时间为,保持时间为,触发器FF2的时钟端到Q端的延迟为,那么时序上应该满足:
或者中间的逻辑单元延时应该满足:
因此,不同的时钟,不同的建立时间,会有不同的组合逻辑延迟。慢时钟下,可以较大,可以用驱动能力较小的逻辑门,获得更小的面积;快时钟下,需要更大的逻辑门提高驱动能力,需要更大的面积。
综合时会在给定约束的情况下,满足时序,并尽量减小面积,即“Optimization”。
Mapping
Mapping是将工艺库中的逻辑门映射到gtech网表中,工艺库文件后缀一般为.db(database),不能直接打开,需要变为.lib格式,它包含组合单元的时序信息。下图是或门的部分信息:
or2_3它包含总面积,输入管脚的电容,最重要的是延迟计算信息,如右边的图表,给定输入转换时间(input Transitopn)和扇出(Load),就能插值得到传输延迟(Cell Delay)和输出转换时间(output Transition)。当前的输出转换时间又可以作为下一级的输入转换时间,这样就可以计算出模块各个单元的延迟。
DC在满足时序的条件下,尽量选择工艺库里的小单元以减小面积,最后生成与工艺库相关的逻辑网表。逻辑网表利用IC Compiler工具,加入各个单元的版图信息,布局布线信息,就可以生成版图,送至晶圆厂流片。
二、DC流程
1、设置工艺库文件
- 搜索路径search_path:工艺库文件存放的文件夹,DC会自动在该文件下读入需要的库文件。
- 目标库 target_library:包含基本单元(standard cell),将gtech网表元件映射到具体的工艺单元。
- 链接库 link_libary:包含目标库之外的宏单元、IP核等常用模块。
- 符号库 symbol_library:定义单元的图形库,可以用design_vision查看。
- 综合库 syntehtic_library:是Synopsys公司提供的DesignWare库,包含许多运算单元和IP核,用于产生gtech网表。
2、读入RTL文件
DC支持读入Verilog、VHDL、ddc等格式文件,读入后需要定义顶层模块current_design,并link将读入设计和综合库连接起来。
3、设置约束
设置约束是最重要的一步。
DC判断时序主要看setup time是否满足,hold time需要在IC Compiler 加入版图、布局等信息后更有意义。
DC的判断时序时,会比较data arrival time 和data required time:
- Data arrival time=
- Data required time =
要满足:
添加约束就是要提供信息,计算上述表达式的数值,然后进行比较。
因此约束通常包含如下部分: - 时钟设定:时钟周期、不确定偏斜、转换时间、内部时钟延迟等。
- 输入延时设定:模块外的寄存器到模块输入端的时间,用来计算输入端的Data arrival time。
- 输出延时设定:模块输出端到模块外寄存器的时间,用来计算输出端的Data required time。
- 输入端转换时间:用来计算输入端的延迟。
- 输出端负载:用来计算输出端的延迟。
4、综合
通过compile_ultra启动DC综合,DC用内建的静态时序工具Design Time来估计路径延迟来指导优化,一般包括三个主要的步骤:
1、把设计分解成时间路径的集合
2、计算每一条路径的延迟
3、所有路径延迟都要检查时序
5、结果输出
输出主要有报告和文件两部分。
- 报告:面积、约束、功耗、时序、违例路径
- 文件:网表文件.v(用于ICC布局布线),约束文件.sdc(用于ICC布局布线),.ddc(保存DC的各种数据)
三、DC注释详解
DC的命令采用tcl语言,下面根据synopsys dc lab6的样例写一段综合的脚本。
RTL模块约束信息来自最初的设计要求:
###################################
# 一、设置工艺库文件 #
###################################
#工艺库文件.db保存在上级目录ref下的db文件夹
#my_design.v文件保存在当前目录rtl下
set search_path "$search_path ../ref/db ./rtl "
#synopsys 内置DesignWare库
set synthetic_library dw_foundation.sldb
set target_library "sc_max.db"
set link_library "* $target_library $synthetic_library"
###################################
# 二、读入RTL文件 #
###################################
read_verilog my_design.v
current_design MY_DESIGN
link
###################################
# 三、设置约束 #
###################################
# 1、时钟设定
# 移除之前的约束
reset_design
#时钟周期3ns
create_clock -period 3.0 [get_ports clk]
#系统时钟到输入端口clk时钟的延迟
set_clock_latency -source -max 0.7 [get_clocks clk]
#输入端口时钟clk到模块内部时钟的延时
set_clock_latency -max 0.3 [get_clocks clk]
#时钟的不确定偏斜时间0.15ns
set_clock_uncertainty -setup 0.15 [get_clocks clk]
#时钟的转换时间0.12ns
set_clock_transition 0.12 [get_clocks clk]
#2、输入延迟设定
#输入端口data1、data2的延迟
set_input_delay -max 0.45 -clock clk [get_ports data*]
#输入端口sel的延迟
set_input_delay -max 0.4 -clock clk [get_ports sel]
#输入端口Cin1、Cin2的延迟
set_input_delay -max 0.3 -clock clk [get_ports Cin*]
#3、输出延迟设定
#输出端口out1的延迟
set_output_delay -max 0.5 -clock clk [get_ports out1]
#输出端口out2的延迟
set_output_delay -max 2.04 -clock clk [get_ports out2]
#输出端口out3的延迟
set_output_delay -max 0.4 -clock clk [get_ports out3]
#输出端口Cout的延迟
set_output_delay -max 0.1 -clock clk [get_ports Cout]
#4、输入转换时间
#输入端口data1、data2、sel的转换时间
set_driving_cell -lib_cell bufbd1 -library cb13fs120_tsmc_max \
[remove_from_collection [all_inputs] [get_ports "clk Cin*"]]
#输入端口Cin1、Cin2的转换时间
set_input_transition 0.12 [get_ports Cin*]
#5、输出负载
#输出端口out1、out2、out3的负载
set_load [expr 2 * [load_of cb13fs120_tsmc_max/bufbd7/I]] [get_ports out*]
#输出端口Cout的负载
set_load 0.025 [get_ports Cout*]
###################################
# 四、综合 #
###################################
compile_ultra
###################################
# 五、结果输出 #
###################################
file mkdir syn_files
file mkdir reports
#报告
#功耗报告
report_power -hierarchy > reports/$DESIGN_NAME.hierarchy.power
report_power > reports/$DESIGN_NAME.power
#面积报告
report_area -hierarchy > reports/$DESIGN_NAME.area
#时序报告
report_timing > reports/$DESIGN_NAME.timing
#约束报告
report_constraint -verbose > reports/$DESIGN_NAME.constraint
#违例报告
report_constraint -all_violators > reports/$DESIGN_NAME.violation
#输出文件
write -h $DESIGN_NAME -output ./syn_files/$DESIGN_NAME.db
write_file -format ddc -hierarchy -output ./syn_files/$DESIGN_NAME.ddc
#SDF格式的延迟,用于Verilog仿真
write_sdf -context verilog -version 1.0 ./syn_files/$DESIGN_NAME.syn.sdf
#Verilog门级网表,用于ICC
write -h -f verilog $DESIGN_NAME -output ./syn_files/$DESIGN_NAME.syn.v
#SDC格式的约束, 用于ICC
write_sdc ./syn_files/$DESIGN_NAME.sdc
网友评论