本节主要介绍: 设计对象 物集(collection) 列表(List) 面积约束 环境属性
DC设计对象
DC的设计对象:Design、cell、Port、pin、net及clock;
- Design: 具有某种或多种逻辑功能的电路描述;
- Cell:设计的instance;
- Port:design的输入、输出;
- Pin:design中cell的输入、输出;
- Net:ports和pins之间或pins和pins之间的信号名;
- Clock:被定义为时钟源的pin或port;
TOP.v
这里TOP.v讲解相关概念:
- 顶层模块TOP为Design;
- 设计顶层的IO:input、output为Port;
- CLK为时钟clock;
- INV1、INV10、bus1、bus0为Net;
- 子模块例化U1、U2、U3、U4为Cell;
- Cell的引脚为Pin;
schematic图
代码语言:javascript复制get_designs //获取所有design
get_clocks //获取所有clock
get_pins //获取所有pin
get_cells //获取所有cell
get_nets //获取所有net
get_ports //获取所有port
report_clock:
report_cell:
report_port:
report_net:
代码语言:javascript复制all_inputs //获取所有input
all_outputs //获取所有output
all_clocks //获取所有clock
all_registers //获取所有register
collection
dc根据设计提取出来的;
查看大小:
代码语言:javascript复制sizeof_collection $all_input_port
从集合中剔除某个端口:
代码语言:javascript复制remove_from_collection [all_inputs] [get_ports CLK]
遍历集合的所有元素:
代码语言:javascript复制foreach_in_collection cell [get_cells -hier * -filter "is_hierarchical == true"] {echo "Instance [get_object_name $cell] is hierarchical"}
list
用于存放用户自己定义的;
代码语言:javascript复制llength //返回长度;
lindex //返回索引值;
foreach //循环;
其他
找出周期小于20的时钟:
代码语言:javascript复制set fastclks [get_clocks * -filter "period < 20"]
访问环境变量:
代码语言:javascript复制1.array names env
echo $env(Verdi_HOME)
2.get_unix_variable Verdi_HOME
3.getenv Verdi_HOME
显示对象的属性:port、pin、cell、clock、net等:
代码语言:javascript复制list_attributes -application -class <object_type>
面积约束
面积约束,就是告诉DC综合的电路面积要在多少范围以内。
如果不设置面积的约束,DC将做最小限度的面积优化。
设置了面积的约束后,DC将在达到面积约束目标时退出的面积优化。
如果设置面积的约束为0, DC将为面积做优化直到再继续优化也不能有大的效果,这时,DC将中止优化。
注意,对于很大,如百万门电路的设计,如将面积的约束设置为0 , DC可能要花很长的时间为设计做面积优化,综合运行的时间很长。
面积约束:set_max_area
代码语言:javascript复制set_max_area 15000
当设计不是很大的时候,可以使用下面的命令进行面积约束,让DC做最大的面积优化约束。
代码语言:javascript复制set_max_area 0
环境属性
工作环境约束一方面是设置芯片的工作环境,一般就要告诉DC,使用恶劣的或者理想的环境模型对设计进行约束。
另一方面是为了保证电路的每一条时序路径延时计算的精确性,仅靠外部的输入延时和输出延时约束并不够,还要提供设计的环境属性。
约束内容如下:
设置环境条件(set_operating_conditions):
用于描述制程工艺、工作电压与温度(PVT,process,voltage,temperature)这些对延时的影响。
工艺库单元通常用nominal
电压和温度来描述其默认的特性,如工艺库:
set LIB_NAME ss_1v62_125c
set OPERA_CONDITION ss_1v62_125c
set_operating_conditions -max $OPERA_CONDITION -max_library $LIB_NAME
设置线负载模型(Wire Load Model)
线负载模型为DC提供估算的线网负载信息,然后DC使用这些线网负载信息,以负载的大小为函数来模拟线上的延时。
综合时,综合工具会默认根据设计面积和节点处的负载自动选择合适的连线负载模型,如果要关掉自动选择线负载模型,可以使用命令:
代码语言:javascript复制set auto_wire_load_selection false
线负载模型工艺库:
手动选择线负载模型:
代码语言:javascript复制set LIB_NAME ss_1v62_125c
set WIRE_LOAD_MODEL smic18_wl10
set_wire_load_model -name $WIRE_LOAD_MODEL -library $LIB_NAME
在top模式下,采用top层的连线负载模型,此时连线延迟最大;
通常选用top模式:
代码语言:javascript复制set_wire_load_mode top
设置电容负载(set_load、set_load load of)
准确指定输入或输出端口的外部电容负载。对于输出端,为了精确地计算输出电路的延时时间,DC需要知道输出单元所驱动的总负载;
反向器cell工艺库:
默认情况下,DC假设端口上的外部电容负载为0。
我们可以指定电容负载为某些常数,也可以通过用loacl_of选项准确指定电容负载的值为工艺库中某一单元引脚的负载:
由图可以看到B输出端口,驱动了三个反向器A,对应约束为:
代码语言:javascript复制set LIB_NAME ss_1v62_125c
set MAX_LOAO [expr [load_of $LIB_NAME/INVX1M/A]] //负载电容大小
set_load [expr $MAX_LOAO*3 ] [all_outputs]
与门cell工艺库:
上图设计的输入端口驱动的负载为10个AND2门组成输入引脚负载,模块输出端口有3个模块,对应约束为:
代码语言:javascript复制set LIB_NAME ss_1v62_125c
set MAX_LOAO [expr [load_of $LIB_NAME/AND2X1M/A]*10] //负载电容大小
set_load [expr $MAX_LOAO*3 ] [all_outputs]
设置输入端口转换时间(input transition)
在默认情况下,DC假设输入端口上的外部信号转换时间是0 ,也就是从上升沿跳变到下降沿或者下降沿跳变到上升沿的时间是0,这是不符合实际情况的。
实际的波形是斜坡状的,通过input transition 设置后就是斜上斜下;
对应约束为:
代码语言:javascript复制set CLK_NAME Clk
set CLK_PERIOD 10
set CLK_TRAN [expr $CLK_PERIOD*0.01]
set_clock_transition -max $CLK_TRAN [get_clocks $CLK_NAME]
设置驱动强度(set_drive、set_driving_cell)
为input或者inout的端口设定驱动;
set_drive以电阻值为计量,0表示最大驱动强度,通常为时钟端口;
代码语言:javascript复制set CLK_NAME Clk
set_drive 0 [get_ports $CLK_NAME]
而set_driving_cell则以模拟端口驱动的器件形式计量,说明输入端口是由一个真实的外部单元驱动。
为input或者inout的端口设定驱动,是因为,对于输入端,为了精确计算输入电路的延时时间,DC需要知道到达输入端口的转换时间:
通过设置驱动强度,告诉DC这个设计的输入端口实际上是由一个真实的外部单元驱动的,不是理想的,DC就会计算输入信号的实际转换时间,指定某一个库单元正在驱动输入端。
下面是输入端B,由反向器Y的输出引脚驱动的例子:
代码语言:javascript复制set_driving_cell -lib_cell INVX1M -pin Y [get_potrs B]
总结
本节环境约束脚本如下:
TOP2.con
上图中,LIB_NAME、WIRE_LOAD_MODEL、DRIVE_CELL 、DRIVE_PIN、OPERA_CONDITION等变量需要根据工艺更改。
综合
在之前脚本中更改及添加如下:
run2.tcl
代码语言:javascript复制dc_shell -f ../scripts/run_2.tcl | tee -i run.log
查看面积:report_area:
查看报告:report
代码语言:javascript复制report_constraint -all_violators
report_timing
report_timing -delay_type max
—END—