返回文章列表
veriflowTCL脚本EDA自动化

数字后端 TCL 脚本编程

2024-06-1510 min

概述

TCL(Tool Command Language)是 EDA 工具的标准脚本语言,广泛用于 ICC2、PrimeTime、Design Compiler 等 Synopsys 工具的流程控制和自动化。

TCL 基础语法

变量与替换

# 变量定义
set design_name "top_module"
set output_dir  "/path/to/output"

# 命令替换
set netlist [read_file $input_file]

# 数学替换
set width  [expr {$width + 10}]

控制结构

# 条件判断
if {$setup_slack < 0} {
    puts "Setup violation detected"
} elseif {$hold_slack < 0} {
    puts "Hold violation detected"
} else {
    puts "Timing clean"
}

# 循环
foreach cell $cell_list {
    puts "Processing $cell"
}

# While 循环
set i 0
while {$i < 10} {
    incr i
}

过程定义

proc report_timing_summary {design} {
    current_design $design
    set setup_slack [get_timing_path -setup -max_paths 1 -slack_only]
    set hold_slack  [get_timing_path -hold  -max_paths 1 -slack_only]

    puts "Design: $design"
    puts "  Setup Slack: $setup_slack"
    puts "  Hold Slack:  $hold_slack"

    return [list $setup_slack $hold_slack]
}

常用 EDA 命令

Design Compiler

# 读取设计
read_verilog $design.v

# 链接库
current_design $design
link

# 约束设置
create_clock -name clk -period 10 [get_ports clk]
set_input_delay 1.0 -clock clk [all_inputs]
set_output_delay 1.0 -clock clk [all_outputs]

# 编译
compile_ultra

# 输出报告
report_timing -max_paths 10
report_constraint -all

ICC2

# 初始化
init_design

# 布局
place_design

# 时钟树综合
create_clock_tree
clock_opt

# 布线
route_design

# 输出
write -format verilog -output $output/${design}.v
write_gds -output $output/${design}.gds

PrimeTime

# 静态时序分析
source setup.tcl
link

set_analysis_type -setup -hold

report_timing -max_paths 20
report_constraint -all_violators
report_clock

# 功耗分析
report_power

实用脚本模板

批量处理模块

proc process_blocks {block_list} {
    foreach block $block_list {
        puts "Processing $block..."

        # 读取设计
        read_verilog ./designs/$block.v

        # 设置约束
        create_clock -name clk -period 5 [get_ports clk]

        # 优化
        compile_ultra

        # 输出
        write -format verilog ./output/${block}.v

        # 重置
        reset_design
    }
}

# 调用
set blocks [list block_a block_b block_c]
process_blocks $blocks

时序报告生成

proc generate_timing_reports {design} {
    current_design $design

    # Setup 报告
    report_timing -setup -max_paths 50 \
        -file ./reports/${design}_setup.rpt

    # Hold 报告
    report_timing -hold -max_paths 50 \
        -file ./reports/${design}_hold.rpt

    # 违例报告
    report_constraint -all_violators \
        -file ./reports/${design}_violations.rpt
}

日志处理

proc log_analysis {log_file} {
    set fp [open $log_file r]
    set content [read $fp]
    close $fp

    # 提取关键信息
    if {[regexp {Setup slack:\s+([-\d.]+)} $content match setup]} {
        puts "Setup Slack: $setup"
    }

    if {[regexp {Hold slack:\s+([-\d.]+)} $content match hold]} {
        puts "Hold Slack: $hold"
    }
}

正则表达式应用

# 提取网表中的模块实例
set netlist_content [read_file design.v]

# 查找所有 always 块
regexp -all -inline {always\s+@(.*?)\s+(.*?)\{} $netlist_content

# 提取 wire 定义
regexp -all -inline {wire\s+(\[.*?\])?\s*(\w+);} $netlist_content

文件操作

# 读取文件
set fp [open "design.v" r]
set content [read $fp]
close $fp

# 写入文件
set fp [open "output.txt" w]
puts $fp "Design: $design_name"
puts $fp "Date: [clock format [clock seconds]]"
close $fp

# 追加文件
set fp [open "log.txt" a]
puts $fp "[clock format [clock seconds]]: Process completed"
close $fp

错误处理

# 捕获错误
if {[catch {open nonexist.file r} fp]} {
    puts "Error: $fp"
} else {
    puts "File opened successfully"
    close $fp
}

# 错误恢复
proc safe_read {filename} {
    if {[catch {open $filename r} fp]} {
        puts "Cannot open file: $fp"
        return -1
    }
    set content [read $fp]
    close $fp
    return $content
}

与 Shell 交互

# 调用 Shell 命令
set files [glob -directory ./designs *.v]

# 执行系统命令
exec ls -la > file_list.txt

# 获取环境变量
set env_var $env(PATH)
set home    $env(HOME)

最佳实践

  1. 模块化设计:将常用功能封装为过程
  2. 错误处理:关键操作添加异常捕获
  3. 日志记录:保留关键步骤的日志
  4. 参数化:使用变量而非硬编码值
  5. 版本管理:脚本纳入版本控制

常用工具命令速查

| 工具 | 命令前缀 | 用途 | |------|----------|------| | DC | dc_shell | 综合 | | ICC2 | icc2_shell | 布局布线 | | PT | pt_shell | 时序分析 | | Innovus | innovus | 布局布线 | |Tempus | tempus | 时序优化 |

总结

TCL 脚本是数字后端自动化的核心,掌握 TCL 编程能大幅提升工作效率。建议在实际项目中不断积累和优化脚本库。