2. 基于Tcl的OpenROAD命令批处理封装

任务说明

把 OpenROAD 的常用命令封装成可复用的 Tcl 过程,用一个入口过程 run_flow 依次完成:读入设计、全局布局、详细布局、全局布线、详细布线、生成报告。每个阶段独立成过程,便于单独调用或替换。

环境与依赖

  • OpenROAD 可执行程序(openroad),支持 Tcl 脚本模式。
  • 一个已综合好的网表与 LEF/DEF 或 LEF+Verilog 输入(本案例用变量占位,运行前替换为真实路径)。
  • 运行方式:openroad -exit run_flow.tcl。

封装思路

每个 OpenROAD 命令对应一个 Tcl 过程,过程内做参数检查与日志打印;run_flow 只负责按顺序调用这些过程。这样单步可调试,整体可一键执行。

run_flow read_design run_place run_route write_reports global_place global_route report/*.rpt

完整代码(run_flow.tcl)

# OpenROAD 批处理封装:读入 -> 布局 -> 布线 -> 报告
# 运行:openroad -exit run_flow.tcl

# ---- 输入配置(按实际工程替换)----
set DESIGN_LEF   "design/tech.lef"
set DESIGN_DEF   "design/design.def"
set DESIGN_VERILOG "design/design.v"
set TOP_MODULE   "top"
set REPORT_DIR   "report"

# ---- 通用日志 ----
proc log {stage msg} {
    puts "\[$stage\] $msg"
}

# ---- 读入设计 ----
proc read_design {lef def verilog top} {
    log "READ" "read_lef $lef"
    read_lef $lef
    if {[file exists $def]} {
        log "READ" "read_def $def"
        read_def $def
    } else {
        log "READ" "read_verilog $verilog"
        read_verilog $verilog
        link_design $top
    }
}

# ---- 布局:全局 + 详细 ----
proc run_place {} {
    log "PLACE" "global_placement"
    global_placement
    log "PLACE" "detailed_placement"
    detailed_placement
    log "PLACE" "check_placement"
    check_placement
}

# ---- 布线:全局 + 详细 ----
proc run_route {} {
    log "ROUTE" "global_route"
    global_route
    log "ROUTE" "detailed_route"
    detailed_route
}

# ---- 报告 ----
proc write_reports {dir} {
    file mkdir $dir
    log "REPORT" "report_checks -> $dir/timing.rpt"
    report_checks > [file join $dir timing.rpt]
    log "REPORT" "report_design_area -> $dir/area.rpt"
    report_design_area > [file join $dir area.rpt]
}

# ---- 一键入口 ----
proc run_flow {} {
    global DESIGN_LEF DESIGN_DEF DESIGN_VERILOG TOP_MODULE REPORT_DIR
    read_design $DESIGN_LEF $DESIGN_DEF $DESIGN_VERILOG $TOP_MODULE
    run_place
    run_route
    write_reports $REPORT_DIR
    log "DONE" "flow finished"
}

run_flow

运行与验证

  1. 把 DESIGN_LEF、DESIGN_DEF、DESIGN_VERILOG、TOP_MODULE 改成真实路径与顶层名。
  2. 执行 openroad -exit run_flow.tcl。
  3. 观察终端:应依次出现 [READ]、[PLACE]、[ROUTE]、[REPORT]、[DONE] 前缀日志。
  4. 检查 report/ 目录下生成 timing.rpt 与 area.rpt,且文件非空。
  5. 通过条件:无 Tcl 报错、无 OpenROAD 命令失败、两个报告文件存在且内容非空。

常见问题

  • 若只有 Verilog 无 DEF,脚本会自动走 read_verilog + link_design 分支。
  • 若某阶段命令名与所用 OpenROAD 版本不一致,只需修改对应过程内部命令,不影响其他阶段。