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.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
运行与验证
- 把
DESIGN_LEF、DESIGN_DEF、DESIGN_VERILOG、TOP_MODULE改成真实路径与顶层名。 - 执行
openroad -exit run_flow.tcl。 - 观察终端:应依次出现
[READ]、[PLACE]、[ROUTE]、[REPORT]、[DONE]前缀日志。 - 检查
report/目录下生成timing.rpt与area.rpt,且文件非空。 - 通过条件:无 Tcl 报错、无 OpenROAD 命令失败、两个报告文件存在且内容非空。
常见问题
- 若只有 Verilog 无 DEF,脚本会自动走
read_verilog + link_design分支。 - 若某阶段命令名与所用 OpenROAD 版本不一致,只需修改对应过程内部命令,不影响其他阶段。