一、DC综合概述

DC(Design Compile)是将行为级(RTL)的源码转换为门级网表的过程。大体上可以分为三个步骤:
综合=转化+逻辑优化+映射
综合步骤

GTECH格式

GTECH格式是DC先将不同语言的RTL网表(如Verilog,VHDL等),转化成统一的与工艺无关的门级网表形式。

转化的过程中,DC会利用其内部的DesignWare库对RTL代码进行结构级和逻辑级的优化。
比如,通过共用表达式,进行结构级优化:
结构级优化
通过展平,把组合逻辑路径减少两级,变为乘积之和的电路,进行逻辑优化
逻辑级优化

约束

下图是经典的时序路径图,设时钟周期为$T_c$,触发器FF3的建立时间为$T_{setup}$,保持时间为$T_{hold}$,触发器FF2的时钟端到Q端的延迟为$T_{clk-q}$,那么时序上应该满足:
$$
\begin{aligned}
T_c-T_{setup}&>T_{clk-q}+T_x \\
T_{clk-q}+T_x&>T_{hold}
\end{aligned}
$$
或者中间的逻辑单元延时$T_x$应该满足:
$$
T_{hold}-T_{clk-q}<T_x<T_c-T_{setup}-T_{clk-q}
$$
约束

因此,不同的时钟,不同的建立时间,会有不同的组合逻辑延迟。慢时钟下,$T_x$可以较大,可以用驱动能力较小的逻辑门,获得更小的面积;快时钟下,需要更大的逻辑门提高驱动能力,需要更大的面积。

综合时会在给定约束的情况下,满足时序,并尽量减小面积,即“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= $T_{clk-q}+T_x$
  • Data required time = $T_c-T_{setup} $
    要满足:
    $$
    T_c-T_{setup} >T_{clk-q}+T_x
    $$
    添加约束就是要提供信息,计算上述表达式的数值,然后进行比较。
    因此约束通常包含如下部分:
  • 时钟设定:时钟周期、不确定偏斜、转换时间、内部时钟延迟等。
  • 输入延时设定:模块外的寄存器到模块输入端的时间,用来计算输入端的Data arrival time。
  • 输出延时设定:模块输出端到模块外寄存器的时间,用来计算输出端的Data required time。
  • 输入端转换时间:用来计算输入端$T_x$的延迟。
  • 输出端负载:用来计算输出端$T_x$的延迟。

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

最后附送synopsys的实验大礼包,enjoy~

链接:https://pan.baidu.com/s/1XZEVD4MzoFI2Q1mwrFfO6Q
提取码:6666

标签: DC

添加新评论