OpenLane 小模块全流程实跑:sky130A 面积、时序与 DRC 报告逐项解读
更新时间:2026-10-25。本文是「EDA 实验室 · 数字后端」层的一篇实验文。OpenLane 第一个设计 用 spm 示例讲过 runs 目录结构和各阶段在干什么,回答的是「这次运行健康吗」;本篇换一个更小的自有设计(一个几行 Verilog 的小计数器)在 sky130A PDK 下真跑一遍,回答一个更具体的问题——跑完之后,面积、时序、DRC 三类报告里的每个关键数字到底在哪一行、怎么判读。时序报告想再往深读(setup/hold 原理与最差路径逐列核对)可以看 OpenSTA 时序报告解读,本篇只负责「全流程跑通后先看哪几行」。
本文要回答的问题
- 一次完整的 OpenLane 运行分哪几个阶段,42 个 STEP 各自归哪一类?
- 面积从哪一行读?「38.64 × 38.08」这两个数字是什么含义?
- 时序健康与否看哪三行
[INFO]: There are no ...? - DRC 与 LVS 的「干净」在日志里各自长什么样?
- 日志尾部的 WARNING 清单里,哪些可以忽略、哪些要警惕?
先给结论卡,四个数字全部来自本次真实运行日志:
读这张卡抓两个点:第一,OpenLANE 报告解读的主线就是「42 步里找 5 行」——面积行、三行时序结论、一行 DRC 结论,其余几十屏日志都是过程证据;第二,这个小设计所有签核指标一次全绿,这在小模块上是常态(sky130 的标准单元驱动一个计数器毫无压力),真正的价值是知道每个「绿」是从哪行日志读出来的,将来设计变大、变红时才知道去哪翻。
一、实验设计:最小自有设计 + 完整 flow
被测设计是一个刻意做小的计数器模块 small_counter:一个时钟、一个复位、一个使能、几位计数输出,几十行 Verilog。选它的原因和 状态机编码实测 选四状态机一样——设计小到不会引入自身瓶颈,报告里的每个数字都来自流程本身而不是设计问题,适合当「读报告」的教具。
运行命令是一条 docker 调用:把 OpenLane 源码、volare 下载好的 sky130A PDK、设计目录三者挂进官方镜像 efabless/openlane:d054702b...,然后执行 ./flow.tcl -design /designs/small_counter -tag golden_smoke -overwrite。-tag 给这次运行起名 golden_smoke,产物全部落在 runs/golden_smoke/ 下。这条命令跑完后,42 个 STEP 依次执行完毕,日志尾部打出 [SUCCESS]: Flow complete.。
42 个 STEP 不是平铺的,把日志里的 STEP 序号与阶段归并成一张速查表,以后翻日志可以直接按号索骥:
| STEP 区间 | 阶段 | 本阶段关键日志/产物 |
|---|---|---|
| 1-2 | 综合 + 首次 STA | linter 0 错 0 警;logs/synthesis/ |
| 3-6 | floorplan / IO / tap-decap / PDN | 面积行在 STEP 3;logs/floorplan/ |
| 7-14 | 布局 + 布局后优化 + CTS | 三次 STA(8/11/13);logs/placement/、logs/cts/ |
| 15-24 | 布线 + 布线后优化 | 详细布线后 DRC 归零在 STEP 23;logs/routing/ |
| 25-31 | 三角 SPEF 提取 + 多角 STA | min/max/nom 各一遍;logs/signoff/ |
| 32-42 | IR drop / GDS / LVS / DRC / 天线 / ERC | reports/metrics.csv、manufacturability.rpt |
这张表揭示了 OpenLane 的日志组织规律:STEP 编号是全局递增的,日志目录是按阶段分的——同一次运行里 logs/synthesis/、logs/placement/、logs/routing/、logs/signoff/ 并存,STEP 号告诉你在全流程里的位置,目录名告诉你阶段归属。排查时先按 STEP 号定位阶段,再进对应目录翻详细日志,比在总日志里 grep 快得多。
42 个 STEP 按阶段分组,用一张图看分工(颜色即阶段角色):
读这张图抓住主线:前六步定「形」(网表与芯片轮廓),中间一大段定「位」(单元摆哪、时钟怎么走、线怎么绕),最后 25 到 42 步全是「验」——寄生参数提取、三个工艺角的 STA、GDS 导出、LVS、DRC、天线检查、ERC。蓝色是前端性质的分析步,橙色是物理实现的动作步,绿色是签核步。 OpenLane 每个动作步后面几乎都跟一次 STA(日志里大量 Single-Corner Static Timing Analysis),这就是「时序驱动」流程的字面含义:每动一次物理结构,立刻重新算一遍时序。
二、运行实录:42 步全绿的样子
本次运行的真实实录如下(截取尾部 signoff 与最终判定段):
读这份实录抓三个位置。第一,STEP 34-35 用 KLayout 又导出一遍 GDS 并与 Magic 导出的做 XOR 比对,No XOR differences——两个独立工具产出的版图逐比特一致,这是版图数据自洽的硬证据。第二,No DRC violations after GDS streaming out——设计规则检查在最终 GDS 上归零。第三,末尾三行 There are no max slew... / no hold violations / no setup violations,再加一行 [SUCCESS]: Flow complete.,这就是一次健康运行的标准收尾。中段还有一处值得原样摘录,是 DRC 与布线交接的位置:
[STEP 23]
[INFO]: Running Detailed Routing (log: ../designs/small_counter/runs/golden_smoke/logs/routing/23-detailed.log)...
[INFO]: No DRC violations after detailed routing.
[STEP 24]
[INFO]: Checking Wire Lengths (log: ../designs/small_counter/runs/golden_smoke/logs/routing/24-wire_lengths.log)...这几行是布线阶段的健康线:详细布线器(TritonRoute)干完活后立刻自查一遍 DRC,No DRC violations after detailed routing 意味着绕线阶段没有引入间距/宽度/过孔违规。工程上这里如果非零,后面的 signoff DRC 几乎不可能干净,所以这一行是布线质量的第一道关口。注意它和 STEP 40 的 Magic DRC 是两道独立检查:前者在布线数据库上查,后者在导出的 GDS 上查,两道都过才算数。
三、面积:从 floorplan 行读起
小模块的面积信息出现在 STEP 3,原样摘录:
[STEP 3]
[INFO]: Running Initial Floorplanning (log: ../designs/small_counter/runs/golden_smoke/logs/floorplan/3-initial_fp.log)...
[WARNING]: Current core area is too small for the power grid settings chosen. The power grid will be scaled down.
[INFO]: Floorplanned with width 38.64 and height 38.08.Floorplanned with width 38.64 and height 38.08 就是本次的 core 尺寸:38.64 µm × 38.08 µm,约 1471 平方微米。sky130 是 130 nm 工艺,这个尺寸意味着整个计数器只占一粒灰尘大小的硅片——标准单元行高 2.72 µm,core 里大约摆 14 行单元,余量主要是电源条和布线通道。
同一行的 WARNING 值得展开:core area is too small for the power grid settings,意思是默认的电源网格间距(给大设计准备的)比这个 core 还宽,流程自动把电网缩密了。这是一个「设计太小才会触发」的良性警告,可以忽略;反过来如果看到的是 utilization(利用率)相关的警告——比如布局密度过高、详细布线 DRC 修不干净——那才是要回头调 FP_CORE_UTIL 或 PL_TARGET_DENSITY 的信号。更精细的面积数据(单元数、各类型单元占比、die 面积)在运行结束后落在 reports/metrics.csv 里,日志尾部有一行 Created metrics report at ... 指明位置,那是一份逗号分隔的指标总表,适合做多次运行的横向对比。
四、时序:三行结论与它们的来历
时序结论集中在日志尾部三行:
[INFO]: There are no max slew, max fanout or max capacitance violations in the design at the typical corner.
[INFO]: There are no hold violations in the design at the typical corner.
[INFO]: There are no setup violations in the design at the typical corner.三行各管一件事。第一行是「电气规则」:信号翻转速度(slew)不能太慢、一个输出带的负载(fanout)不能太多、线上总电容不能超——这些违例会让时序模型本身失真,所以 OpenSTA 把它们和 setup/hold 分开报。第二行是 hold(保持时间):数据不能变得太快,违例只能插延迟单元修。第三行是 setup(建立时间):数据必须在采样沿前到齐,违例可以靠降频缓解。setup/hold 的物理含义与最差路径报告的逐列读法,OpenSTA 时序报告解读 有完整展开,这里记住判读顺序即可:先看这三行全不全绿,全绿再看 metrics.csv 里的 wns/tns 留多少裕量,有红的再去对应阶段的 sta 日志里翻最差路径。
还有一个细节:日志里 STA 出现了十几次,但只有 STEP 25-31 的 signoff 阶段做了 min/max/nom 三个工艺角的 SPEF 提取与多角 STA,前面的都是 single-corner 快速检查。也就是「过程中单角、签核多角」——前面求快,最后求准。三行结论里写的 at the typical corner 对应 nom 角;本设计裕量巨大所以三角全过,大设计上要分别确认 min 角(快工艺,hold 危险)和 max 角(慢工艺,setup 危险)各自的报告。
另外一个容易读漏的信号是 STEP 31 附近成批出现的 blackboxed during sta 警告——tap、fill、decap 这些物理单元没有时序模型,STA 把它们当黑盒跳过。看到这类警告不用慌,它不改变功能路径上的时序结论;但如果哪天黑盒名单里出现了你自己 RTL 里的模块名,那就是综合或库映射出了问题,必须停下来查。
五、LVS 与版图一致性:签核的另外两条腿
DRC 干净只说明「版图符合工艺规则」,还不能说明「版图就是你要的电路」。OpenLane 在 signoff 段用另外两个检查把这条链补齐,本次日志里都能抓到。
一是版图一致性双保险。STEP 33 用 Magic 导出 GDS,STEP 34 用 KLayout 再导出一遍,STEP 35 对两份 GDS 做 XOR 比对,日志给出 No XOR differences between KLayout and Magic gds。两个独立实现的导出器产出逐比特一致的版图,说明 GDS 数据本身没有被工具 bug 污染。二是 LVS(Layout vs Schematic,版图对原理图一致性检查),STEP 39 用 Magic 从版图提网表、与综合网表比对,确认物理实现没有连错线——布线器为了修时序插的缓冲器、为天线规则插的二极管,都必须在 LVS 里对得上号。
把签核段三条腿合在一起记:DRC 管「工艺厂能不能造」,LVS 管「造出来是不是你的设计」,STA 管「你的设计能不能跑到目标频率」。三条腿任何一条红了都不能算 tape-out 就绪,这也是 STEP 25-42 占了全流程近一半步数的原因——实现(placement/routing)只是中段,验证与导出才是后段的主角。
六、WARNING 清单:哪些能放、哪些不能放
[SUCCESS] 之后 OpenLane 会把本次全部警告汇总重打一遍,本次共 5 条。逐条判读:
| 警告 | 性质 | 处置 |
|---|---|---|
| core area too small for power grid | 设计太小,电网自动缩密 | 良性,忽略 |
| tap/fill/decap 单元 blackboxed during sta(4 条) | 物理单元无时序模型,STA 跳过 | 良性,惯例 |
| VSRC_LOC_FILES is not defined | 未给电压源位置,IR drop 数值不精确 | 小设计可放;量产设计必须补 |
判读原则一句话:WARNING 分「工具自动消化了的」和「数据精度打折的」两类。前两类是前者——电网缩密是流程自己做的决定,物理单元没有时序弧是库的正常形态;最后一条是后者——IR drop 分析还在跑,但数值不可信,签核级的电源完整性分析必须补上电压源位置文件。遇到没见过的警告,先问「它让哪份产物的精度打折了」,答不上来就不能放。
这一篇在知识体系里的位置
- 上手承接:OpenLane 第一个设计(runs 目录结构与各阶段产物);
- 安装环境:OpenLane Docker 安装(本篇命令里的镜像与 PDK 挂载从哪来);
- 时序深入:OpenSTA 时序报告解读(setup/hold 原理与最差路径逐列核对);
- 版图查看:KLayout 看 GDS(本篇 GDS 产物的可视化)。
一句话总结
一个小计数器在 sky130A 下从 RTL 到 GDS 42 步全绿:面积看 floorplan 行的 38.64×38.08 µm,时序看尾部 no slew/hold/setup 三行,DRC 看详细布线与 GDS 导出后两处 0 违规;读 OpenLane 报告的本质是在 42 步日志里定位这 5 行,WARNING 则按「工具消化了还是精度打折了」二分处置。
实验环境
- 机器/系统:云主机 S6.4XLARGE32 16C32G / Ubuntu 22.04(eda-golden-v1 镜像)
- 工具版本:OpenLane d054702b(docker 镜像 efabless/openlane:d054702b2cce04761cc2bc598f6b95c9d8ca7c6c-amd64)、PDK sky130A(volare 安装,标准单元库 sky130_fd_sc_hd),照抄日志头部真实输出
- 日期:2026-10-25
- 完整命令:
bash run.sh(内部执行cd /opt/openlane-src/OpenLane && docker run --rm挂载 OpenLane 源码、volare PDK 与设计目录后./flow.tcl -design /designs/small_counter -tag golden_smoke -overwrite)
代码获取
小计数器 RTL、config.json 与运行脚本已同步到公开仓库:geek-doc.cn/experiments/exp-openlane-small-sky130-report,装好 OpenLane 与 sky130A PDK 后进入该目录执行 bash run.sh 即可复现本文全部结果。