OpenSTA 报告导出:report_checks 的 -format 五种格式与 grep/awk 后处理
更新时间:2026-11-04。上一篇 OpenSTA report_checks 报告解读 解决的是「屏幕上这份报告每个字段什么意思」,本篇解决另一个问题:报告怎么导出来、导成什么形状、落盘后怎么让脚本读。全部选项与输出均来自容器内 OpenSTA 2.0.17 的真机运行,教学库只有一个 DFF 和一个 BUF,产线请替换为 PDK 签核库。
本文要回答的问题
report_checks的-format在 2.0.17 里到底有哪几个合法值,网上说的 endpoint、slack_only 为什么报错或不存在?- short、end、full、full_clock、summary 五种格式各自长什么样,分别喂给谁看?
- 怎么把报告重定向到文件,退出码为什么不能用来判时序?
- 不用 Tcl,只用 grep/awk 怎么从一份落盘报告里统计违例端点数、揪出最差 slack?
这张概念卡是全篇导航:五种格式不是五种分析,引擎算的时间完全相同,差别只在打印时保留哪些区块。记住「人读 full、脚本读 end」,后面所有命令都围绕这条分工展开。
一、这一步在流程里的位置
报告导出处于 STA 流程的末端:库、网表、SDC 约束经 Tcl 加载链接后,内存里已经有全部时序结果,report_checks 只是把结果按选定格式打印。导出动作把打印流从终端重定向到文件,下游从此分成两条:人看 full 报告定位路径,脚本吃 end/summary 做违例统计与回归放行。
读图抓住一条主线:report_checks 不产生新数据,所以「报告里没有某条路径」时要回到 -group_count、-slack_max 等筛选选项和约束本身排查,而不是换格式碰运气。与上游建模步骤的衔接见 OpenSTA 第一份时序报告。
二、命令逐段解读:真机 help 上的合法选项
先在容器内 sta -no_init 后执行 help report_checks,2.0.17 的真实签名中,与导出相关的关键段如下(以下终端卡为真机原文):
逐项拆导出最常用的几组参数:
| 选项 | 真机行为 | 不写会怎样 |
|---|---|---|
-format short | 每条路径只打 Startpoint/Endpoint/Path Group/Path Type 四行头,没有任何数字 | 默认 full,输出长 |
-format end | 每个端点一行:Endpoint、Required Delay、Actual Delay、Slack,定宽列表 | 拿不到适合 awk 的对齐表 |
-format full | 完整发射/捕获双半区明细表(默认值) | — |
-format full_clock / full_clock_expanded | 在 full 基础上展开时钟路径明细(expanded 连生成时钟内部也展开) | 时钟树问题看不到逐段延迟 |
-format summary | 全设计一张 Startpoint/Endpoint/Slack 三列总表 | 想要一页总览得自己截 |
-path_delay max(或 min) | 选 setup / hold 检查;另有 min_max、max_rise 等变体 | 默认 max,hold 报告会漏 |
-group_count N / -endpoint_count N | 每组保留路径数 / 每端点保留路径数 | 默认条数很少,违例端点一多就被截断 |
-slack_max V / -slack_min V | 只保留 slack ≤ V / ≥ V 的路径 | 全量打印后只能自己筛 |
-sort_by_slack | 按 slack 排序(默认按路径组与端点) | 最差路径未必排在第一 |
-unique_paths_to_endpoint | 同一起终点间只保留一条 | 同一对触发器的多条等价路径占满配额 |
-digits D / -fields {slew capacitance input_pin net} / -no_line_splits | 小数位 / 加列 / 禁止长行折行 | 两位小数可能四舍五入掉小违例 |
> file / >> file | tcl 层重定向:覆盖写 / 追加写 | 报告只进终端,无法留档后处理 |
两个版本坑必须按真机口径纠正:第一,2.0.17 合法格式只有 full|full_clock|full_clock_expanded|short|end|summary 六种,不存在 -format endpoint 或 -format slack_only——网上旧博客这类写法要么是别工具的参数,要么是把 end 误记成 endpoint;写错时 sta 会打印 bad format value 并不出报告。第二,-setup/-hold 同样不是合法旗标,查 hold 要写 -path_delay min。
三、输入输出文件:五种报告各自长什么样
实验设计刻意做成阶梯:四条并行路径分别插 1/2/3/4 级 BUF,时钟周期 0.8ns,库 setup 0.10ns、DFF 的 CLK→Q 为 0.20ns、每级 BUF 0.30ns,于是四条寄存器间路径的 setup slack 依次为 0.20、−0.10、−0.40、−0.70,三违例一满足。export.tcl 用 tcl 重定向一次性导出五种格式:
read_liberty teaching.lib
read_verilog top.v
link_design top
create_clock -name clk -period 0.8 [get_ports clk]
set_input_delay -clock clk 0.0 [remove_from_collection [all_inputs] [get_ports clk]]
set_output_delay -clock clk 0.0 [all_outputs]
report_checks -path_delay max -format short -group_count 30 > reports/short.rpt
report_checks -path_delay max -format end -group_count 30 > reports/end.rpt
report_checks -path_delay max -format full -group_count 30 > reports/full.rpt
report_checks -path_delay max -format full_clock -group_count 30 > reports/full_clock.rpt
report_checks -path_delay max -format summary -group_count 30 > reports/summary.rpt
report_checks -path_delay max -format end -slack_max 0.0 -group_count 30 > reports/violators.rpt这里 > 是 OpenSTA tcl 解释器支持的重定向(help 末尾的 [> filename] [>> filename]),在脚本里直接写即可;shell 层的 sta -exit export.tcl > out.txt 也能用,但 tcl 内重定向可以一份脚本拆出多个文件。注意 set_input_delay 的对象要把 clk 端口从集合里剔除,否则真机告警 relative to a clock defined on the same port/pin not allowed。
最适合脚本消费的是 end 格式,真机输出如下:
读这张表:Required Delay 恒为 0.70(周期 0.80 扣库 setup 0.10),Actual Delay 随 BUF 级数从 0.50 爬到 1.40,Slack 列直接给出 MET/VIOLATED 判定。对照其余格式:short 只有四行身份头、半个数字都没有,适合盘点「到底有哪些路径」;summary 有起终点和 slack 但没有 Required/Actual 两列,适合一页纸汇总;full 是逐单元双半区明细,字段读法见 report_checks 逐字段解读;full_clock 在此基础上把时钟路径逐段展开,调试时钟树问题时才用得上。
四、常见错与检查点
| 现象 | 先查什么 | 纠正 |
|---|---|---|
写 -format endpoint 报 bad format value | 是否照抄了旧博客 | 2.0.17 用 end;先 help report_checks 核对 |
| 落盘报告只有寥寥两三条路径 | 默认 group/endpoint 配额 | 加 -group_count 30 -endpoint_count 10 |
| 脚本靠进程退出码判时序,违例也放行 | sta 退出码 | 路径 VIOLATED 时退出码仍是 0(本实验 STA_EXIT=0),必须读 slack 数字 |
| grep 出来的违例数对不上 | full 报告里同一路径多处含 VIOLATED 字样、或 hold/setup 混在一文件 | 数端点用 end 格式数 (VIOLATED) 行,一行一个端点;setup/hold 分文件导 |
set_input_delay 告警且端口路径未约束 | 集合是否包含 clk 自身 | remove_from_collection [all_inputs] [get_ports clk] |
第五条的输出里还有一类容易忽略的行:输入端口到第一级 DFF、末级 DFF 到输出端口的路径在加了 input/output delay 后同样进表,slack 分别是 0.70 与 0.60 MET——统计违例时它们不会被误计,但如果你没写端口延迟,这些路径会落到 unconstrained 分组,排查见 OpenSTA unconstrained 端点报告。
五、真实跑一遍:重定向落盘 + grep/awk 后处理
真机演示最朴素的文本流水线。第一条,统计违例端点数——end 格式每个端点恰好一行,直接数 (VIOLATED):
grep -c '(VIOLATED)' reports/full.rptfull 报告每条路径的判定行只有一处 slack (VIOLATED),本设计输出 3。第二条,取最差 slack(WNS):抓出判定行、抽第一列数值、升序取头:
grep '(VIOLATED)' reports/full.rpt | awk '{print $1}' | sort -n | head -1真机输出 -0.70。第三条,输出「端点 + slack」清单,awk 从路径头缓存 Endpoint、在判定行打印:
awk '/^Endpoint/{ep=$2} /slack \(VIOLATED\)/{print ep, $1}' reports/full.rpt真机输出为 u7 -0.70 / u6 -0.40 / u5 -0.10 三行。三段后处理的真机记录都在同一份 log 尾部:
同一张终端卡里还能看到更省事的原生命令:-format end -slack_max 0.0 直接只导出三条违例端点,连 grep 都省了。工程实践的分工是:一次性筛选交给命令选项(-slack_max/-slack_min/-sort_by_slack/-path_group),跨格式拼装、TNS 求和、接 CI 判定才用 awk;更复杂的回归提取(TNS、按路径组聚合)则该上 Tcl API,见 STA 时序报告提取 TCL 脚本。拿到最差路径之后的修复闭环见 OpenSTA 负 slack 修复流程。
实验环境
- 机器/系统:本地 Docker 容器,Ubuntu 24.04;宿主为 macOS(Apple Silicon)。
- 工具版本:
sta -version输出2.0.17(镜像 geek-eda:0.4-flow)。 - 日期:2026-11-04。
- 完整命令:
docker run --rm -v "$PWD":/work -w /work geek-eda:0.4-flow bash run.sh(等价于make run);脚本依次执行help report_checks、sta -no_init -exit export.tcl导出五种格式到reports/,再运行 grep/awk 三条统计命令。 - 实验边界:教学 liberty 仅两个单元、标量延时,数字只用于演示导出与后处理,不能外推为任何工艺签核结论。
代码获取
完整教学库、四路径网表、导出脚本与运行脚本位于 geek-doc.cn/experiments/flow-opensta-report-formats,克隆后进入该目录执行 make run 即可在 geek-eda:0.4-flow 容器中复现五种格式报告与三条 grep/awk 统计,本机装有 OpenSTA 时也可用 STA_BIN=sta bash run.sh 直接运行。
这一篇在知识体系里的位置
本篇讲「报告怎么导出、怎么让脚本读」:报告字段还不熟,先读 OpenSTA report_checks 报告解读;想了解约束与网表怎么进引擎,读 OpenSTA 第一份时序报告;要把统计固化为回归脚本,读 STA 时序报告提取 TCL 脚本;拿到违例后的修复动作,读 OpenSTA 负 slack 修复流程。
总结
OpenSTA 报告导出的核心是按 2.0.17 真机 help 选 -format:合法值只有 short、end、full、full_clock、full_clock_expanded、summary 六种,没有 endpoint/slack_only;人读定位用 full/full_clock,脚本消费用 end 的定宽三列表,盘点路径用 short、一页汇总用 summary。用 tcl 的 > file 重定向把各格式分别落盘,配合 -group_count/-endpoint_count 防截断、-slack_max 0 -sort_by_slack 在命令侧直接筛出排序后的违例;落盘后 grep -c '(VIOLATED)' 数违例端点、awk 抽 slack 列经 sort -n 取最差值,真机在 0.8ns 周期的四路径设计上得到 3 个违例端点、最差 -0.70ns。最后记住退出码恒为 0,时序判定必须读 slack 数字,不能看进程返回值。