DC常用命令
05 Feb 2020 2365字 8分 次 Digital IC Design Synthesis Tcl打赏作者 CC BY 4.0 (除特别声明或转载文章外)
1 前言
总结以下DC常用命令。
2
检查脚本文件:
dcprocheck ../filename.tcl
查看当前设计文件:
list_designs
清除当前设计中的文件:
remove_design -hierarchy
指定设计顶层文件:
current_design design_file_name
检查设计语法:
check_design
检查时序:
check_timing
清除全部约束:
reset_design
把例化的多个模块转化成唯一的模块名字,这样优化时可以针对每个模块做优化而不影响其它模块:
uniquify
设置理想网络一般只对port和pin而言,如果想设置net:
set_ideal_network -no_propagate [get_nets CTRL]
尽最大努力做优化:
compile -map_effort high -area_effort high
优化编译:
compile_ultra
使劲优化时序编译:
compile_ultra -timing_high_effort_script
如果三个串联的寄存器之间两个寄存器之间的路径时序违例二中间和最后一个寄存器之间的路径时序宽松,使用下面的命令将这条路径中间的组合逻辑分配一部分到第二个寄存器的后面:
compile_ultra -retime
相反,不想这么优化:
set_dont_retime <cells or designs> ture
例如输出端口的寄存器不想在输出之后还有组合逻辑:
set_dont_retime [get_cells U_pipeline/P3_reg*] ture
循环优化:
compile_ultra -incremental
报告约束违例:
report_constraint -all_violators
报告最差路径:
report_timing -delay_type max
查看多(例:3)条比较差的路径(不是最差,是从每个不同的寄存器终点的路径中挑出一个最差的):
report_timing -max_paths 3
查看多(例:3)条最差的路径:
report_timing -nworst 2 -max_paths 3
报告端口约束:
report_ports -verbose
报告时钟:
report_clock
如果设计中有多个clock,DC会自动将不同clock下的DFF分组,用以下命令查看分组:
report_path_group
DC如果优化设计中的关键路径失败,则会放弃对其他路径的优化;如果将各个路径分组,假如某一组中的关键路径优化失败,DC并不会放弃优化其他组的关键路径。分组举例:
group_path -name INPUTS -from [all_inputs]
group_path -name OUTPUTS -to [all_outputs]
group_path -name COMBO -from [all_inputs] -to [all_outputs]
如果关键路径已无法优化,但仍想优化次关键的几条路径,例如优化这样一组路径:
- 最关键路径的权重为5,其次为2,一般为1;
- 最关键路径超出0.2ns而其余路径超出的时间都在0.2ns以内:
group_path -name CLK -critical 0.2 -weight 5
DC官方文件給出的weight一般為5,2,1;critical不要超出時鐘週期的10%。
检查tcl脚本语法错误:
dcprocheck ../filename.tcl
查看库名称:
list_libs
查看工艺库:
report_lib library_name
禁止DC将设计打散(compile命令默认是允许):
若要禁用子设计上的自动取消打散,在编译前执行:
set_ungroup <reference or cells> false
若要禁用顶层设计上的自动取消打散,在编译前执行:
set_app_var compile_ultra_ungroup_de false
完全禁用自动取消打散,执行:
compile_ultra -no_autoungroup
综合成带MUX的寄存器来模拟DFT时的情况,但实际并未形成寄存器链 :
compile -map_effort hign -area_effort high -scan
对流水线寄存器做优化:
set_optimize_registers ture
compile_ultra ……
多端口连线,是指综合完之后的网表有可能会出现一个net连接多个输出等状况,网表代码中就会出现“assign”这样的赋值,需要在这些直连的线当中插入buffer来避免:
set_fix_multiple_port_nets -all -buffer_constants
把“tri”变“wire”再写入网表:
compile ……
set_app_var verilogout_no_tri ture
write -f verilog -out <netlist_name>
把“\bus[N]”还原成“bus[N:0]”再写入网表:
compile ……
change_names -rules verilog -hier
write -f verilog -out <netlist_name>
多核综合(没看懂是干啥的):
# 先看看有几个核
report_host_options
# 多核综合(假如有五个核)
set_host_options -max_core 5
compile_ultra ……
告辞