Synopsys 综合工具Design Compiler(DC)简介
一.约束的基本概念:
约束就是对用户的设计中可度量的电路参数(如时序、面积以及电容等)进行声明。没有约束,工具(本文为DC)就不能有效地优化电路,以满足要求。
当DC对设计进行优化时,使用了两类约束:
1) 设计规则约束(Design Rule Constraints, DRC):此类约束是工具固有的,由
工艺库(technology library)来定义。此类约束是设计功能正确的必要条件,通过库应用于所有设计上。当然,你可以将它们定义的更紧。 2) 优化约束(Optimization Constraints):它们是由用户定义的,前提是可实现的。 用户在使用DC时,可以通过命令行或编写约束文件(.scr)来定义约束。下图给出DC主要的DRC及优化约束,以及相关的DC命令(dc_shell接口命令)。
DRC:
最大转换时间(Max Transition Time):对于一条连线(net)来说,是其驱动pin
逻辑值转化的最长时间。
最大扇出(Max Fanout):对于驱动pin来讲。 最大/最小电容(Max/Min Capacitance):用来控制连线的电容值。 器件退化(Cell Degradation):某些工艺库包括器件退化表,它列举了某一器件可
驱动的最大电容,是该器件输入pin最大转换时间的函数。
优化约束:
时序约束:包括 输入/输出延迟(Input/Output Delay):同步路径 最大/最小延迟(Minimum/Maximum Delay):异步路径 最大面积(门数):
最小孔隙度(Min porosity):可布线性
二.约束报告
约束报告提供了设计规则和优化约束的信息。可采用如下命令产生相应报告: report_constraint report_port
report_clock
report_attribute
report_timing_requirements
用户可通过输出相应报告,来分析设计是否满足了约束。如下例使用report_constraint报告一个计数器的设计约束结果。可看到最后若干项不符合约束定义。
Example
dc_shell> report_constraint
**************************************** Report : constraint Design : counter Version: v1998.02 Date : Wed Jan 14 1998
**************************************** Weighted
Group (max_delay/setup) Cost Weight Cost
--------------------------------------------------------- CLK 0.001.00 0.00 default 0.001.00 0.00
--------------------------------------------------------- max_delay/setup 0.00 Total Neg Critical
Group (critical_range) Slack Endpoints Cost
----------------------------------------------------- CLK 0.00 0 0.00 default 0.00 0 0.00
----------------------------------------------------- critical_range 0.00 Constraint Cost
----------------------------------------------------- max_transition 0.00 (MET) max_fanout 0.00 (MET) max_delay/setup 0.00 (MET) critical_range 0.00 (MET) min_delay/hold 0.40 (VIOLATED) max_leakage_power 6.00 (VIOLATED)
max_dynamic_power 14.03 (VIOLATED) max_area 48.00 (VIOLATED) min_porosity 2.00 (VIOLATED)
三. 基本综合流程
一个基本的综合流程如下图所示,它包括如下步骤:
1) 开发HDL模型 2) 启动DC shell界面 3) 指定相关库 4) 读入设计 5) 定义设计环境 6) 选择编译策略 7) 设置设计约束 8) 优化
9) 分析与调试 10) 保存设计数据
11) 退出shell界面
3.1开发HDL模型
为了达到最佳综合结果,HDL文件编写应注意如下三方面:
1. 设计数据管理:为了简化数据的交换、查找,以及开发数据策划和版本控制方法,
设计者应遵循一定的规则,其中包括文件生成、维护及删除规则;文件命名规范;设计的层次化目录管理等。 2. 设计划分(partitioning):对于大的设计来说,设计划分的好坏影响综合结果。划
分得当会减少编译时间并简化约束定义。 3. 设计编码(Coding):好的HDL编码可以产生小而快的设计。 3.2启动DC shell界面
如果要进入dc_shell,可在系统提示符下键入 %dc_shell
3.3 指定相关库
DC使用了如下一些库:
a) 工艺库:半导体生产厂定义的器件信息,如器件名、器件管脚名、延迟时间以及管
脚负载等。采用link_library及target_library变量指定。 b) 符号库:定义了DA(Design Analyzer)的可视符号。采用symbol_library变量指定。 c) 宏单元库(DesignWare):提供很多内建HDL算子的实现模块。
3.4 读入设计
DC既可以读入RTL设计又可以读入门级网表。RTL设计可采用analyze和elaborate命令读入,而网表采用read_file读入。
3.5 定义设计环境
设计环境指围绕将要进行综合的设计的环境,由一套属性(attribute)和约束(constraint)来模拟。主要包括:
操作条件:温度、电压和制造过程。
线负载模型:通过估计连线长度、扇出以及面积等,预估连线延迟。 系统接口:包括驱动设计的器件以及被驱动的负载定义,如下图所示。
3.6 选择编译策略
对一个层次式设计来说,用户可选择的编译策略包括:
a) 自顶向下的编译 b) 自底向上的编译
c) 特征化编译(characterize)
3.7 设置设计约束
DC使用两类约束来优化设计: a) DRC:固有约束,包括
b) 优化约束:用户定义的约束,包括
3.8 优化
DC使用目标工艺库、DRC以及优化约束对设计进行综合,并将其变为专门面向工艺的门级实现。
可采用compile命令启动综合过程。
3.9 分析与调试
DC能生成报告帮助用户分析优化结果,并调试出现的问题。
3.10 保存设计数据
使用write命令存储设计的数据(如网表、SDF文件等)。
3.11 退出shell界面
用户可以在任何时候退出dc_shell,但是此时dc_shell并不会自动保存数据。可以采用下面任何一种方法退出
a) 输入quit b) 输入exit c) 按Ctrl+d
四. 设计实例
下面的例子给出一个约束文件,采用自顶向下的编译策略,对Adder16.v进行优化。
/* specify the libraries */ 指定库 target_library = my_lib.db symbol_library = my_lib.sdb
link_library = \"*\" + target_library /* read the design */读入设计 read -format verilog Adder16.v
/* define the design environment */定义设计环境 set_operating_conditions WCCOM set_wire_load \"10x10\" set_load 2.2 sout set_load 1.5 cout
set_driving_cell -cell FD1 all_inputs() set_drive 0 clk
/* set the optimization constraints */设置优化约束 create_clock clk -period 10
set_input_delay -max 1.35 -clock clk {ain, bin} set_input_delay -max 3.5 -clock clk cin set_output_delay -max 2.4 -clock clk cout set_max_area 0
/* map and optimize the design */映射并优化设计 uniquify
compile//执行综合并优化
/* analyze and debug the design */分析并调试设计 report_constraint -all_violators report_area
/* save the design database */保存设计数据
write -format db -hierarchy -output Adder16.db
用户可以采用如下几种方法执行命令: a) 进入dc_shell,并逐个键入命令
b) 进入dc_shell,并执行脚本文件,采用include命令(dcsh模式)或source命令(Tcl
模式)。如假设上面的脚本文件称作run.scr,则在dcsh模式下运行
dc_shell> include run.scr
c) 在UNIX命令行模式下运行脚本,如
% dc_shell -f run.scr