找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 847|回复: 1

[转帖] DC综合流程

[复制链接]

7

主题

0

回帖

74

积分

实习生

积分
74
发表于 2023-6-7 08:34:47 | 显示全部楼层 |阅读模式
本帖最后由 jiwux 于 2023-6-7 08:44 编辑

引言
逻辑综合分为三个阶段:

转译(Translation):把电路转换为EDA内部数据库,这个数据库跟工艺库是独立无关的;
优化(Optimozation):根据工作频率、面积、功耗来对电路优化,来推断出满足设计指标要求的门级网表;
映射(Mapping):将门级网表映射到晶圆厂给定的工艺库上,最终形成该工艺库对应的门级网表。
在综合的时候,首先 DC 的 HDL compiler 把 HDL 代码转化成 DC 自带的 GTECH 格式,然后 DC 的library compiler 根据标准设计约束(SDC)文件、IP-DW 库、工艺库、图形库、(使用拓扑模式时,还要加入 ICC 生成的 DEF 模式,加载物理布局信息)进行时序优化、数据通路优化、功耗优化(DC 的 power compiler 进行)、测试的综合优化(DC 的 DFT compiler),最后得到优化后的网表。

关键词:DC综合 综合约束 时序报告

概述

使用DC逻辑综合的流程大致可以分为以下几个部分:

预综合过程(Pre-Synthesis Processes):在综合过程之前的一些为综合做准备的步骤:
DC启动;
设置各种库文件:
• link_library;
• target_library;
• symbol_library;
创建启动脚本文件;
读入设计文件;
• analyze;
• elaborate;
• read_file;
DC中的设计对象;
各种模块划分;
Verilog的编码。
施加设计约束:
设置环境约束:
• set_operating_coditions;
• set_wire_load;
• set_drive;
• set_driving_cell;
• set_load;
• set_fanout_load;
设置时序约束:
设计规则的约束:
• set_max_transition;
• set_max_fanout;
• set_max_capacitance;
优化的约束:
• create_clock;
• set_clock_skew;
• set_input_delay;
• set_output_delay;
• set_max_area;
选择编译策略:
top down;
bottom up;
设计综合;
查看报告;
存储设计数据。
读入设计文件
DC提供了两种命令来读入设计:read 命令和 analyze/elaborate 命令。Synopsys 最初引进了read 命令,随后又有了 analyze/elaborate 命令。较之 read 命令,analyze/elaborate 命令为设计输入提供了一种快速而强有力的方法,因此,推荐 RTL 设计输入使用。

DC 的 read 指令支持多种硬件描述格式,不同模式下读取不同格式文件有以下区别:

dc_shell工作模式:读取不同的文件格式只需要带上不同的参数:
  1. shell read -format verilog[db、vhdl etc.] file
复制代码

tcl工作模式:读取不同的文件格式需要使用不同的命令:
  1. shell read_db file.db read_verilog file.v read_vhdl file.vhd
复制代码

同时使用 analyze 和 elaborate 指令:

analyze:分析 HDL 的源程序并将分析产生的中间文件存于 work(或用户指定)的目录下;
  1. shell analyze -format sverilog {a.sv b.sv chip_top.sv}
复制代码

elaborate:在产生的中间文件中生成 verilog 的模块或 VHDL 的实体,缺省状态下读取的是 work 目录中的文件。
  1. shell elaborate chip_top
复制代码

analyze 和 elaborate 命令是两种不同的命令,它使得设计人员可以在建立设计通用逻辑之前先对设计进行语法错误和 RTL 转换分析。通用逻辑或 GTECH 元件是 Synopsys 通用工艺无关库的一部分,它们是布尔函数的末映射表示并且作为工艺相关库的占位符。analyze&elaborate 允许设计者在设计的 GTECH建立之前,首先分析设计的语法错误和进行 HDL 代码转换。analyze 做语法检查,产生 “.syn” 文件存储在 work 路径下的定义设计库内,可供 elaborate 使用,不必重复分析;read不行。

analyze&elaborate 之后没必要设置顶层文件,也没必要进行 link 操作(Link 设计,查看当前要综合的设计是否缺少子模块,返回值是1,说明子模块完整)。

另外只有 elaborate 可以设定顶层文件的 parameter:
  1. elaborate chip_top -parameter "DATA_WIDTH = 8,ADDR_WIDTH = 8"
复制代码

为了在详细描达设计的过程中传递所需参数,参数化设计(如 VHDL 中使用的 generic 语句)必须使用 analyze 和 elaborate 命令。read 命令用于将编译前设计或网表输入到 DC 中。


analyze/elaborate
read
输入格式
Verilog 或 VHDL
所有格式:Verilog、VHDL、EDIF、db等
推荐用法
综合使用 Verilog 或 VHDL 格式的 RTL
读网表、预编译设计等
设计库
使用 -library 选项来指定设计库,而不是调用 dc_shell 的目录
不保存分析结果
类属(在VHDL中使用)
在详细描述设计的过程中类属中的参数可以被设置
不能用来传递参数
结构(在VHDL中使用)
能指定在 VHDL 中的结构被详细描述
不能指定在 VHDL 中的结构被详细描述


设置设计约束:
设计约束包括设计规则约束和优化约束,设计规则约束(Design Rule Constraint)由工艺库决定,在设计编译过程中必须满足,用于使电路能按功能要求正常工作。设计优化约束定义了 DC 要达到的时序和面积优化目标,该约束由用户指定,DC 在不违反设计规则约束的前提下,遵循此约束综合设计。

环境约束
设置操作条件
在工作库中提供了几种工作条件的模型以供选择:

最好情况(BEST case):用于基于保持时间的时序分析;
典型情况(TYPICAL case):一般不考虑;
最坏情况(WORST case):用于基于建立时间的时序分析。
工艺库中通常指定一个默认的工作条件,可以用 report_lib libname 命令把厂商提供的所有工作条件列出来。set_operating_conditions 描述了设计的工艺’电压及温度条件,例如
  1. set_operating_conditions -max $OPERA_CONDITION -max_library $LIB_NAME
复制代码


驱动强度
set_ drive 和 set_ driving_cell 用于模块的输入端口。set_drive 命令用于指定输入端口的驱动强度,它主要用于模块建模或芯片端口外驱动电阻。0值表示最高驱动强度且通常用于时钟端口。相反的,
set_driving_cell 用于对输入端口驱动单元的驱动电阻进行建模,这一命令将驱动单元的名称作为其参数并将驱动单元的所有设计规则约束应用于模块的输入端口。

  1. set drive <value> <object list>
  2. set_driving_cell -cell <cell name> -pin <pin name> <object list>
复制代码

  1. dc_shell -t > set_drive 0 {CLK RST}
  2. dc_shell -t > set_driving_cell -cell BUFF1 -pin Z [all_ inputs]
复制代码


线载模型
在DC综合的过程中,连线延时是通过设置连线负载模型(Wire Load Model)确定的。连线负载模型基于连线的扇出,估计它的电阻电容等寄生参数,它也是由晶圆厂提供的。晶圆厂根据这个工艺流片的芯片的连线延时进行统计,从而得到这个值。

如果要查看工艺库中的 WLM,可以使用命令 report_lib $lib_name,进行综合时,综合工具会默认根据设计面积和节点处的负载自动选择合适的连线负载模型,如果要关掉自动选择 WLM,那么可以使用命令:
  1. set auto_wire_load_selection false
复制代码


然后手动选择线负载模型的命令是:
  1. set_wire_load_model -name $WIRE_LOAD_MODEL -library $LIB_NAME
复制代码

如果连线穿越层次边界,连接两个不同的模块,那么有三种方式对这种跨模块线连接的类型进行建模,set_wire_load_mode 命令用于设置连线负载模型的模式。有三种模式供选择:top、segment 和 enclosed。

围绕(enclosed):连接两个模块的连线的负载模型用围绕它们的模块的负载模型代替,即用SUB的负载模型。因SUB模块比较TOP设计小,所以连线的延迟比较短(不悲观,就是连线延时小);
顶层(top):用顶层模块的负载模型代替,这时,top为顶层设计,电路的规模比SUB模块大,连线负载模型最悲观;
分段(segment):位于两个小模块中的部分采用这两个小模块对应的连线负载模型, 中间部分采用子模块的连线负载模型。
load
为了更准确的计算模块输出的时序,除了要知道输出延时之外,还需要知道输出所接电路的负载情况。如果输出负载过大会加大电路的 transition time,影响时序特性。如果DC默认输出负载为0,即相当于不接负载的情况,这样综合出来的电路时序显然过于乐观,不能反映实际工作情况。

使用 set_load 将工艺库中定义的单位(通常为皮法,pf)上的容性负载设置到设计的指定连线或端口。它主要在布图前综合过程中设置模块输出端口的容性负载和往连线上反标注布图后提取的电容信息。例如:
  1. set_load [load_of my_lib/and2a0/A] [get_ports OUT1]
  2. set_load [expr [load_of my_lib/inv1a0/A]*3] OUT1
复制代码


判断环境约束是否施加成功
在定义完环境属性之后,我们可以使用下面的命令检查约束是否施加成功:
check_timing:检查设计是否有路径没有加入约束;
check_design:检查设计中是否有悬空脚或输出短接的情况;
write_script:将施加的约束和属性写出到一个文件夹中,可以检查这个文件看看是否正确。

时序约束
设计规则约束(DRC约束)
常用的DRC约束有以下三种:

set_max_transition:约束 design 中的信号、端口、net 最大 transition 不能超过这个值,值越小越苛刻;
set_max_fanout:对 design、net、output port 进行操作,设定的不是具体的电容值。扇出负载值是用来表示单元输入引脚相对负载的数目,它并不表示真正的电容负载,而是个无量纲的数字;
set_max_capacitance:基于工艺库的信息设定最大电容。
当综合和优化了,计算发现输入端口实际的转换时间比约束的大,或者负载比约束的大(模块输入端口驱动的负载大于10个“AND2”门的输入引脚的负载),或者检测到输出端口的扇出数比约束的要多(模块输出端口最多允许连接3模块,如果某个输出端需要连接多于3个模块),这时候就违背了设计规则,DC就会报错了。

半导体厂商在工艺库强加了设计规则。这些规则根据电容、转换时间和扇出(capacitance,transition 和fanout)来约束有多少个单元可以相互联结。设计规则一般由半导体厂商提供,在使用工艺库中的逻辑单元时对其联结所强加的限制。例如,如果设计中一个逻辑单元的负载(其驱动的负载)大于库中给定的其最大负载电容(max_capacitance)值,半导体厂商将不能保证该电路能正常工作。我们只可以按照设计规则的约束或按照更严格的设计规则约束来设计电路,而不可以放松约束。DC 在综合时使用加入缓冲器(buffering)和改变门单元的驱动能力(cell sizing)技术来满足设计规则的目标。

第一条和第三条在数字IC设计中必须约束,否则无法流片。

设计约束
面积约束
定义面积:
  1. dc_shell-t> current_design PRGRM_CNT_TOP
  2. dc_shell-t> set_max_area 100
复制代码

上例中的100有三种定义:

两输入与非门个数;
晶体管个数;
平方微米。
我们往往看到一个芯片是多少多少门,这多少门的数字就是拿芯片的总面积,除以2输入与非门的面积得到的数值。用 report_lib 命令不可显示面积的单位,需要询问半导体厂商面积的单位是什么。

如果不设置面积的约束,DC 将做最小限度的面积优化。设置了面积的约束后,DC 将在达到面积约束目标时退出的面积优化。如果设置面积的约束为 “0" , DC 将为面积做优化直到再继续优化也不能有大的效果。这时,DC将中止优化。注意,对于很大(如百万门电路)的设计,如将面积的约束设置为 “0" , DC可能要花很长的时间为设计做面积优化,综合时,运行的时间很长。

在超深亚微米(deep sub-micro)工艺中,一般说来,面积并不是设计的主要目标,对设计的成本影响不大。因此在初次优化时,可以不设置面积的约束。优化后,检查得到的设计面积,然后将其乘上一个百分数(例如85%),将其结果作为设计的面积约束。再为设计做增量编辑,运行 compile -inc 命令,为面积做较快的优化。这样做,既可以优化面积,又可以缩短运行时间。

时序约束
时序路径(Timing Path)可分为以下四类:

输入到寄存器的路径;
寄存器到寄存器之间的路径;
寄存器到输出的路径;
输入直接到输出全组合逻辑的路径。

时序路径(Timing Path)的起点和终点:
起点:
Input Port;
Clock pin or Flip-Flop or register;
终点:
Output Port;
除了时钟 pin 以外的 input pin。

用户必须定义的值:
clock source;
clock period;
用户可能定义的值:
duty cycle;
offset/skew;
clock name;

create_clock 命令用于定义有特定周期和波形的时钟对象。-period 选项定义时钟周期,而 -waveform 选项控制时钟的占空比和起始边沿。这个命令用于引脚或端口对象类型。

set_input_delay 指定相对于时钟的信号输入到达时间。它用于输入端口,指定在时钟沿后数据稳定所需的时间。
  1. set_input_delay -max 4 -clock CLK [get_ports A]
复制代码


set_ output_ delay 命令用于在输出端口定义在时钟边沿到来之前数据有效所需时间。

set_clock_uncertainty:对时钟的偏移和抖动进行建模,也就是对时钟的偏差进行建模,在默认的情况下,“set-clock_uncertainty” 命令如果不加开关选项 “-setup” 或 “-hold” ,那么该命令给时钟赋予相同的建立和保持偏差值。除此之外,还可以对时钟的上升沿(-rise)和下降沿(-fall)进行偏差建模。

set_ clock_ transition命令模拟时钟的转换(transition)时间。默认的上升转换时间为从电压的20%上升至80%的时间,下降的转换时间为从电压的80%下降至20%的时间。如果 set_clock_transition 命令中不加开关选项 “-setup” 或 “-hold" ,那么该命令给时钟赋予相同的上升和下降转换时间。一般情况下,我们只约束最大的转换时间,如最大转换时间是0.2ns,那么就加上-max选项:
  1. set_clock_transition -max 0.2 [get_clocks CLK]
复制代码


时钟从时钟源(比如说晶振)出发到达触发器时钟端口的延时,称为时钟的延时,包含时钟源延迟(source latency)和时钟网络的延迟(network latency)。使用 set_clock_latency 进行时钟延时的建模。一般情况下,时钟源延迟(source latency)和时钟网络的延迟(network latency)是分开的,因为时钟源延时需要建模,是因为DC是真的不知道这延时是多大,但是对于时钟网络的延迟,DC在布局布线前不知道,但是在布局布线后就可以计算出来时钟网络的延时了,因此在布局布线之后进行综合时,就没有必要对时钟网络进行延时,因此就要把这两个延时分开来进行约束。
  1. set_clock_latency -source 3 [get_clocks CLK]
  2. set_clock_latency 1 [get_clocks CLK]
复制代码

通常情况下,我们约束最大的延时,也就是加上 -max 的选项,表示最大延时是多少(如set_clock_latency -source -max 3 [get_clocks CLK] 就是时钟源到芯片时钟端口最大的时间是3ns)。
布局布线之后:就可以计算实际的线网延时,就要使用 set_propagated_clock [ get_clocks CLK] 这个命令代替上面的 set_clock_latency 1 [get_clocks CLK] 这个命令。

综合结果输出
综合后的结果包括:
整个工程以ddc格式保存下来以供后续查看和修改;
.v文件:网表netlist,用于布局布线和仿真;
.sdf文件,标注了用到的标准单元的延迟值,后仿真也需要用到;
.sdc文件:标准延时约束文件,里面都是一些约束,用来给后端的布局布线提供参考。
.def文件:DFT、形式验证可能用到,里面包含的是一些扫描链的布局信息,需要注意的是,必须在生成ddc网表文件之前生成.def(也就先生.def文件),以便将def文件包含在ddc文件中。
面积报告,包含时序电路、组合电路和总电路面积;
约束报告,给出了综合过程中哪些,没有满足要求;
时序报告,包含建立时间和保持时间。

相关文件的生成
进行网表处理和生成文件的综合命令如下所示:




时序检查与报告的生成
  1. # Get report file

  2.     redirect   -tee   -file   ${REPORT_PATH}/check_design.txt      {check_design                    };

  3.     redirect   -tee   -file   ${REPORT_PATH}/check_timing.txt      {check_timing                    };

  4.     redirect   -tee   -file   ${REPORT_PATH}/report_constraint.txt {report_constraint -all_violators};

  5.     redirect   -tee   -file   ${REPORT_PATH}/check_setup.txt       {report_timing -delay_type  max  };

  6.     redirect   -tee   -file   ${REPORT_PATH}/check_hold.txt        {report_timing -delay_type  min  };

  7.     redirect   -tee   -file   ${REPORT_PATH}/report_area.txt       {report_area                     };
复制代码


这里使用的重定位的命令 redirect,意思是将后面{}中命令的执行结果保存到文件中(命令的具体用法可以通过man redirect进行查看)。

时序报告的查看
DC 中,常用 report_timing 命令来报告设计的时序是否满足目标。
时间报告有四个主要部分:

第一部分:路径信息部分

主要报告了工作条件,使用的工艺库,时序路径的起点和终点,路径所属的时钟组,报告的信息是作建立或保持的检查,以及所用的线负载模型。

第二部分:路径延迟部分
这个路径延迟部分是DC计算得到的实际延迟信息;命令执行后,对于下图中的路径,得到的一些路径信息,有了单元名称(point),通过该单元的延时(Incr),经过这个单元后路径的总延时等信息:

上图的解释:
路径的起点是上一级D触发器的的时钟端。
input external delay:由于上一级D触发器的翻转(路径的起点也就这里)、芯片外部组合逻辑而经历的输入延时约束(set_input_delay),也就是数据到达芯片的数据输入管脚的延时建模,这个延时是1ns;”r” 表示上升延时,”f” 表示下降延时
clock network delay(idle):时钟信号从芯片的端口到内部第一个寄存器的延时是0.5ns;
Data1(in):芯片输入端口到芯片内部真正数据输入端之间的线延时,是0.04ns。(可以认为是管脚的延时)
U2/y : 这里,前面0.12表示u2这个器件的翻转/传输延时,意思是从这个器件的数据输入端(包括连线),到输出端y的延时是0.12ns。后面的1.66的意思是从路径起点到u2的y输出的延时是1.66ns.
  …
最后u4/D:这里就是终点了,D触发器的数据输入端;当然终点也可能是芯片的输出端口。

报告中,小数点后默认的位数是二,如果要增加有效数(字),在用report_timing 命令时,加上命令选项 “-significant_digits" 。报告中,Inc是连线延迟和其后面的单元延迟相加的结果。如要分别报告连线延迟和单元延迟,在使用 report_timing 命令时,加上命令选项 “-input_pins” 。

第三部分:路径要求部分

这个路径要求部分是约束所要求的部分;值 -0. 06 从库中查出,其绝对值是寄存器的建立时间。值2.17为时间周期加上延时减去时钟偏斜值再减寄存器的建立时间(假设本例中的时钟周期是2 ns)。

第四部分:时间总结部分

DC得到实际数据到达的时间和我们要求的时间后,进行比较。数据要求2.17ns前到达(也就是数据延时要求不得大于2.17ns),DC经过计算得到实际到达时间是2.15ns,因此时序满足要求,也就是meet,而不是时序违规(violation)。时间冗余(Timing margin),又称 slack,如果为正数或 ‘0’,表示满足时间目标。如果为负数,表示没有满足时间目标。这时,设计违反了约束(constraint violation)。

设计违规检查

当然有时候并不是真正的设计违规,有可能是约束设计过紧,有可能是设计的输入延时太紧导致 violation。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
EDA1024论坛免责声明
请勿上传侵权资料及软件! 如果发现资料侵权请及时联系,联系邮件: fenxin@fenchip.com QQ: 2322712906. 我们将在最短时间内删除。

36

主题

463

回帖

480

积分

技术员

积分
480
发表于 2023-12-28 14:08:19 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EDA1024技术论坛

GMT+8, 2024-5-3 05:28 , Processed in 0.044955 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表