返回文章列表
脚本工具TCL自动化ICC2脚本

TCL 脚本进阶:数字后端自动化实战

2024-06-1015 min

TCL 在后端设计中的地位

TCL(Tool Command Language)是 EDA 工具的标准脚本语言。几乎所有主流 EDA 工具(ICC2、Innovus、PrimeTime)都支持 TCL 脚本。

基础回顾

# 变量定义
set chip_name "top_design"
set design_dir "./design"

# 列表操作
set cells [get_cells -hier]
foreach cell $cells {
  puts "Processing: $cell"
}

# 过程定义
proc calculate_area {width height} {
  expr {$width * $height}
}

高级技巧

批量处理

# 批量处理多个模块
proc process_modules {module_list} {
  foreach module $module_list {
    # 打开模块
    set current_db [open_db $module.db]

    # 执行流程
    run_floorplan
    run_placement
    run_cts

    # 保存结果
    save_db -force $module.final.db

    # 关闭当前模块
    close_db
  }
}

# 调用
process_modules [list module_a module_b module_c]

报告解析

# 解析时序报告
proc parse_timing_report {report_file} {
  set fp [open $report_file r]
  set data [read $fp]
  close $fp

  # 提取关键信息
  set wns 0
  set tns 0

  foreach line [split $data "\n"] {
    if {[regexp {wns\s*=\s*([-\d.]+)} $line match value]} {
      set wns $value
    }
    if {[regexp {tns\s*=\s*([-\d.]+)} $line match value]} {
      set tns $value
    }
  }

  return [list wns $wns tns $tns]
}

文件操作

# 批量创建目录结构
proc create_project_structure {project_root} {
  set dirs {
    scripts
    constraints
    reports/timing
    reports/drc
    reports/lvs
    logs
    db
  }

  foreach dir $dirs {
    file mkdir [file join $project_root $dir]
  }
}

# 批量文件处理
proc backup_files {pattern target_dir} {
  foreach file [glob $pattern] {
    set filename [file tail $file]
    file copy $file [file join $target_dir $filename]
    puts "Backed up: $filename"
  }
}

实用脚本集

自动检查流程状态

#!/usr/bin/tclsh

proc check_design_status {} {
  puts "================================"
  puts "Design Status Check"
  puts "================================"

  # 检查关键文件
  set required_files {
    ./db/design.db
    ./reports/timing/final.rpt
    ./logs/design.log
  }

  foreach file $required_files {
    if {[file exists $file]} {
      puts "✓ [file tail $file] exists"
    } else {
      puts "✗ [file tail $file] MISSING"
    }
  }

  # 检查时序结果
  if {[catch {source ./reports/timing/summary.tcl} result]} {
    puts "Warning: Could not load timing summary"
  }
}

check_design_status

最佳实践

  1. 模块化设计:将常用功能封装成过程
  2. 错误处理:使用 catch 处理可能的错误
  3. 日志记录:关键步骤输出日志
  4. 参数化:避免硬编码,使用变量传递参数

总结

掌握 TCL 脚本可以大大提高工作效率,建议从日常工作的痛点出发,逐步实现自动化。