综合的过程是将行为描述的电路、RTL级的电路转换到门级的过程
Design Compiler可以方便的将HDL语言描述的电路转换到基于工艺库的门级网表
逻辑综合的目的:
决定电路门级结构
寻求时序和面积的平衡
寻求功耗与时序的平衡
增强电路的测试性
综合的三个阶段: 综合= 转译+优化+映射
转译: HLD--->> GTECH 这个数据库跟工艺库是独立无关的
优化: 工作频率 面积 功耗 (根据约束对代码进行优化)
映射: 最终形成该工艺库对应的门级网表
DC会将代码分为以下的处理对象
design port clock cell references pin net
设计的处理对象
时序路径(Timing Path)
起点: input_port clock
终点: 寄存器D端 output_port
建立时间: 时钟上升沿之前数据需要稳定的时间
保持事件:时钟上升沿之后数据依然要保持稳定的时间
逻辑综合实施流程
预综合过程 :
施加设计约束:
设计综合
后综合过程
Design Compiler 启动方式
dc_shell dc_shell-t (tcl模式) design_vision(tcl模式) design_analyzer
可用脚本执行 dc_shell-t -f script
command.log 记录DC执行的命令以及设置的参数
filenames.log 记录DC访问过的目录,包括库、源文件等(推出时会自动删除)
读入设计文件
dcsh模式需要带上不同参数
read -format verilog[db vhdl] file
tcl模式需要使用不同指令
read_db file.db
read_verilog file.v
analyze 分析HDL的源程序并将分析产生的中间文件存于work的目录下
elaborate 在产生的中间文件中生产Verilog的模块或者VHDL的实体
这一对指令允许设计者在设计的GTECH建立之前,首先分析语法错误和及你选哪个HDL代码转换
analyze 语法检查生成 .syn文件,分析过的设计只需elaborate重新输入节省时间
当读取完所有要综合的模块后,需要使用link命令将DC存储的模块或实体连接起来
unresolved design reference警告
重新读取,添加link_library
注意search_path指向的目录
DC在运行时需要用到的几种库文件
目标库: target_library
链接库: link_library
符号库: symbol_library
算术运算库: synthetic_library
目标库是综合后电路网表要最终映射到的库,由晶圆厂提供 .db (DC内部格式,不能用文本方式打开) ------> .lib
各个门级单元 行为 引脚 面积 时序信息 功耗方面的参数
DC根据target_library中给出的单元电路的延迟信息来计算路径的延迟。并根据各个单元延时、面积和驱动能力的不同选择合适的单元来优化电路
set target_library my_tech.db
链接库时设置模块或者单元电路的引用,对于DC可能用到的库,我们需要在link_library中指定,其中也包括要用到的IP,link_library的设置中必须包含*,表示DC首先搜索已经调进DCmemory中的模块和单元电路、。设置link_library时需要注意search_path
通常情况下 链接库对应IP 目标库更多的指的是标准单元
符号库主要定义了单元电路现实的图像
算术运算库
不需要设置DW库standard.sldb用于实现Verilog描述的运算符。
加法、乘法 默认综合为一些性能相对比较差的电路结构
让DC在综合过程中调用优化库
单位时序模型旨在为设计环境中的单元的各种实例提供精确的时序,模拟单元操作的实际情况
Timing arc的延迟取决于两个因素: 输出负载 输入信号转换时间
负载电容越大,延迟越大;在大多数情况下,延迟随着输入转换时间的增加而增加
slew指定了库的测量阈值
转换事件必须乘以0.5,已获得与转换阈值(30-70)对应的转换时间、意味着表中实际值为10-90
((70-30) /(90-10)= 0.5)
不指定默认为slew1
施加约束
面积约束 set_area 100 100 的具体单位有晶源厂提供,定义这个单位有三种可能标准:
一个二输入与非门的大小作为单位1
以晶体管数码规定单位
根据实际的面积(平方微米等)
可通过以下小技巧得到:先综合一个二输入与非门,用report_area看他的面积是多少
如果是1 则第一种标准
如果时4 则第二种
如果其他值,则第三种
路径时序约束:目标是 约束电路中所有的时序路径
输入到寄存器 寄存器到寄存器 寄存器到输出 输入到输出
定义时钟
必须要定义的值: clock source clock period
可能需要定义的值: Duty clock Offset/Skew Name
create_clock -period 10 [gets_ports Clk]
set_dont_touch _network [gets_clocks Clk]
对所有定义的时钟网络设置为dont_touch,即综合的时候不对Clk信号优化
如果不加这句。DC会根据clk的负载对他产生buffer,而在实际电路中,时钟树的综合有自己特别的方法,需要考虑实际布线的物理信息,所以在DC不需要进行处理。
定义IO相对于时钟的时序
输入延迟 set_input_delay -max 4 -clock Clk [get_ports A]
输出延迟 set_output_delay -max 5.4 -clock Clk [get_ports B]
set_max_transition
set_max_fanout 是指单元输入引脚相对负载的数码,并不表示真正的电容负载
set_max_capacitance
remove_design -designs 移除DC中原有的设计
//************************************
// 屏蔽一些warning信息
//**********************************
suppress_message VER-130
suppress_message VER-129
current_design 指定顶层模块
set_drive 0 $clk 设置时钟端口的驱动为无穷大
set_ideal_network [get_ports clk] 设置时钟端为理想网络
保证综合阶段时钟网络是理想状态
复位信号同样设置
set_max_area 0 在时序满足的条件下,尽可能减少面积
环境约束
外界的温度和温度电压也会造成延时的变化
为了准确的估计模块输出的实现:输出延时、输出所接电路的负载情况,由于DC默认输出负载为0,相当于不接负载,显然过于乐观,不能反映实际工作情况
set_load 5 [get_ports OUT1]
set_load [load_of my_lib/and2a0/A] [get_ports OUT1]
set_load [expr [load_of my_lib/inv1a0/A]*3] OUT1
为了精确计算输入电路的时序:DC需要知道input_port的transition时间
set_driving_cell 允许用户可以自行定一个实际的外部驱动cell
set_driving_cell -lib_cell and2a0 \[get_ports IN1]
设置工作条件
在综合的情况必须靠近
一般综合只要考虑两种情况,最差情况用于作基于建立时间的时序分析,最好情况用于作基于保持时间的时序分析
连线延时是通过设置连线负载模型(wire load model) 确定的,连线负载模型基于连线的扇出,估计它的电阻电容等寄生参数,也是有晶圆厂提供的
set current_design addtwo
set_wire_load_model -name 160KGATES
可以让DC自动根据综合出来的模块大小来选择复杂模型,这个选项时默认打开的
连线负载模式(不同模块)
set_wire_load_mode
围绕enclosed 顶层top 分段segmented
set_wire_load_mode enclosed
检查环境属性定义是否施加成功
check_timing 检查设计是否有路径没有加入约束
check_design 检查设计是否有悬空管脚或者输出短接的情况
write_script 将施加的约束或者属性写到一个文件中,可以检查这个文件看是否正确
编译
编译之后的结果
整个工程以ddc形式保存下来方便后续查询
write -f db -hier -output ~/EXAMPLE1.db
保存整个网表,用于后续的布局布线和后仿真
write -f verilog -hier -output ~/EXAMPLE1netlist.v
保存sdf文件,保存用到的标准单元的延迟值,在后仿真时也需要
write_sdf -version 2.1 ~/EXAMPLE1.sdf
优化策略
DC进行优化的目的是权衡timing和area约束,以满足用户对功能速度和面积的要求
优化过程是基于用户为design所加载的约束。
design rule constrain :transition fanout capacitance
optimization constant:delayed area
DC默认DRC约束有较高优先权,必须先于optimization约束满足