DC的四种工作模式:
工具模式:wire load mode和 topographical mode
非工具模式:Multimode和UPF模式(Unified Power Format)
非工具模式只能用在topographical mode下,wire load mode是默认模式,启动dc时必须选择工具模式的一种。Multimode允许在多个操作条件和多种模式下操作工具(比如:测试模式和备用模式)。UPF模式允许指定先进的低功耗方法。
不同模式下的编译命令
Wire load mode下的编译命令为:compile和compile_ultra。compile命令运行DC Expert,DC Expert综合你的HDL描述到优化的、技术相关的门级设计中。它支持广泛的平面和分层设计风格,可以优化面积,时序和功耗的组合和时序设计。compile_ultra运行DC Ultra(无topo模式的特点),DC Ultra提供了同步优化时间,区域,功率,并测试高性能设计。它还提供了高级的延迟算术优化,高级的定时分析,自动漏电能力优化和寄存器重定时。
Topographical mode:使用物理约束时必须在该模式下。在综合时精确预测布线后的时序、面积、功耗,时序的估算无需基于线载模型。综合命令:compile_ultra和compile_ultra -spg
一些杂乱的知识点
在dc_shell下也可以使用unix命令诸如: pwd、 cd 、ls、history、alias等。
重复最后一条命令dc_shell> !!
执行第七条命令dc_shell> !7
执行最后一条report命令dc_shell> !rep
执行任何shell命令dc_shell> sh < UNIX_command >
得到unix变量值dc_shell> get_unix_variable
set_app_var与set的区别是前者检查语法错误,然后设置一个自定义变量,后者不检查语法错误,直接定义一个变量;
set_app_var link_library “* $target_libs”通过link_library解决引用问题:先在DC内存中匹配design name,再在变量中匹配library cell name。
set_app_var search_path “./mapped ./rtl ./libs”会从左往右依次寻找;
行注释用 “#” ,行间注释用“ ;# ”;
可以在没有原先设计文件下,迁移旧库综合的netlist到新库的netlist
读文件read_verilog / read_vhdl / read_sverilog:多条命令分别读多个文件(module分在各个文件),最后一个读到的model是当前设计;一次性读多个文件(module分在各个文件),第一个module是当前设计,一次读一个文件(多个module在一个文件),第一个module是当前设计。
好的习惯是link之前指定current_design,在link之后check_design,可以使用link和check_design的返回值来让脚本继续执行还是终止;
check_design -html chech_design.html & sh firefox check_design.html
elaborate是在读源文件时唯一修改module参数的方式:
analyze 分析HDL源程序并将一些中间文件保存在WORK
elaborate $my_top -parameters “A_WIDTH=8,B_WIDTH=16”
将产生的中间文件生成verilog模块或VHDL的实体(缺省情况下elaborate读取WORK下的文件)在解决模块调用IP时,将IP/Macro-cell library 加入link_library即可。target_library一般只包含一个库文件。
ddc文件通过write -format ddc -output file_name.ddc生成,ddc文件可以通过read_ddc {decode.ddc encode.ddc}读取,对大小写敏感,在写ddc时,可以指定-hier来保存整个设计的hierarchy,没有该项,只写出部分(如果没有指定输出对应设计的ddc文件,那么默认输出当前设计的ddc)
ddc文件是translate 的到的:rtl -> unmapped ddc。在compile之前保存ddc文件,以备下次使用,而不需要重新translate,当然rtl修改后需要重新translate。注意:在约束前产生的ddc和约束后产生的ddc不一样
在compile后,根据需要也可以输出map之后的ddc文件,该文件包含netlist、constraints和attributes,该ddc文件可以高效的被dc重新读取或者被icc读取。
link查找顺序:DC memory ->link_library -> CWD ->默认的search_path ->额外的search_path
“layout“ vs “abstract”:后者只包含P&R所需要的的最小数据
Technology File(.tf文件):描述金属和via层的参数
check_library:逻辑库和物理库的一致性检查
check_tlu_plus_file:检查TLUPlus和.tf的一致性
get_*命令返回current_design,DC memory,libraries中的对象,对象可以使用通配符,返回一个集合,或者返回空集合
all_*命令:all_inputs、all_outputs、all_clocks、all_registers、all_ideal_nets、all_fanin、all_fanout、all_connected、all_dont_touch、all_high_fanout返回对应集合。
add_to_collection # Add object(s) to a collection. Result is new collection
append_to_collection # Add object(s) to a collection. Modifies variable
compare_collections # Return 0 if two collections contain the same objects
copy_collection # Make a copy of a collection. Result is new collection
filter_collection # Filter a collection, resulting in new collection
foreach_in_collection # Iterate over a collection
index_collection # Extract object from collection. Result is new collection
remove_from_collection # Remove object(s) from a collection. Result is new collection
sizeof_collection # Get the number of objects in collection
sort_collection # Create a sorted copy of the collection
=~ Matches pattern
!~ Does not match pattern
list和collection是两个感念:
list可以理解为字符串,用foreach来遍历,echo、llength
collection可以理解为指针,用foreach_in_collection 来遍历,sizeof_collection、query_objects
检查DC脚本命令:dcprocheck example.tcl
启动dc_shell后运行脚本:dc_shell> source example.tcl
在dc_shell>下查手册或者信息:man+command或者info+command
target_library:synthesis的map阶段需要的实际工艺库
link_library:链接库,用于连接模块,“*”表示内存中所有的库
link:读取完所要综合的模块之后,将读到的DCmemory中的模块连接起来(出现unresolved design reference的警告,需要重新读取模块)
logic optimization和mapping 均在compile时完成,可以使用特殊的优化方法:structural和flatten
set_dont_touch:在当前设计和库单元上设置单元格、网格、引用和设计的dont_touch属性,以防止在优化期间修改和替换这些对象
all_fanout:返回指定源扇出中的一组引脚、端口或者单元
set_wire_load_mode:连线负载模式,模块之间的。有三种情况:enclosed、top和segmented。设置线载模型用于计算电容
set_wire_load_model:模块内部连线模型
compile_seqmap_propagate_constants:默认值为true。控制编译命令是否尝试识别和删除常量寄存器,并且在整个过程中传播常量值。
hdlin_preserve_sequential:在设计中控制复杂的和读取的命令是否保留了卸载的顺序单元
sh_continue_on_error:允许脚本出错时继续执行命令
sh_source_emits_line_number:指示发出信息的错误消息严重级别,列出该消息发生时的脚本名和行号:E代表只报error;W代表报error和warning
set_load:指定端口或者网络上设置的load属性
load_of:返回指定端口cell的pin电容
set_fix_multiple_port_nets:在当前的设计或设计列表设置固定多路网属性到指定的值
report_timing -slack_lesser_than 1 报告小于1ns的时序路径
max_path 指定每个路径组报告的路径数
nworst 指定每个端点报告的最大路径数,默认为1,只会报告给定端点结束的最坏路径。
-delay max min 报告路径组中的建立时间和保持时间的关键路径,max为建立时间uniquify :为设计中的每一个模块产生一个名字唯一的拷贝,可根据每个模块本身特有的环境做优化和映射。
用group创建层次,ungroup解除层次关系:
dc_shell>group -design_name NEW_DES -cell_name u23 {u2 u3}
dc_shell>current_design NEW_DES
dc_shell>ungroup {u2 u3}设置面积约束:set_max_area 100 单位面积在不同的工艺库下所指的的一样:以二输入与非门的面积为单位面积、以单个管子所占面积为单位面积、以实际面积1um2为单位面积。在不知道的情况下可以综合一个二输入与非门来看数值,来确定具体所指。
定义时钟:create_clock -period 10 [get_ports clk]
set_dont_touch_network [get_clocks clk]设置输入输出约束:set_input_delay -max 4 -clock clk [get_ports A]
set_output_delay -max 4 -clock clk [get_ports B]检查约束:report_port -verbose 报告当前设计中定义的I/O端口属性和施加的约束
report_clock:报告当前设计中定义的时钟及其属性情况
reset_design:删除当前设计中所有的属性值和约束(该句命令一般位于脚本第一句)。移除设计remove_design -design
list_libs:列出内存中所有可用的库
check_timing:检查是否有路径没有加入约束
check_design:检查设计中是否具有悬空的管脚或者输出短接的情况
write_script:将施加的约束和属性写出到一个文件内
列出命令的开关选项:help -v set_input_delay
集合中删除元素:set all_except_clk [remove_from_collection \
[all_inputs] [get_ports clk] ]引入时钟偏差:set_clock_uncertainty 0.5 [get_clocks clk]
时钟源延时:set_clock_latency -source
网络时钟延时:set_clock_latency
布局后综合:set_propagated_clock
同步多时钟:虚拟时钟 creat_clock -period 20 -name CLKA 红色部分必须指定,没有端口或者管脚
过滤器:
filter_collection [get_cells *] “ref_name == AN2”
filter_collection [get_cells *] “is_mapped == true”get_cells -filter “@dont_touch == true”
中断编译:ctrl+D
file操作:
- rootname:返回“.”之前的字符串,无点则直接返回整个字符串
- extension:返回最后一个“.”之后(包括点)的字符串,没有点,那么返回空字串
- isdirectory: 文件是目录则返回1,否则返回0
- isfile:是文件本身,返回1,否则返回0
为了保证结构的完整性,需要添加工作路劲:define_design_lib WORK -path ./work