SDC命令详解:使用read_sdc命令读取约束

相关阅读

SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm=1001.2014.3001.5482


        在很长一段时间,用户将所有的设计约束Synopsys Design Constraints(SDC)写在一个文件中,并在脚本中使用source命令执行SDC文件。read_sdc命令的诞生让设置约束拥有了专用的命令,功能也更加强大。

        本文针对Design Compiler,但该命令同样存在于PrimeTime、IC Compiler等工具中,它们大致相同,略有差别。read_sdc命令的BNF范式(有关BNF范式,可以参考以往文章)为:

read_sdc
    file_name
    [-echo]
    [-syntax_only]
    [-version sdc_version]
    //注:该命令的选项和参数顺序任意

指定文件名

        可以指定需要读取的SDC文件的名称,文件类型可以是普通ASCII及其gzip压缩版本。

指定显示命令

        -echo选项指定在执行每一条SDC命令时都显示出来。

指定仅进行语法检查

        -syntax_only选项指定仅检查SDC文件语法和语义,而不实际执行SDC命令。

指定SDC版本

        -version选项可以指定SDC版本,可以从1.0到目前最新的2.2,如果文件中出现了版本不支持的SDC命令,则会当做未知命令报错"Error: unknown command '*****' (CMD-005)"。

简单使用

        假设存在以下的SDC文件。

# con.tcl
create_clock -name clk -period 10.0 [get_ports clk]
set_input_delay 2.0 -clock clk [get_ports data_in]
set_output_delay 2.5 -clock clk [get_ports data_out]
set_driving_cell -lib_cell INVX1 -library my_lib [get_ports data_in]
set_load 0.05 [get_ports data_out]
set_clock_uncertainty 0.2 [get_clocks clk]

        则可以在脚本中直接使用read_sdc命令进行读取并执行该文件。

# dc.tcl
read_file -format verilog {test.v}
current_design test
read_sdc con.tcl
# ==================== GCD Routing 脚本 (修改版) ==================== # 设计名称与工艺平台 set DESIGN_NAME "microwatt" set ACTUAL_TOP_MODULE_NAME "microwatt" set PLATFORM "nangate45" # --- 路径配置 --- set PLATFORM_DIR "./platforms/${PLATFORM}" set RESULTS_DIR "./results/${PLATFORM}/${DESIGN_NAME}/routing" set SDC_FILE "./results/${PLATFORM}/${DESIGN_NAME}/cts/4_cts.sdc" file mkdir $RESULTS_DIR # === 技术文件配置 === set TECH_LEF "${PLATFORM_DIR}/lef/NangateOpenCellLibrary.tech.lef" set SC_LEF "${PLATFORM_DIR}/lef/NangateOpenCellLibrary.macro.mod.lef" set LIB_FILES "${PLATFORM_DIR}/lib/NangateOpenCellLibrary_typical.lib" # === 环境变量配置 === set ::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) 4 set ::env(DONT_USE_CELLS) "TAPCELL_* FILLER_*" set ::env(SCRIPTS_DIR) "./scripts" set ::env(REPORTS_DIR) "./reports" set ::env(LIB_FILES) $LIB_FILES set ::env(RESULTS_DIR) $RESULTS_DIR # === 新增拥塞优化参数 === set ::env(MIN_ROUTING_LAYER) metal2 set ::env(MAX_ROUTING_LAYER) metal10 set ::env(FILL_CELLS) "FILLCELL_X1 FILLCELL_X2 FILLCELL_X4 FILLCELL_X8 FILLCELL_X16 FILLCELL_X32" set ::global_route_congestion_report "$::env(REPORTS_DIR)/congestion.rpt" set ::env(ROUTING_LAYER_ADJUSTMENT) 0.2 ;# 降低布线层使用率(原0.4) set ::env(GLB_RT_MAX_DIODE_INS_ITERS) 10 ;# 增加二极管插入迭代次数 set ::env(GLB_RT_OVERFLOW_ITERS) 100 ;# 增加拥塞优化迭代次数 set ::env(GLB_RT_ADJUSTMENT) 0.3 ;# 增加布线资源调整因子 set ::env(GLB_RT_ALLOW_CONGESTION) 0.1 ;# 允许轻度拥塞 set ::env(GLB_RT_L1_ADJUSTMENT) 0.99 ;# 调整金属层1资源分配 # ==== 读取设计 ==== read_lef $TECH_LEF read_lef $SC_LEF read_liberty $LIB_FILES read_db "./results/${PLATFORM}/${DESIGN_NAME}/cts/4_1_cts.odb" read_sdc $SDC_FILE # 加载平台RC配置文件 source ${PLATFORM_DIR}/setRC.tcl source $::env(SCRIPTS_DIR)/util.tcl # ==== 全局布线优化 ==== puts "=== 开始增强型全局布线 ===" # 执行引脚布线访问 pin_access -bottom_routing_layer $::env(MIN_ROUTING_LAYER) \ -top_routing_layer $::env(MAX_ROUTING_LAYER) # 执行全局布线(增加拥塞优化迭代) global_route -congestion_iterations 50 \ -congestion_report_file $::global_route_congestion_report \ -verbose 2 set_placement_padding -global \ -left $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) \ -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) # 设置传播时钟 set_propagated_clock [all_clocks] estimate_parasitics -global_routing set_dont_use $::env(DONT_USE_CELLS) # 天线效应预检查 check_antennas -report_file $::env(REPORTS_DIR)/antenna_pre.rpt # Repair design using global route parasitics repair_design_helper # Running DPL to fix overlapped instances global_route -start_incremental detailed_placement global_route -end_incremental \ -congestion_report_file $::env(REPORTS_DIR)/congestion_post_repair_design.rpt # Repair timing using global route parasitics puts "Repair setup and hold violations..." estimate_parasitics -global_routing repair_timing_helper # Running DPL to fix overlapped instances global_route -start_incremental detailed_placement global_route -end_incremental \ -congestion_report_file $::env(REPORTS_DIR)/congestion_post_repair_timing.rpt # 保存全局布线结果 write_def $ RESULTS_DIR/5_1_grt.def write_db $ RESULTS_DIR/5_1_grt.odb # ==== 详细布线优化 ==== puts "=== 开始详细布线(含拥塞优化)===" # 配置高级布线参数 set detailed_route_args " -output_drc $::env(REPORTS_DIR)/route_drc.rpt -output_maze $::env(REPORTS_DIR)/maze.log -drc_report_iter_step 10 -verbose 3 -bottom_routing_layer $::env(MIN_ROUTING_LAYER) -top_routing_layer $::env(MAX_ROUTING_LAYER) -distributed -num_cpus 4 " # 迭代式布线修复(3次迭代) for {set i 0} {$ i < 3} {incr i} { detailed_route {*}$detailed_route_args repair_antennas -iterations 5 } # 保存详细布线结果 write_def $RESULTS_DIR/5_2_route.def write_db $RESULTS_DIR/5_2_route.odb # ==== 填充单元插入 ==== puts "=== 开始填充单元插入 === " filler_placement $::env(FILL_CELLS) write_def $ RESULTS_DIR/5_3_fillcell.def write_db $ RESULTS_DIR/5_3_fillcell.odb # 最终设计检查 check_antennas -report_file $::env(REPORTS_DIR)/antenna_final.rpt report_design_area -file $::env(REPORTS_DIR)/area_final.rpt puts "Routing阶段完成!优化后拥塞率降低至可接受范围" 检查脚本语句语法是否错误
07-10
# ==================== GCD Routing 脚本 ==================== # 设计名称与工艺平台 set DESIGN_NAME "gcd" set ACTUAL_TOP_MODULE_NAME "gcd" set PLATFORM "nangate45" # --- 路径配置 --- set PLATFORM_DIR "./platforms/${PLATFORM}" set RESULTS_DIR "./results/${PLATFORM}/${DESIGN_NAME}/routing" ;# 修改为placement目录 set SDC_FILE "./results/${PLATFORM}/${DESIGN_NAME}/cts/4_cts.sdc" file mkdir $RESULTS_DIR # === 技术文件配置 === set TECH_LEF "${PLATFORM_DIR}/lef/NangateOpenCellLibrary.tech.lef" set SC_LEF "${PLATFORM_DIR}/lef/NangateOpenCellLibrary.macro.mod.lef" set LIB_FILES "${PLATFORM_DIR}/lib/NangateOpenCellLibrary_typical.lib" # === 环境变量配置 === set ::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) 2 ;# 增大全局布局单元间距 set ::env(DONT_USE_CELLS) "TAPCELL_* FILLER_*" ;# 禁止使用的单元类型 set ::env(SCRIPTS_DIR) "./scripts" set ::env(REPORTS_DIR) "./reports" set ::env(LIB_FILES) $LIB_FILES set ::env(RESULTS_DIR) $RESULTS_DIR ;# 结果目录 # === 核心环境变量 === set ::env(MIN_ROUTING_LAYER) metal2 ;# 最小布线层(Metal2) set ::env(MAX_ROUTING_LAYER) metal10 ;# 最大布线层(Metal10) set ::env(FILL_CELLS) "FILLCELL_X1 FILLCELL_X2 FILLCELL_X4 FILLCELL_X8 FILLCELL_X16 FILLCELL_X32" set ::global_route_congestion_report "$::env(REPORTS_DIR)/congestion.rpt" set ::env(ROUTING_LAYER_ADJUSTMENT) 0.4 ;# 添加这个参数供fast_route函数使用 # ==== 读取设计 ==== read_lef $TECH_LEF read_lef $SC_LEF read_liberty $LIB_FILES read_db "./results/${PLATFORM}/${DESIGN_NAME}/cts/4_1_cts.odb" read_sdc $SDC_FILE # 加载平台RC配置文件(必须!) source ${PLATFORM_DIR}/setRC.tcl # 导入util.tcl source $::env(SCRIPTS_DIR)/util.tcl # ==== 全局布线 ==== puts "=== 开始全局布线 ===" fast_route # 执行引脚布线访问 pin_access -bottom_routing_layer $::env(MIN_ROUTING_LAYER) \ -top_routing_layer $::env(MAX_ROUTING_LAYER) # 执行全局布线 puts "执行全局布线..." global_route -congestion_report_file $::global_route_congestion_report set_placement_padding -global \ -left $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) \ -right $::env(CELL_PAD_IN_SITES_DETAIL_PLACEMENT) # 设置传播时钟 set_propagated_clock [all_clocks] estimate_parasitics -global_routing set_dont_use $::env(DONT_USE_CELLS) # Repair design using global route parasitics repair_design_helper ;# 直接调用util.tcl中repair_design_helper函数 # Running DPL to fix overlapped instances # Run to get modified net by DPL global_route -start_incremental detailed_placement # Route only the modified net by DPL global_route -end_incremental \ -congestion_report_file $::env(REPORTS_DIR)/congestion_post_repair_design.rpt # Repair timing using global route parasitics puts "Repair setup and hold violations..." estimate_parasitics -global_routing repair_timing_helper ;# 直接调用util.tcl中repair_timing_helper函数 # Running DPL to fix overlapped instances # Run to get modified net by DPL global_route -start_incremental detailed_placement # Route only the modified net by DPL global_route -end_incremental \ -congestion_report_file $::env(REPORTS_DIR)/congestion_post_repair_timing.rpt # 保存全局布线结果 # write_guides $RESULTS_DIR/route.guide write_def $RESULTS_DIR/5_1_grt.def write_db $RESULTS_DIR/5_1_grt.odb # ==== 详细布线 ==== puts "=== 开始详细布线 === " set detailed_route_args "-output_drc $::env(REPORTS_DIR)/route_drc.rpt" detailed_route {*}$detailed_route_args # # 简单检查天线效应并修复(仅一次迭代) # repair_antennas # detailed_route {*}$detailed_route_args # 保存详细布线结果 write_def $RESULTS_DIR/5_2_route.def write_db $RESULTS_DIR/5_2_route.odb # # ==== 填充单元插入 ==== puts "=== 开始填充单元插入 === " filler_placement $::env(FILL_CELLS) write_def $RESULTS_DIR/5_3_fillcell.def write_db $RESULTS_DIR/5_3_fillcell.odb puts "Routing阶段完成!" 以上代码是布线的tcl脚本,运行脚本时报错,显示布线堵塞,修改上述代码
07-10
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日晨难再

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值