Design Compiler (DC) 工具基本综合流程
目录
一、前期准备
1. 工艺库与 IP 准备
- 导入目标工艺库文件( .db 文件,注意这个文件应当在 TSMCHOME/digital/Front_End/timing_power_noise/NLDM/ */.db 路径下):
- 设置 target_library(目标库,用于门级映射)和 link_library(链接库,含内存设计引用)
- 补充 symbol_library(符号库,用于图形界面显示,可选选项)和 synthetic_library (DesignWare IP库)
- 配置搜索路径( search_path ):包含 HDL 代码( VHDL / Verilog / SystemVerilog 文件 )、约束文件( sdc 文件)、IP 库(标准工艺库)等路径。
2. 设计文件管理
- 组织 RTL 代码( Verilog / VHDL ),确保层次清晰,已经通过编译( Compile ),无 Error,无 Warning。
- 创建目录结构:source(RTL),script(TCL 脚本),netlist(网表文件),report(面积报告,功耗报告,QoR报告,时序报告),sdc(.ddc文件,.sdc文件,.sdf文件)。
注意:QoR 即 Quality of Design报告包含各个 path_group 的状态,Cell 的统计包括Area和DRC的信息等;.ddc 文件代替过去的 .db文件格式,除此之外还生成 .sdc / .sdf 文件。
二、设计输入与初始化
3. 读入设计文件
- 使用 analyze 和 elaborate 命令解析 RTL 设计:
analyze -formate verilog [list file1.v file2.v]
elaborate TOP_MODULE
current_design TOP_MODULE
- 或通过 read_file 直接读取门级网表( netlist.v )。
- 检查设计完整性:check_design 验证模块链接,link 确保库引用正确。
4. 设置工作环境
- 定义操作条件( set_operating_conditions ): 工艺角(主要包括温度、电压)
- 驱动与负载约束:
- set_driving_cell 指定输入端口驱动单元
- set_load 定义输出负载电容
- 线负载模型( set_wire_load_mode ):选择 top(顶层模型)或 segmented(分段模型)
三、设计约束定义
5. 设计规则约束(DRC)
设置工艺限制:set_max_transition(信号翻转时间)、set_max_fanout(扇出)、set_max_capacitance(端口电容)
6. SDC 文件基础模板
# 1. 版本声明 (必选)
set sdc_version 2.1
# 2. 单位定义 (必选)
set_units -time ns -capacitance pF -resistance kΩ -voltage V
# 3. 时钟定义 (核心约束)
create_clock -name clk -period 10 -waveform {0 5} [get_ports CLK]
set_clock_uncertainty -setup 0.3 -hold 0.2 [get_clocks clk]
set_clock_latency -source 1.5 [get_clocks clk]
# 4. 输入/输出路径约束
set_input_delay -max 2.0 -clock clk [get_ports data_in]
set_output_delay -max 1.5 -clock clk [get_ports data_out]
# 5. 驱动与负载建模
set_driving_cell -lib_cell BUFFX4 -pin Z [all_inputs]
set_load 0.05 [all_outputs]
# 6. 设计规则约束 (DRC)
set_max_transition 0.5 [current_design]
set_max_fanout 20 [all_inputs]
set_max_capacitance 0.1 [get_ports *]
# 7. 特殊路径约束
set_false_path -from [get_clocks clkA] -to [get_clocks clkB]
set_multicycle_path 3 -setup -from [get_pins FF1/CLK] -to [get_pins FF2/D]
# 8. 功耗约束 (可选)
set_max_dynamic_power 100mW
set_max_leakage_power 50mW
# 9. 模式与条件分析
set_case_analysis 1 [get_ports test_mode]
set_clock_groups -asynchronous -group {clk1 clk2}
7. TCL 语法规则详解
基础规则
- 基于 Tcl 语法: 所有命令遵循 Tcl 规则,支持变量、循环和条件语句(注意没有选择语句),但需要避免非 SDC 标准扩展
- 区分大小写: 命令参数如 -name、 -period 需严格匹配大小写
- 注释格式: 以 # 开头,单行注释
- 对象引用: 使用 get_ports、get_clocks 等命令获取设计对象,例如:
set_input_delay -clock [get_ports [data[*]}]
关键命令分类
命令类型 | 典型命令 | 作用 | 示例 |
---|---|---|---|
时钟定义 | create_clock create_ generated_clock | 定义主时钟与衍生时钟 | create_clock -period 10 [get_ ports clk] |
时序约束 | set_input_ delay set_output_ delay | 约束端口相对于时钟的时序关系 | set_input_ delay -max 2.0 [get_ports in1] |
物理规则 | set_max_ transition set_max_ fanout | 限制信号翻转率/扇出 | set_max_ transition 0.5 [current_design] |
路径例外 | set_false_ path set_multicycle_ path | 排除无效路径或放宽多周期路径约束 | set_false_ path -through [get_net rst] |
功耗约束 | set_max_ dynamic_power | 限制动态 / 静态功耗 | set_max_ leakage_power 50mW |
模式分析 | set_case_ analysis | 定义测试模式或工作条件 | set_case_ analysis 0 [get_ports scan_ en] |
变量与参数
单位设置: 使用 set_units 统一单元,避免混用不同量纲
通配符: 支持 * 和 ? 匹配对象名,如 get_ports data*
层次分隔符: 默认使用 / ,例如 [get_cell top/sub_module/reg1]
注意事项
命令顺序优先级: 后出现的约束可能覆盖前一条(如多个 set_max_transition )
单位一致性: 确保 set_units 与工艺库单位匹配(如电容单位 pF vs fF)
模式分离: 不同工作模式(如功能模式 / 测试模式)需分开约束文件
版本兼容性: 部分命令(如 set_clock_sense)仅在特定 SDC 版本中支持
四、综合优化策略
8. 选择编译策略
- 自顶向下(Top-Down): 整体优化,适用于中小型设计
- 自底向上(Bottom-Up): 分层编译,适合大型设计(需设置 dont_touch 保护子模块)
9. 执行综合优化
- 使用 compile_ultra 进行高级优化(支持时序、面积、功耗权衡):
compile_ultra -scan -no_autoungroup
- 关键选项: -scan(插入扫描链)、 -gate_clock(门控时钟优化)
五、分析与调试
10. 生成报告与验证
- 时序报告: report_timing -max_paths 10 检查关键路径
- 面积报告: report_area -hierarcy 分析模块级资源消耗
- 功耗报告: report_power 评估动态 / 静态功耗
- DRC 检查: check_design 确保无规则违例
11. 问题修复
- 时序违例: 调整约束(如放宽 set_max_delay)或优化代码结构
- 高扇出网络: 插入缓冲器(Buffer)或调整驱动强度
六、输出结果
12. 保存综合数据
- 网表输出: write -format sv -hierachy -output design.v
- 数据库文件: write -format ddc (含时序、约束等元数据)
- 约束文件: write_sdc design.sdc 供后端工具使用
- SDF文件: write_sdf design.sdf 用于时序仿真
13. 脚本与日志管理
- 保存综合脚本( .tcl )以便版本控制
- 记录 Log 文件( run.log )用于追溯流程状态
附录
1. run_dc.tcl 代码模板示例
sh date
remove_design -designs
#------------ Define ---------------#
set top_name TOP_NAME
#------------- Specify Libraries ----#
set search_path { ./path_to_your_stdcell_lib }
set link_library { * ./path_to_your_stdcell_lib/.db ./path_to_your_io_lib/.db }
set target_library { ./path_to_your_stdcell_lib/.db }
#-------------- Read Designs --------#
set design_path "./path_to_your_rtl"
set verilog_files [glob -nocomplain -type f $design_path/*.v]
foreach file $verilog_files {
read_file -format verilog $file
}
current_design $top_name
reset_design
link
uniquify
#-------------- Read SDC--------------#
set sdc_path "./path_to_your_sdc_file"
read_sdc $sdc_path/*.sdc
#------------Run Compile--------------#
compile
#---------- Generate Reports----------#
report_area > ./path_to_your_report_dir/area_report.txt
report_power > ./path_to_your_report_dir/power_report.txt
report_timing > ./path_to_your_report_dir/timing_report.txt
report_constraint -all_violators > ./path_to_your_report_dir/violators.txt
report_qor > ./path_to_your_report_dir/qor_report.txt
#----------- Save Output Files --------#
write_sdc ./path_to_your_sdc_dir/top.sdc
write_sdf ./path_to_your_sdc_dir/top.sdf
write -f verilog -hier -output ./path_to_your_netlist_dir/netlist.v
write_file -f ddc -hierarchy -output ./path_to_your_sdc_dir/top.ddc
2. run_dc.tcl 执行命令
dc_shell -f run_dc.tcl > run.log