Design Compiler常用命令
专栏:芯想事珹 April 5, 2026, 10:31 p.m. 9 阅读
在数字IC设计流程中,Design Compiler(DC) 是核心综合工具,而Tcl脚本则是与DC交互的主要方式。掌握dc.tcl脚本编写技巧,不仅能提高综合效率,更能确保设计质量。本文整理了dc.tcl脚本中最常用的命令及使用注意事项。

在数字IC设计流程中,Design Compiler(DC) 是核心综合工具,而Tcl脚本则是与DC交互的主要方式。掌握dc.tcl脚本编写技巧,不仅能提高综合效率,更能确保设计质量。本文整理了dc.tcl脚本中最常用的命令及使用注意事项。

01 环境配置

在开始综合之前,必须先正确配置库文件和工作环境。

设置搜索路径,告诉DC去哪里找文件

set search_path "$search_path libs cons unmapped rtl"

指定目标工艺库(用于映射)

set target_library "lib.db"

链接库(包含所有需要的库文件)

set link_library "* $target_library $synthetic_library IP.db"

综合库(DesignWare组件)

set synthetic_library dw_foundation.sldb

定义工作库,存放中间文件

define_design_lib WORK -path ./work

“link_library” 中的 “*” 表示DC会首先在当前内存中搜索设计,这是推荐的做法,能加快链接速度。

02 设计读入

读入设计是综合的第一步。DC支持多种格式,包括Verilog、VHDL和已经综合过的DDC文件。

读取Verilog RTL文件(可同时读取多个)

read_file -format verilog {A.v B.v TOP.v}

如果是VHDL设计

read_vhdl design.vhd

如果已经有综合过的DDC文件

read_ddc mapped/design.ddc

设置当前顶层设计

current_design MY_TOP

链接设计(解析所有引用)

link

检查设计完整性,确保没有缺失的模块

check_design

注意:link 命令会自动解析设计中引用的所有子模块,如果找不到某个模块,会报错提示。

03 时钟约束

时钟约束是综合中最重要的部分,直接影响时序优化结果。约束设置不当,可能导致设计无法正常工作。

创建时钟:定义时钟周期和源端口

create_clock -period 10 [get_ports clk] -name clk

设置时钟不确定性(考虑jitter和skew)

set_clock_uncertainty -setup 0.2 [get_clocks *]

设置时钟延迟(从时钟源到芯片内部的延迟)

set_clock_latency -max 0.6 [get_clocks clk]

设置时钟转换时间(时钟边沿的斜率)

set_clock_transition 0.08 [get_clocks clk]

创建生成时钟(如分频时钟)

create_generated_clock [get_pins div/clk_div] -source [get_ports clk] -divide_by 64 -name clk_div

关键概念

  • setup uncertainty:影响建立时间检查,值越大越保守

  • clock latency:模拟真实时钟到达时间,分为source latency和network latency

  • clock transition:影响单元延迟计算,转换时间越大延迟越大

04 IO约束

IO约束告诉DC芯片外部环境的特性,包括输入延迟、输出延迟、驱动能力和负载。

设置输入延迟(信号在时钟沿前多久到达输入端口)

set_input_delay -max 0.6& -clock clk [all_inputs]

设置输出延迟(信号需要在时钟沿前多久稳定输出)

set_output_delay -max 0.8 -clock clk [all_outputs]

设置输入端口的驱动单元(模拟外部驱动能力)

set_driving_cell -lib_cell FD1 -pin Q [get_ports in]

设置输出端口的负载(模拟外部负载)

set_load 0.080 [all_outputs]

设置输入转换时间(输入信号的斜率)

set_input_transition 0.12 [all_inputs]

技巧:
使用 “[remove_from_collection [all_inputs] [get_ports CLK]]”可以方便地从所有输入中排除时钟端口,避免给时钟设置输入延迟。

05 综合优化

综合的核心目标是满足时序的同时最小化面积和功耗。DC提供了多种优化策略。

基础编译命令:

compile

高级编译(推荐用于复杂设计)

compile_ultra -scan -retime -timing

高耗时优化(当常规编译无法满足时序时使用)

compile_timing_high_effort

增量编译(在设计接近收敛时使用,节省时间)

compile -incremental_mapping -map_effort high

面积优化(在时序满足后进一步优化面积)

optimize_netlist_area

物理感知优化(topo模式下)

power_cg_physically_aware_cg
power_low_power_placement

优化策略建议

  1. 初始综合:使用 “compile_ultra” 获得较好的起点

  2. 时序优化:如果时序不满足,尝试 “compile_timing_high_effort”

  3. 面积优化:时序满足后使用 “optimize_netlist_area”

  4. 增量编译:仅在设计接近收敛时使用,避免过度优化

06 层次结构管理

层次结构的管理直接影响综合结果的可读性和后续流程的处理。

保留层次化结构(便于调试和分析)

set_hierarchy

对特定单元进行解组和扁平化

ungroup -flatten $icg_cells

时钟门控的全局扁平化

power_cg_flatten

控制自动解组行为(设置阈值)

set compile_auto_ungroup_delay_num_cells 99999999

综合时优先选择多路选择器

compile_prefer_mux

注意事项

  • ungroup 会移除层次边界,可能影响后续的布局布线

  • auto-ungroup 会自动合并小模块,提高效率但降低可读性

  • 建议在最终综合前评估是否需要保留层次结构

07 报告生成

综合完成后,需要生成各种报告来分析设计质量。

时序报告:检查是否满足时序要求

report_timing -delay max -max_paths 10

约束违例报告:查看哪些约束被违反

report_constraint -all_violators

面积报告:查看设计的面积占用

report_area

功耗报告:估算设计的功耗

report_power

QoR报告:综合质量概览

report_qor

设计层次报告:查看模块层次结构

report_hierarchy -noleaf

报告解读

  • WNS(Worst Negative Slack):最坏负裕量,负值表示时序违例

  • TNS(Total Negative Slack):总负裕量,反映整体时序状况

  • Violators数量:违例路径的数量,数量越多问题越严重

08 输出文件

综合完成后,需要输出各种文件供后续流程使用。

输出综合后的网表(Verilog格式)

write -f verilog -hier -out mapped/TOP.v

输出DDC文件(包含完整的设计信息)

write -f ddc -hier -out mapped/TOP.ddc

输出约束文件(SDC格式,用于后续流程)

write_sdc TOP.sdc

输出物理约束(topo模式下使用)

write_physical_constraints -output TOP_PhysConstr.tcl

输出扫描链定义(DFT相关)

write_scan_def -out TOP_scan.def

文件用途

  • *.v 网表:用于形式验证、布局布线

  • *.ddc 文件:包含完整的设计信息,可用于重新加载

  • *.sdc 约束:时序约束文件,传递给PT、ICC等工具

感谢阅读,更多文章点击这里:【专栏:芯想事珹】
公众号:【芯想事珹】

“芯想事珹”,先进制程IC设计与SoC定制技术交流分享平台。

最新20篇 开设专栏