OpenROAD Flow Scripts 教程
引言
本文档是一个教程,介绍如何使用 OpenROAD Flow Scripts 运行从 RTL 到 GDS 的完整 OpenROAD 流程。教程包含了在关键流程阶段中进行有用的设计操作和手动使用的示例,帮助用户深入理解 OpenROAD 应用程序的流程、数据组织方式、GUI 以及命令。
本教程适用于:
- 对 VLSI 基本设计流程有一定了解的初学者或新用户。用户可以从 这里 学习安装的基础知识,以使用 OpenROAD-flow-scripts 完成完整的 RTL 到 GDS 流程。
- 已经熟悉 OpenROAD 应用程序和流程,但希望进一步了解特定功能和命令的用户。
用户指南
- 本教程需要使用由 OpenROAD-flow-scripts(ORFS)构建的特定目录结构。请勿修改此结构或其底层文件,否则会导致流程执行出现问题。
- 用户可以运行完整的 RTL 到 GDS 流程,并独立地学习特定的流程章节。这样用户就可以按照自己的节奏、时间和偏好来学习流程和工具的功能。
- 教程中展示的结果(例如图片、报告和日志的输出)可能会随版本更新而有所变化。但是,主要流程和命令结构通常是通用的。
注意:如发现任何问题,请在 GitHub 仓库的 Issues 中提交,地址在这里。
快速上手
本节介绍如何搭建环境以构建 OpenROAD-flow-scripts,并准备好使用 sky130hd 工艺运行开源设计 ibex 的 RTL 到 GDS 流程。
ibex 是一个 32 位 RISC-V CPU 内核(RV32IMC/EMC),采用两级流水线。
环境设置
请使用 bash shell 来运行命令和脚本。
安装 OpenROAD-flow-scripts
要安装 OpenROAD-flow-scripts,请参阅 构建或安装 ORFS 依赖项 文档。
一般来说,我们推荐使用 Docker 以获得高效的用户体验。请参阅
Docker Shell 文档。
!Note
如果您需要自定义 Docker 镜像,可以按照以下说明自行构建:
使用 Docker 从源码构建。
!Note
如果您需要更新已有的 OpenROAD-flow-scripts 安装:
- 对于本地安装,请按照 这里 的说明操作。
- 对于 Docker,运行
docker pull openroad/orfs:latest即可更新镜像。
配置设计
本节介绍如何设置必要的平台和设计配置文件,以便使用
OpenROAD-flow-scripts 运行 ibex 设计的完整 RTL 到 GDS 流程。
cd flow
平台配置
查看 sky130hd 默认变量的平台配置文件。
less ./platforms/sky130hd/config.mk
config.mk 文件包含了 sky130 平台所需的所有变量,因此不建议
修改此处的任何变量定义。您可以在这里 查看 sky130hd 平台配置。
有关如何在 OpenROAD-flow-scripts 中使用平台特定和设计特定的环境变量来定制和配置设计流程的详细信息,请参阅流程变量 文档。
设计配置
查看 ibex 设计的默认设计配置:
less ./designs/sky130hd/ibex/config.mk
您可以在这里 查看 ibex 设计的 config.mk。
!Note
以下设计特定的配置变量是必需的,用于指定主要设计输入,例如平台、顶层设计名称和约束。本教程将使用默认配置变量。
| 变量名 | 描述 |
|---|---|
PLATFORM | 指定工艺设计套件(Process Design Kit)。 |
DESIGN_NAME | 设计顶层模块的名称 |
VERILOG_FILES | 设计 Verilog 文件或提供模块描述的 JSON 文件的路径(更多详情请查看 yosys -h write_json)。 |
SDC_FILE | 设计 .sdc 文件的路径 |
CORE_UTILIZATION | 内核利用率百分比。 |
PLACE_DENSITY | 期望的单元布局密度。它反映了单元在内核区域中的分散程度。1 = 紧密密集,0 = 广泛分散 |
!Note
要向flow中添加新设计,请参阅这里的文档。此步骤面向高级用户。
如果您是初学者,请先通过完成本教程来理解整个流程,之后再回到此步骤添加新设计。
时序约束
在这里 查看 .sdc 文件中指定的时序约束。
less ./designs/sky130hd/ibex/constraint.sdc
对于 ibex 设计,我们仅使用如下的时钟定义作为最低要求的时序约束。
create_clock -name core_clock -period 17.4 [get_ports {clk_i}]
设计输入 SystemVerilog
SystemVerilog 输入文件位于 ./designs/src/ibex_sv/
设计定义在 ibex_core.sv 中,可在这里查看。
请参阅 ibex 设计的 README.md,地址在这里。
运行自动化 RTL 到 GDS 流程
本节介绍从 RTL 到 GDS 的设计流程的完整执行过程。OpenROAD 应用程序
使用调用开源工具的 Tcl 脚本执行整个自动化流程,从综合到最终
.gds 文件的创建,全程无需人工干预。不过,在本教程中,用户将学习
针对重要流程阶段的自动化运行方式以及几种交互式运行 Tcl 命令的方式。
在 OpenROAD-flow-scripts 目录中,用户可以访问各个流程阶段、相应的工具以及对应的 README.md,了解工具命令、使用 Tcl 接口的配置示例
及其他详细信息。
- 综合(Synthesis)
- 数据库(Database)
- 布图规划(Floorplanning)
- 引脚布局(Pin Placement)
- 芯片级连接(Chip-level Connections)
- 宏单元布局(Macro Placement)
- Tapcell 插入(Tapcell insertion)
- PDN 分析(PDN Analysis)
- IR 压降分析(IR Drop Analysis)
- 全局布局(Global Placement)
- 时序分析(Timing Analysis)
- 详细布局(Detailed Placement)
- 使用 Resizer 进行时序优化(Timing Optimization using Resizer)
- 时钟树综合(Clock Tree Synthesis)
- 全局布线(Global Routing)
- 天线规则检查器(Antenna Rule Checker)
- 详细布线(Detail Routing)
- 金属填充(Metall Fill)
- 寄生参数提取(Parasitics Extraction)
- 版图生成(Layout Generation)
设计目标
在 OpenROAD-flow-scripts 自动化流程中使用 sky130hd 工艺运行
ibex 设计,完成从 RTL 到 GDS 的流程。ibex 设计的详细信息见
这里,设计目标如下:
- 面积
所需的最小芯片(Die)尺寸:0 0 798 800(单位:微米)
内核(Core)尺寸:2 2 796 798(单位:微米)
- 时序
满足时序的时钟周期:17.4(单位:ns)
ibex 在一台 8 核、16GB 内存的机器上大约需要 8 分钟。运行时间会因您的配置而异。
将当前目录切换到 flow 目录。
cd flow
使用以下命令运行完整流程:
make DESIGN_CONFIG=./designs/sky130hd/ibex/config.mk
在流程执行过程中,可以查看 OpenROAD-flow-scripts 目录的内容及其
含义。
OpenROAD-flow-scripts 通常可以从前一次部分运行的状态重新启动。如果
出现错误导致无法重启流程,您可以尝试删除所有已生成的文件并重新
开始运行。如果工具在写入文件时崩溃或被终止,就可能出现此类错误。
以 sky130hd/ibex 为例,可以用以下命令删除其文件:
make clean_all DESIGN_CONFIG=./designs/sky130hd/ibex/config.mk
您还可以分别使用 clean_synth、clean_floorplan、clean_place、
clean_cts、clean_route 和 clean_finish 删除与 RTL 到 GDSII
转换中各个阶段(如综合、布图规划、宏单元布局、时钟树综合、布线和
版图生成)相关的文件。
查看 OpenROAD-flow-scripts 目录结构和结果
在终端中打开一个新标签页,输入 ls 命令探索 flow 中的目录
结构,查看其内容:
designs logs Makefile objects platforms reports results scripts test util
浏览上述每个子目录,了解底层文件的组织方式。
designs/sky130hd/ibex
文件包括:sky130hd平台的设计 makefile 和 SDC 文件,
以及用于自动调参器(autotuner)和指标(metrics)的其他文件。
autotuner.json config.mk constraint_doe.sdc constraint.sdc metadata-base-ok.json rules.json
platforms
包含 OpenROAD 流程支持的公共 PDK
asap7 nangate45 sky130hd sky130hs sky130io sky130ram
objects/sky130hd/ibex/base
包含 ABC 约束以及完成流程所使用的所有临时库文件
abc.constr klayout.lyt klayout_tech.lef lib
logs/sky130hd/ibex/base
日志目录,包含每个流程阶段的日志文件。
logs | ||
|---|---|---|
1_1_yosys.log | 3_1_place_gp.log | 5_2_route.log |
2_1_floorplan.log | 3_2_place_iop.log | 6_1_merge.log |
2_2_floorplan_io.log | 3_3_resizer.log | 6_report.log |
2_3_tdms_place.log | 3_4_opendp.log | |
2_4_floorplan_macro.log | 4_1_cts.log | |
2_5_floorplan_tapcell.log | 4_2_cts_fillcell.log | |
2_6_floorplan_pdn.log | 5_1_grt.log |
results/sky130hd/ibex/base
结果目录,包含.v/.sdc/.odb/.def/.spef文件
results | ||
|---|---|---|
1_1_yosys.v | 3_1_place_gp.odb | 5_route.sdc |
1_synth.sdc | 3_2_place_iop.odb | 6_1_fill.odb |
1_synth.v | 3_3_place_resized.odb | 6_1_fill.sdc |
2_1_floorplan.odb | 3_4_place_dp.odb | 6_1_merged.gds |
2_2_floorplan_io.odb | 3_place.odb | 6_final.odb |
2_3_floorplan_tdms.odb | 3_place.sdc | 6_final.gds |
2_4_floorplan_macro.odb | 4_1_cts.odb | 6_final.sdc |
2_5_floorplan_tapcell.odb | 4_2_cts_fillcell.odb | 6_final.spef |
2_6_floorplan_pdn.odb | 4_cts.odb | 6_final.v |
2_floorplan.odb | 4_cts.sdc | output_guide.mod |
2_floorplan.sdc | 4_cts.v | route.guide |
2_floorplan.v | 5_route.odb | updated_clks.sdc |
reports/sky130hd/ibex/base
报告目录,包含拥塞报告、DRC 报告、设计统计数据和天线日志,
供参考。
reports | ||
|---|---|---|
congestion.rpt | VDD.rpt | VSS.rpt |
5_route_drc.rpt | final_clocks.webp | final_placement.webp |
antenna.log | final_clocks.webp | final.webp |
synth_stat.txt | synth_check.txt | final_resizer.webp |
下表简要说明了 reports 目录中的文件。
| 文件名 | 描述 |
|---|---|
congestion.rpt | 全局布线拥塞情况(如发生)。 |
5_route_drc.rpt | DRC 违例情况(如发生)。 |
final_clocks.webp | 时钟树综合后由 OR 提取的参考图像。 |
final_resizer.webp | Resizer 之后由 OR 提取的参考图像。 |
synth_check.txt | 综合警告/错误信息。 |
antenna.log | 天线检查日志报告。 |
final_placement.webp | 最终布局后提取的图像。 |
final.webp | 布线后提取的图像。 |
synth_stat.txt | 综合后设计统计日志保存在此处。 |
流程完成时会创建合并后的最终 GDS 文件,并显示如下信息。
[INFO] Writing out GDS/OAS
'results/sky130hd/ibex/base/6_1_merged.gds'
cp results/sky130hd/ibex/base/6_1_merged.gds
results/sky130hd/ibex/base/6_final.gds
查看结果和日志
OpenROAD-flow-scripts 为每个流程阶段添加了前缀(如下所示),以
指示其在 RTL-GDS 流程中的位置。这样在出现故障时,更容易理解和
调试每个流程阶段。
查看 ibex 设计日志:
ls logs/sky130hd/ibex/base/
日志结构如下:
logs | ||
|---|---|---|
1_1_yosys.log | 3_1_place_gp.log | 5_2_route.log |
2_1_floorplan.log | 3_2_place_iop.log | 6_1_merge.log |
2_2_floorplan_io.log | 3_3_resizer.log | 6_report.log |
2_3_tdms_place.log | 3_4_opendp.log | |
2_4_floorplan_macro.log | 4_1_cts.log | |
2_5_floorplan_tapcell.log | 4_2_cts_fillcell.log | |
2_6_floorplan_pdn.log | 5_1_grt.log |
面积
查看设计面积及其内核利用率:
make gui_final
在 Tcl Commands(Tcl 命令)区域中输入:
report_design_area
得到的面积结果如下:
Design area 191262 u^2 30% utilization.
时序
用户可以使用 shell 中的命令界面或 OpenROAD GUI 查看流程结果,
以进一步可视化和调试。了解更多关于 GUI 的信息。
make gui_final
在 GUI 的 Tcl Commands 区域中使用以下命令:
report_worst_slack
report_tns
report_wns
注意最差裕量(worst slack)、总负裕量(TNS)和最差负裕量(WNS):
worst slack -0.99
tns -1.29
wns -0.99
要了解更多关于在设计层次结构中可视化和追踪时序路径的信息,请参阅 OpenROAD GUI。
功耗
使用报告命令查看各个功耗组成部分,即时序逻辑、组合逻辑、宏单元
以及 I/O 焊盘(pad)消耗的功耗。
在 Tcl Commands 区域中输入:
report_power
功耗输出如下:
--------------------------------------------------------------------------
Group Internal Switching Leakage Total
Power Power Power Power
----------------------------------------------------------------
Sequential 5.58e-03 6.12e-04 1.67e-08 6.19e-03 19.0%
Combinational 9.23e-03 1.71e-02 4.90e-08 2.63e-02 81.0%
Macro 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.0%
Pad 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.0%
----------------------------------------------------------------
Total 1.48e-02 1.77e-02 6.57e-08 3.25e-02 100.0%
45.6% 54.4% 0.0%
OpenROAD GUI
GUI 允许用户通过详细的可视化和自定义选项来选择、控制、高亮显示
并浏览设计层次结构和设计对象(网络、引脚、实例、路径等)。
有关如何使用 GUI 的详细信息,请参阅相应文档。除布局窗口外,所有窗口都是可以取消停靠的停靠窗口。它们也可以从 Windows 菜单中关闭和重新打开。
注意:当您使用远程访问时,需要在命令中加入 -Y(或 -X)选项,
以使 X11 应用程序能够在网络上正常运行。使用 “ssh -Y” 命令并加上
远程服务器的地址或主机名,即可建立安全连接并激活 X11 转发。
此功能使您能够在远程服务器上运行图形程序,并将其窗口显示在
本地计算机的桌面环境中。
在本节中,您将学习如何:
- 可视化设计层次结构
- 加载 ODB 文件以进行布图规划和布局可视化
- 追踪综合后的时钟树以查看层次结构和缓冲器
- 使用热力图查看拥塞情况并观察布局的效果
- 查看并追踪关键时序路径
- 设置显示控制选项
- 从检查器(Inspector)缩放到对象
如果您已完成 RTL-GDS 流程,请继续查看 results 目录下的最终
GDS 文件 ./results/sky130hd/ibex/base/。
对于 ibex 设计,请在 这里 提供的 Makefile 中取消对 DESIGN_CONFIG 变量的注释。
# DESIGN_CONFIG=./designs/sky130hd/gcd/config.mk
DESIGN_CONFIG=./designs/sky130hd/ibex/config.mk
# DESIGN_CONFIG=./designs/sky130hd/aes/config.mk
make gui_final
查看布局结果
make gui_final 命令目标按以下步骤依次读取并加载工艺
.odb 文件和寄生参数,并调用 GUI:
- 读取并加载
.odb文件。 - 加载
.spef(寄生参数)。
下图显示了 ibex 设计布线后的 DEF。

可视化设计对象和连接关系
注意左侧(LHS)的 Display Control(显示控制)窗口,其中显示了各种设计对象(图层、网络、实例、阻塞区、热力图等)的颜色、可见性和选择选项按钮。
右侧(RHS)的 Inspector(检查器)窗口允许用户查看所选设计对象的详细信息以及时序报告。
尝试通过显示控制窗口有选择地显示(显示/隐藏)各种设计对象,并观察它们对显示的影响。
追踪时钟树
查看 ibex 设计综合后的时钟树:
- 在顶部工具栏中点击
Windows->Clock Tree Viewer

在右侧点击 Clock Tree Viewer,然后点击右上角的Update,查看设计中综合出的时钟树。
要查看如下所示的时钟树结构,用户需要禁用左侧的金属
Layers(图层)部分,如下所示。

在顶部工具栏中,点击 Windows 菜单,选择/隐藏不同的视图选项,如脚本(Scripting)、显示控制(Display control)等。
(content:heat:maps)=
使用热力图
在菜单栏中,点击 Tools -> Heat Maps -> Placement Density,
即可有选择地查看垂直和水平图层上的拥塞情况。
在 OpenROAD GUI 左侧的显示控制窗口中,展开Heat Maps -> Placement Density。
查看所有图层上 50-100% 范围内的拥塞情况:
在 Placement density(布局密度)设置弹出窗口中,选择Minimum -> 50.00%,Maximum -> 100.00%

在 Display Control 中选择 Heat Maps -> Routing Congestion,
如下所示:

在 Display Control 中选择 Heat Maps -> Power Density,
如下所示:

查看时序报告
点击 Timing -> Options 查看并遍历特定的时序路径。
在工具栏中点击 Timing 图标,查看添加到 GUI 右侧(RHS)的 Timing Report(时序报告)窗口,如下所示。

在 Timing Report 中选择 Paths -> Update,Paths 应为整数。时序路径的数量将显示在当前窗口中,如下所示:

选择 Setup(建立时间)或 Hold(保持时间)选项卡,查看每个时序路径段所需的到达时间和裕量(slack)。
对于每个 Setup 或 Hold 路径组,路径详情都具有特定的 引脚名称、Time(时间)、Delay(延迟)、Slew(转换速率)和 Load(负载) 数值,涵盖时钟到寄存器、寄存器到寄存器以及寄存器到输出的数据路径。
使用标尺
标尺可以测量设计中任意两个对象之间的距离,或待测金属层的长度和宽度等。
测量 VDD 与 VSS 电源网格之间距离的示例,点击:
Tools -> Ruler K

VDD 与 VSS 层之间的距离为 11.970。
DRC 查看器
您可以使用 GUI 追踪 DRC 违例并修复它们。
查看布线后的 DRC 违例:
less ./reports/sky130hd/ibex/base/5_route_drc.rpt
所有 DRC 违例都会记录在 5_route_drc.rpt 文件中,如果没有违例,该文件则为空。
在 OpenROAD GUI 中,启用菜单选项 Windows -> DRC Viewer。
GUI 右侧(RHS)会添加一个 DRC viewer(DRC 查看器)窗口。
在 DRC Viewer 中点击 Load,导航到 5_route_drc.rpt。

通过选择 DRC 违例的详细信息,设计人员可以分析并修复它们。在这里,
用户将学习如何使用 gcd 设计追踪 DRC 违例。更多详情请参阅以下
OpenROAD 测试用例。
cd ./flow/tutorials/scripts/drt/
openroad -gui
在 GUI 的 Tcl Commands 区域中:
source drc_issue.tcl
在详细布线后的日志中,您可以找到设计中剩余的违例数量:
[INFO DRT-0199] Number of violations = 7.
按照 DRC Viewer 步骤加载 results/5_route_drc.rpt。GUI 显示
如下:

设计中的 X 标记 高亮显示了 DRC 违例。
在右侧的 DRC Viewer 中,expand(展开)-> Short 这里显示了设计中的 violations(违例)数量。放大设计以清晰
查看违例:

output53 存在重叠,这导致了 short violation(短路违例)。
打开输入的 DEF 文件 drc_cts.def 以检查重叠的来源。
注意 DEF 文件的这段代码:output51 和 output53 具有相同的布局坐标,因此导致了布局违例。
- output51 sky130_fd_sc_hd__clkbuf_1 + PLACED ( 267260 136000 ) N ;
- output53 sky130_fd_sc_hd__clkbuf_1 + PLACED ( 267260 136000 ) N ;
使用 4_cts.def 中提供的测试用例,应用修改后的坐标更新如下:
- output51 sky130_fd_sc_hd__clkbuf_1 + PLACED ( 267260 136000 ) N ;
- output53 sky130_fd_sc_hd__clkbuf_1 + PLACED ( 124660 266560 ) N ;
关闭当前 GUI,并使用更新后的 DEF 重新加载 GUI,即可看到设计中
已修复的 DRC 违例:
openroad -gui
在 Tcl Commands 区域中:
source drc_fix.tcl
在详细布线后的日志中,用户可以找到设计中剩余的违例数量:
[INFO DRT-0199] Number of violations = 0.
布线完成,0 个违例。
Tcl 命令接口
在 GUI 中执行 OpenROAD-flow-scripts 的 Tcl 命令。输入 help 可查看可用的 Tcl 命令。在 OpenROAD GUI 底部有 TCL commands 可执行区域,用于运行命令。例如:
在 GUI 的 Tcl Commands 区域中查看 design area(设计面积):
report_design_area
尝试使用以下时序报告命令,以交互方式查看时序结果:
report_wns
report_tns
report_worst_slack
自定义 GUI
通过创建您自己的控件(如菜单栏、工具栏按钮、对话框等)来自定义
GUI。
请参阅 GUI。
在 GUI 中创建 Load_LEF 工具栏按钮,以自动加载指定的 .lef 文件。
openroad -gui

要查看 load_lef.tcl,运行以下命令:
less ./flow/tutorials/scripts/gui/load_lef.tcl
proc load_lef_sky130 {} {
set FLOW_PATH [exec pwd]
read_lef $FLOW_PATH/../../../platforms/sky130hd/lef/sky130_fd_sc_hd.tlef
read_lef $FLOW_PATH/../../../platforms/sky130hd/lef/sky130_fd_sc_hd_merged.lef
}
create_toolbar_button -name "Load_LEF" -text "Load_LEF" -script {load_lef_sky130} -echo
在 OpenROAD GUI 的 Tcl commands 中:
cd ./flow/tutorials/scripts/gui/
source load_lef.tcl
Load_LEF 工具栏按钮添加如下:

在工具栏菜单中,点击 Load_LEF。这会将指定的 sky130 工艺 .tlef 和 merged.lef 文件加载到当前 OpenROAD GUI 中,如下所示:

理解和分析 OpenROAD 流程阶段及结果
OpenROAD 流程是完全自动化的,但用户仍可以进行有益的干预,以探索、分析和优化您的设计流程,从而获得良好的 PPA。
在本节中,您将学习各流程阶段的具体细节,并学习探索各种设计配置和优化方案,以达成特定的设计目标,即 PPA(面积、时序、功耗)。
综合探索
面积与时序优化
使用综合选项 ABC_AREA 和 ABC_SPEED 探索优化选项。
设置 ABC_AREA=1 进行面积优化,设置 ABC_SPEED=1 进行时序优化。
针对每种情况更新设计的 config.mk,并重新运行流程以查看影响。
查看 ibex 设计的 config.mk。
#综合策略
export ABC_AREA = 1
从 flow 目录运行 make 命令,如下所示:
make DESIGN_CONFIG=./designs/sky130hd/gcd/config.mk
gcd 设计在面积优化和速度优化下的综合结果如下所示:
| 综合统计指标 | ABC_SPEED | ABC_AREA |
|---|---|---|
Number of wires | 224 | 224 |
Number of wire bits | 270 | 270 |
Number of cells | 234 | 234 |
Chip area | 2083.248000 | 2083.248000 |
Final Design Area | Design area 4295 u^2 6% utilization. | Design area 4074 u^2 6% utilization. |
注意:面积优化的结果最好在布图规划(floorplanning)之后检查,以验证最终影响。首先放宽 .sdc 约束并重新运行,以观察对面积的影响。否则,无论之前生成的网表如何,repair design 命令都会增加面积以满足时序要求。
布图规划(Floorplanning)
本节介绍如何使用 GUI 执行 OpenROAD-flow-scripts 的布图规划和
布局功能。
基于内核(Core)和芯片(Die)面积的布图规划初始化
请参阅以下 OpenROAD 内置示例,地址在
这里。
在 OpenROAD 工具根目录的终端中运行以下命令,以构建并查看所创建
的布图规划。
cd ../tools/OpenROAD/src/ifp/test/
openroad -gui
在 GUI 的 Tcl Commands 区域中:
source init_floorplan1.tcl
查看生成的芯片面积 “0 0 1000 1000” 和内核面积 “100 100 900 900”
(单位:微米),如下所示:

基于内核利用率的布图规划
请参阅以下 OpenROAD 内置示例,地址在这里。
在 OpenROAD 工具根目录的终端中运行以下命令,以查看布图规划
是如何初始化的:
cd ../tools/OpenROAD/src/ifp/test/
openroad -gui
在 GUI 的 Tcl Commands 区域中:
source init_floorplan2.tcl
查看以内核利用率 30 创建的布图规划结果:

IO 引脚布局
在芯片边界的轨道网格上放置引脚,以最小化网络线长。引脚布局还会
使用最小面积规则为每个引脚创建金属形状。
对于含有未放置单元的设计,网络线长的计算会将芯片区域的中心视为未放置单元的位置。
引脚布局文档见 这里。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 openroad GUI:
cd ../tools/OpenROAD/src/ppl/test/
openroad -gui
运行 place_pin4.tcl 脚本以查看引脚布局。
在 GUI 的 Tcl commands 区域中:
source place_pin4.tcl
在 GUI 中查看引脚布局结果:

在 OpenROAD GUI 中,要放大 clk 引脚的布局,按住鼠标右键并在
特定位置拖动绘制一个方框,如下所示:

现在 clk 引脚放大后的清晰视图如下:

芯片级 IO 焊盘布局
在本节中,您将使用 Tcl 脚本为 coyote 设计生成 I/O 焊盘环。
ICeWall 是一个实用工具,用于在设计外围放置 IO 单元,并将这些 IO 单元与设计网表中存在的单元相关联。
有关使用 ICeWall 进行 I/O 焊盘布局的信息,请参阅这里 的 readme 文件。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 openroad GUI:
cd ../tools/OpenROAD/src/pad/test/
openroad -gui
运行 skywater130_coyote_tc.tcl 脚本以查看 IO 焊盘布局。
在 GUI 的 Tcl commands 区域中:
source skywater130_coyote_tc.tcl
在 GUI 中查看生成的 IO 焊盘环:

电源规划与分析
在本节中,您将使用 gcd 设计创建电源网格并运行功耗分析。
Pdngen 用于电源规划。文档见 这里。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 openroad GUI:
cd ../tools/OpenROAD/src/pdn/test
openroad -gui
运行 core_grid_snap.tcl 为 gcd 设计生成电源网格。
source core_grid_snap.tcl
查看 gcd 设计生成的电源规划:

IR 压降分析
IR 压降(IR drop)是指电压在构成电源网格的金属导线中、到达标准单元电源引脚之前的下降。限制 IR 压降非常重要,因为它会影响单元的速度以及芯片的整体性能。
PDNSim 是一个开源的静态 IR 分析器。
功能特性:
- 报告最差 IR 压降。
- 在给定已完成布局且已完成 PDN 综合的设计中,报告电源分配网络所有节点和导线段上的最差电流密度。
- 检查电源和接地网络上的悬空 PDN 金属条。
- 用于电源分配网络导线段的 Spice 网表写出器。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 openroad:
cd ../tools/OpenROAD/src/psm/test
openroad
运行 gcd_test_vdd.tcl 为 gcd 设计生成 IR 压降报告。
source gcd_test_vdd.tcl
在日志末尾可以找到如下 IR 压降报告:
########## IR report #################
Worstcase voltage: 1.10e+00 V
Average IR drop : 1.68e-04 V
Worstcase IR drop: 2.98e-04 V
######################################
Tapcell 插入
Tap cell(衬底接触单元)是非功能单元,可以带有阱接触(well tie)、衬底接触(substrate tie)或两者兼有。当工艺库中大多数或所有标准单元都不含衬底或阱接触时,通常会使用它们。Tap cell 有助于固定 VDD 和 GND 电位,从而防止漂移和闩锁效应(latch-up)。
端帽单元(end cap cell)或边界单元(boundary cell)放置在每个布局行的两端,用于终止该行。它们保护边界处的标准单元栅极在制造过程中免受损坏。
Tap cell 在宏单元布局和电源轨创建之后放置。此阶段称为预布局(pre-placement)阶段。Tap cell 在每个布局行中以固定间隔放置。Tap cell 之间的最大距离必须符合该特定工艺库的 DRC 规则。
下图展示了两个 tapcell 插入的示例。当仅给定 -tapcell_master 和 -endcap_master 两种 master 时,tapcell 的布局与图 1 类似。当给定其余 master 时,tapcell 的布局与图 2 类似。
请参阅 GUI 图像以高亮显示阱接触单元和端帽单元。图像本身不做区分,
只显示一堆矩形。

图 1:Tapcell 插入示意 图 2:宏单元周围的 Tapcell 插入示意 |
请参阅以下内置示例,地址在 这里,以了解 Tap/endcap 单元的插入。
要在 OpenROAD GUI 中查看此内容,请在 OpenROAD 工具根目录的终端中
运行以下命令:
cd ../tools/OpenROAD/src/tap/test/
openroad -gui
在 GUI 的 Tcl Commands 区域中:
source gcd_nangate45.tcl
查看生成的 tap cell 插入结果,如下所示:

Tie Cell(逻辑绑定单元)
Tie cell 是一种标准单元,专门用于为任何逻辑门的输入(栅极端)提供高电平或低电平信号。凡是网表中有任何引脚连接到逻辑 0 或逻辑 1(如 .A(1’b0) 或 .IN(1’b1))的地方,就会在那里插入一个 tie cell。
请参阅以下内置示例,地址在 这里,以了解 Tie cell 的插入。
要在 OpenROAD 工具根目录中查看此内容:
cd ../tools/OpenROAD/src/ifp/test/
openroad
在 Tcl Commands 区域中:
source tiecells.tcl
参考以下含有 tie high/low 网络的 Verilog 代码,见这里:
AND2_X1 u2 (.A1(r1q), .A2(1'b0), .ZN(u2z0));
AND2_X1 u3 (.A1(u1z), .A2(1'b1), .ZN(u2z1));
使用以下 insert_tiecells 命令:
insert_tiecells LOGIC0_X1/Z -prefix "TIE_ZERO_"
insert_tiecells LOGIC1_X1/Z
在布图规划阶段,这些网络会根据工艺库转换为 tiecell,如下所示
(这是 Nangate45 特定的示例):
[INFO IFP-0030] Inserted 1 tiecells using LOGIC0_X1/Z.
[INFO IFP-0030] Inserted 1 tiecells using LOGIC1_X1/Z.
宏单元或标准单元布局
宏单元布局
在本节中,您将探索宏单元和标准单元的各种布局选项,并研究其对面积和时序的影响。
请参阅以下内置示例,地址在 这里,以了解宏单元布局。
布局密度影响标准单元在内核区域中的分散程度。要在 OpenROAD GUI
中查看此内容,请在 OpenROAD 工具根目录的终端中运行以下命令:
cd ../tools/OpenROAD/src/gpl/test/
openroad -gui
在 GUI 的 Tcl Commands 区域中:
source macro01.tcl
读取生成的宏单元布局结果,并查看完整的内核视图:

| 图 1:密度为 0.7 | 图 2:宏单元和标准单元布局的放大视图 |
在 GUI 的 Tcl Commands 区域中运行以下命令,降低布局密度并观察
对布局的影响:
global_placement -density 0.6
读取生成的宏单元布局结果,并查看完整的内核视图:

图 1:密度为 0.6 图 2:宏单元和标准单元布局的放大视图 |
带光环(Halo)间距的宏单元布局
探索带光环间距的宏单元布局,请参阅 这里 的示例。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 GUI:
cd ../tools/OpenROAD/src/mpl/test
openroad -gui
在 GUI 的 Tcl Commands 区域中:
source helpers.tcl
source level3.tcl
global_placement
无光环间距的 DEF 文件:

现在增大光环宽度,以获得更好的布线资源。
在 GUI 的 Tcl Commands 区域中:
macro_placement -halo {0.5 0.5}
重叠的宏单元被放置在宏单元周围 0.5 微米的水平/垂直光环区域内。

定义布局密度
要了解 ibex 设计的布局密度策略,请进入 OpenROAD-flow-scripts/flow 目录。输入:
openroad -gui
在 GUI 的 Tcl Commands 区域中输入以下命令:
read_lef ./platforms/sky130hd/lef/sky130_fd_sc_hd.tlef
read_lef ./platforms/sky130hd/lef/sky130_fd_sc_hd_merged.lef
read_def ./results/sky130hd/ibex/base/3_place.def

如下所示,修改 ibex 设计 config.mk 中的 CORE_UTILIZATION 和 PLACE_DENSITY。
在这里 查看 ibex 设计的 config.mk。
export CORE_UTILIZATION = 40
export PLACE_DENSITY_LB_ADDON = 0.1
使用以下命令重新运行 ibex 设计:
make DESIGN_CONFIG=./designs/sky130hd/ibex/config.mk
查看 ibex 设计的布局密度热力图,如下所示:

从以上可以看出,在 GUI 中可以看到:将 CORE_UTILIZATION 从 20 改为 40,并将布局密度从默认的 0.60 改为 0.50 后,标准单元的布局变得更加分散。
时序优化
使用 repair_design 进行时序优化
repair_design 命令在网络上插入缓冲器,以修复 max slew (最大转换速率)、max capacitance(最大电容)和 max fanout (最大扇出) 违例,并在长导线上插入缓冲器以减小 RC 延迟。
它还会调整门的大小,以使转换速率正常化。在 repair_design 之前使用 estimate_parasitics -placement,以计入布局后寄生参数的估计值。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 GUI:
cd ../tools/OpenROAD/src/rsz/test/
openroad -gui
将以下命令复制粘贴到 GUI 的 Tcl Commands 区域中。
source "helpers.tcl"
source "hi_fanout.tcl"
read_liberty Nangate45/Nangate45_typ.lib
read_lef Nangate45/Nangate45.lef
set def_file [make_result_file "repair_slew1.def"]
write_hi_fanout_def $def_file 30
read_def $def_file
create_clock -period 1 clk1
set_wire_rc -layer metal3
estimate_parasitics -placement
set_max_transition .05 [current_design]
puts "Found [sta::max_slew_violation_count] violations"
违例数量的日志如下:
Found 31 violations
这些违例通过以下命令修复:
repair_design
日志如下:
[INFO RSZ-0058] Using max wire length 853um.
[INFO RSZ-0039] Resized 1 instance.
再次查看违例数量:
puts "Found [sta::max_slew_violation_count] violations"
日志如下:
Found 0 violations
repair_design 修复了全部 31 个违例。
使用 repair_timing 进行时序优化
repair_timing 命令用于修复建立时间(setup)和保持时间(hold)违例。它在时钟树综合之后、使用时钟传播(propagated clocks)运行。
在修复保持时间违例时,不会插入缓冲器,因为这可能会导致建立时间
违例——除非指定了 ‘-allow_setup_violations’。使用 -slack_margin
可以添加额外的裕量余量。
基于多工艺角(Corner)的时序优化
OpenROAD 支持多工艺角分析,以计算最坏情况下的建立时间和保持时间违例。
建立时间优化基于慢工艺角(slow corner),即当发射时钟晚于数据时钟到达的最坏情况。
保持时间优化基于快工艺角(fast corner),即当发射时钟早于捕获时钟到达的最坏情况。
请参阅以下关于在快、慢工艺角下对 gcd 设计进行 repair_timing 的示例。
内置示例请参阅 这里。
在终端中运行以下命令:
cd ../../test/
openroad
source gcd_sky130hd_fast_slow.tcl
得到的 worst slack(最差裕量)、TNS(总负裕量):
report_worst_slack -min -digits 3
report_worst_slack -max -digits 3
report_tns -digits 3
worst slack 0.321
worst slack -16.005
tns -529.496
修复建立时间违例
要修复建立时间路径违例,请使用 repair_timing -setup。
请参阅以下内置示例,了解更多关于修复建立时间违例的内容。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,以交互模式启动
OpenROAD:
cd ../tools/OpenROAD/src/rsz/test/
openroad
复制并粘贴以下 Tcl 命令。
define_corners fast slow
read_liberty -corner slow Nangate45/Nangate45_slow.lib
read_liberty -corner fast Nangate45/Nangate45_fast.lib
read_lef Nangate45/Nangate45.lef
read_def repair_setup1.def
create_clock -period 0.3 clk
set_wire_rc -layer metal3
estimate_parasitics -placement
report_checks -fields input -digits 3
查看生成的带有裕量违例的时序报告。
Startpoint: r1 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r2 (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: max
Corner: slow
Delay Time Description
-----------------------------------------------------------
0.000 0.000 clock clk (rise edge)
0.000 0.000 clock network delay (ideal)
0.000 0.000 ^ r1/CK (DFF_X1)
0.835 0.835 ^ r1/Q (DFF_X1)
0.001 0.836 ^ u1/A (BUF_X1)
0.196 1.032 ^ u1/Z (BUF_X1)
0.001 1.033 ^ u2/A (BUF_X1)
0.121 1.154 ^ u2/Z (BUF_X1)
0.001 1.155 ^ u3/A (BUF_X1)
0.118 1.273 ^ u3/Z (BUF_X1)
0.001 1.275 ^ u4/A (BUF_X1)
0.118 1.393 ^ u4/Z (BUF_X1)
0.001 1.394 ^ u5/A (BUF_X1)
0.367 1.761 ^ u5/Z (BUF_X1)
0.048 1.809 ^ r2/D (DFF_X1)
1.809 data arrival time
0.300 0.300 clock clk (rise edge)
0.000 0.300 clock network delay (ideal)
0.000 0.300 clock reconvergence pessimism
0.300 ^ r2/CK (DFF_X1)
-0.155 0.145 library setup time
0.145 data required time
-----------------------------------------------------------
0.145 data required time
-1.809 data arrival time
-----------------------------------------------------------
-1.664 slack (VIOLATED)
使用以下命令修复建立时间违例:
repair_timing -setup
日志如下:
[INFO RSZ-0040] Inserted 4 buffers.
[INFO RSZ-0041] Resized 16 instances.
[WARNING RSZ-0062] Unable to repair all setup violations.
通过将时钟周期增大到 0.9 来降低时钟频率,并重新运行 repair_timing 以修复建立时间违例警告。此类时序违例会由 resizer 在 post CTS(CTS 之后)和 global routing(全局布线)阶段自动修复。
create_clock -period 0.9 clk
repair_timing -setup
要查看时序修复后的时序日志,输入:
report_checks -fields input -digits 3
日志如下:
Startpoint: r1 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r2 (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: max
Corner: slow
Delay Time Description
-----------------------------------------------------------
0.000 0.000 clock clk (rise edge)
0.000 0.000 clock network delay (ideal)
0.000 0.000 ^ r1/CK (DFF_X1)
0.264 0.264 v r1/Q (DFF_X1)
0.002 0.266 v u1/A (BUF_X4)
0.090 0.356 v u1/Z (BUF_X4)
0.003 0.359 v u2/A (BUF_X8)
0.076 0.435 v u2/Z (BUF_X8)
0.003 0.438 v u3/A (BUF_X8)
0.074 0.512 v u3/Z (BUF_X8)
0.003 0.515 v u4/A (BUF_X8)
0.077 0.592 v u4/Z (BUF_X8)
0.005 0.597 v u5/A (BUF_X16)
0.077 0.674 v u5/Z (BUF_X16)
0.036 0.710 v r2/D (DFF_X1)
0.710 data arrival time
0.900 0.900 clock clk (rise edge)
0.000 0.900 clock network delay (ideal)
0.000 0.900 clock reconvergence pessimism
0.900 ^ r2/CK (DFF_X1)
-0.172 0.728 library setup time
0.728 data required time
-----------------------------------------------------------
0.728 data required time
-0.710 data arrival time
-----------------------------------------------------------
0.019 slack (MET)
修复保持时间违例
要修复设计的保持时间违例,使用命令 repair_timing -hold。
请参阅 这里 的示例,了解更多关于修复保持时间违例的内容。
使用以下 Tcl 命令检查全局布线后的保持时间违例。在 OpenROAD 工具
根目录的终端中运行以下步骤:
cd ../tools/OpenROAD/src/rsz/test/
openroad -gui
将以下命令复制粘贴到 GUI 的 Tcl Commands 区域中。
source helpers.tcl
read_liberty sky130hd/sky130hd_tt.lib
read_lef sky130hd/sky130hd.tlef
read_lef sky130hd/sky130hd_std_cell.lef
read_def repair_hold10.def
create_clock -period 2 clk
set_propagated_clock clk
set_wire_rc -resistance 0.0001 -capacitance 0.00001
set_routing_layers -signal met1-met5
global_route
estimate_parasitics -global_routing
report_worst_slack -min
得到的最差裕量如下:
worst slack -1.95
上述最差裕量通过以下命令修复:
repair_timing -hold
日志如下:
[INFO RSZ-0046] Found 2 endpoints with hold violations.
[INFO RSZ-0032] Inserted 5 hold buffers.
在 repair_timing 之后重新检查裕量值。输入:
report_worst_slack -min
得到的最差裕量值如下:
worst slack 0.16
注意,此时最差裕量已满足要求,保持时间违例已由 resizer 修复。
时钟树综合
执行时钟树综合使用 clock_tree_synthesis 流程命令。
OpenROAD-flow-scripts 会在布局后自动生成一棵良好平衡的时钟树。
在本节中,您将学习有关构建时钟树的详细信息,并对其进行可视化。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 OpenROAD GUI:
cd ../tools/OpenROAD/src/cts/test/
openroad -gui
要构建时钟树,在 GUI 的 Tcl Commands 区域中运行以下命令:
read_lef Nangate45/Nangate45.lef
read_liberty Nangate45/Nangate45_typ.lib
read_def "16sinks.def"
create_clock -period 5 clk
set_wire_rc -clock -layer metal3
clock_tree_synthesis -root_buf CLKBUF_X3 \
-buf_list CLKBUF_X3 \
-wire_unit 20
CTS 之前的布局视图如下:

CTS 之后的布局视图可通过 Update 选项查看。

在这里,我们探索如何插入时钟树缓冲器以平衡时钟树结构。
内置示例请参阅 这里。
首先生成一棵不平衡的时钟树,然后探索如何创建一棵良好平衡的时钟树。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 OpenROAD GUI:
cd ../tools/OpenROAD/src/cts/test/
openroad -gui
在 GUI 的 TCL commands 区域中使用以下命令:
source "helpers.tcl"
source "cts-helpers.tcl"
read_liberty Nangate45/Nangate45_typ.lib
read_lef Nangate45/Nangate45.lef
set block [make_array 300 200000 200000 150]
sta::db_network_defined
create_clock -period 5 clk
set_wire_rc -clock -layer metal5
不平衡模式下的时钟树结构如下所示。

使用 clock_tree_synthesis 命令,通过缓冲器来平衡此时钟树结构。
格式如下所示。
clock_tree_synthesis -root_buf CLKBUF_X3 \
-buf_list CLKBUF_X3 \
-wire_unit 20 \
-post_cts_disable \
-sink_clustering_enable \
-distance_between_buffers 100 \
-sink_clustering_size 10 \
-sink_clustering_max_diameter 60 \
-balance_levels \
-num_static_layers 1
要查看 CTS 之后平衡的时钟树,在 GUI 工具栏中选择 Clock Tree Viewer 并点击 Update,即可在 GUI 中查看生成的时钟树,如下所示:

报告时钟偏移(Clock Skew)
OpenROAD-flow-scripts 流程会自动修复任何可能在下游时序路径中导致保持时间违例的时钟偏移问题。
report_clock_skew
对于 ibex 设计,请参阅以下日志以查看时钟偏移报告。
less logs/sky130hd/ibex/base/4_1_cts.log
cts pre-repair report_clock_skew
--------------------------------------------------------------------------
Clock core_clock
Latency CRPR Skew
_28453_/CLK ^
5.92
_29312_/CLK ^
1.41 0.00 4.51
cts post-repair report_clock_skew
--------------------------------------------------------------------------
Clock core_clock
Latency CRPR Skew
_28453_/CLK ^
5.92
_29312_/CLK ^
1.41 0.00 4.51
cts final report_clock_skew
--------------------------------------------------------------------------
Clock core_clock
Latency CRPR Skew
_27810_/CLK ^
5.97
_29266_/CLK ^
1.41 0.00 4.56
报告 CTS 指标
运行 report_cts 命令可查看有用的指标,例如时钟根的数量、插入的
缓冲器数量、时钟子网数量以及接收端(sink)数量。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行这些 Tcl 命令:
cd ../tools/OpenROAD/src/cts/test/
openroad
source post_cts_opt.tcl
report_cts
当前设计的 CTS 指标如下所示。
[INFO CTS-0003] Total number of Clock Roots: 1.
[INFO CTS-0004] Total number of Buffers Inserted: 35.
[INFO CTS-0005] Total number of Clock Subnets: 35.
[INFO CTS-0006] Total number of Sinks: 301.
添加填充单元(Filler Cell)
填充单元用于填充详细布局后各实例之间的空隙,以连接各行中的电源和接地轨。填充单元没有逻辑连接。这些单元为行内的 VDD 和 VSS 网络提供连续性,还包含衬底 n 阱(nwell)连接,以改善衬底偏置。
filler_masters 是用于填充空隙的 master/宏单元名称列表。
请参阅以下内置示例,地址在 这里,以了解填充单元的插入。
要在 OpenROAD GUI 中查看此内容,请在 OpenROAD 工具根目录的终端中
运行以下命令:
cd ../tools/OpenROAD/src/grt/test/
openroad -gui
在 GUI 的 Tcl Commands 区域中运行以下命令:
source "helpers.tcl"
read_lef "Nangate45/Nangate45.lef"
read_def "gcd.def"
未插入填充单元时加载的 DEF 视图:

运行以下命令进行填充单元插入:
set filler_master [list FILLCELL_X1 FILLCELL_X2 FILLCELL_X4 FILLCELL_X8 FILLCELL_X16]
filler_placement $filler_master
查看生成的填充单元插入结果,如下所示:

填充单元可用 remove_fillers 命令移除。
全局布线(Global Routing)
全局布线器分析可用的布线资源,并自动分配这些资源,以避免任何水平/垂直(H/V)溢出违例,从而实现最优布线。它会为 GCell 生成一份拥塞报告,显示总资源、需求、利用率、位置以及 H/V 违例状态。如果没有报告违例,设计即可进入详细布线阶段。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 OpenROAD GUI:
cd ../tools/OpenROAD/src/grt/test/
openroad -gui
要运行全局布线,在 GUI 的 Tcl Commands 区域中运行以下命令:
source gcd.tcl
布线资源和拥塞分析结果如下日志所示:
[INFO GRT-0096] Final congestion report:
Layer Resource Demand Usage (%) Max H / Max V / Total Overflow
---------------------------------------------------------------------------------------
metal1 31235 1651 5.29% 0 / 0 / 0
metal2 24628 1652 6.71% 0 / 0 / 0
metal3 33120 40 0.12% 0 / 0 / 0
metal4 15698 0 0.00% 0 / 0 / 0
metal5 15404 0 0.00% 0 / 0 / 0
metal6 15642 0 0.00% 0 / 0 / 0
metal7 4416 0 0.00% 0 / 0 / 0
metal8 4512 0 0.00% 0 / 0 / 0
metal9 2208 0 0.00% 0 / 0 / 0
metal10 2256 0 0.00% 0 / 0 / 0
---------------------------------------------------------------------------------------
Total 149119 3343 2.24% 0 / 0 / 0
[INFO GRT-0018] Total wirelength: 10598 um
[INFO GRT-0014] Routed nets: 563
在 GUI 中查看生成的全局布线结果,如下所示:

详细布线(Detail Routing)
TritonRoute 是一个面向现代工业级设计的开源详细布线器。该布线器由若干主要构建模块组成,包括引脚接入分析(pin access analysis)、轨道分配(track assignment)、初始详细布线、搜索与修复(search and repair)以及 DRC 引擎。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 OpenROAD GUI:
cd ../tools/OpenROAD/src/drt/test/
openroad -gui
要运行详细布线,在 GUI 的 Tcl Commands 区域中运行以下命令:
read_lef Nangate45/Nangate45_tech.lef
read_lef Nangate45/Nangate45_stdcell.lef
read_def gcd_nangate45_preroute.def
read_guides gcd_nangate45.route_guide
set_thread_count [expr [exec getconf _NPROCESSORS_ONLN] / 4]
detailed_route -output_drc results/gcd_nangate45.output.drc.rpt \
-output_maze results/gcd_nangate45.output.maze.log \
-verbose 1
write_db gcd_nangate45.odb
布线成功时,DRT 将以 0 个违例结束。
日志如下:
[INFO DRT-0199] Number of violations = 0.
[INFO DRT-0267] cpu time = 00:00:00, elapsed time = 00:00:00, memory = 674.22 (MB), peak = 686.08 (MB)
Total wire length = 5680 um.
Total wire length on LAYER metal1 = 19 um.
Total wire length on LAYER metal2 = 2798 um.
Total wire length on LAYER metal3 = 2614 um.
Total wire length on LAYER metal4 = 116 um.
Total wire length on LAYER metal5 = 63 um.
Total wire length on LAYER metal6 = 36 um.
Total wire length on LAYER metal7 = 32 um.
Total wire length on LAYER metal8 = 0 um.
Total wire length on LAYER metal9 = 0 um.
Total wire length on LAYER metal10 = 0 um.
Total number of vias = 2223.
Up-via summary (total 2223):.
---------------
active 0
metal1 1151
metal2 1037
metal3 22
metal4 7
metal5 4
metal6 2
metal7 0
metal8 0
metal9 0
---------------
2223
[INFO DRT-0198] Complete detail routing.
在 GUI 中查看生成的详细布线结果,如下所示:

天线检查器(Antenna Checker)
当天线比率超过工艺设计套件(PDK)中指定的值时,就会发生天线违例。天线比率是栅极面积与栅氧面积的比率。电荷收集量由导体(栅极)的面积/尺寸决定。
该工具检查天线违例并生成报告,以指示存在违例的网络。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 OpenROAD:
cd ../tools/OpenROAD/src/ant/test/
openroad
要提取天线违例,运行以下命令:
read_lef ant_check.lef
read_def ant_check.def
check_antennas -verbose
puts "violation count = [ant::antenna_violation_count]"
# 检查 net50 是否存在违例
set net "net50"
puts "Net $net violations: [ant::check_net_violation $net]"
日志如下:
[INFO ANT-0002] Found 1 net violations.
[INFO ANT-0001] Found 2 pin violations.
violation count = 1
Net net50 violations: 1
金属填充(Metal Fill)
在先进工艺节点中,金属填充是确保可制造性和高良率的必需步骤。它涉及用金属多边形填充设计附近的空白区域,以确保晶圆的规则平坦化。
该模块插入悬空(floating)的金属填充图形,以满足金属密度设计规则,同时遵守 DRC 约束。它由一个 json 配置文件驱动。
使用的命令如下:
density_fill -rules <json_file> [-area <list of lx ly ux uy>]
如果未指定 -area,则将使用内核区域。
要在布线后运行金属填充,请运行以下命令:
cd flow/tutorials/scripts/metal_fill
openroad -gui
在 Tcl Commands 区域中:
source "helpers.tcl"
read_db ./5_route.odb
添加金属填充前的布局如下所示:

要添加金属填充,运行以下命令:
density_fill -rules ../../../platforms/sky130hd/fill.json
添加金属填充后的布局如下所示:

金属填充视图可通过 Misc 选项并勾选 Fills 复选框来启用。
寄生参数提取(Parasitics Extraction)
OpenRCX 是一个基于 OpenDB 设计 API 工作的寄生参数提取(PEX,或 RCX)工具。它基于 LEF/DEF 布局模型对已布线的设计进行提取。
OpenRCX 将电阻、耦合电容和接地电容存储在 OpenDB 对象上,并带有
直接指向相关联的导线和过孔 db 对象的指针。OpenRCX 还可以选择生成 .spef 文件。
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 OpenROAD 工具:
cd ../tools/OpenROAD/src/rcx/test/
openroad
在 Tcl Commands 区域中运行寄生参数提取:
source 45_gcd.tcl
日志如下:
[INFO ODB-0222] Reading LEF file: Nangate45/Nangate45.lef
[INFO ODB-0223] Created 22 technology layers
[INFO ODB-0224] Created 27 technology vias
[INFO ODB-0225] Created 135 library cells
[INFO ODB-0226] Finished LEF file: Nangate45/Nangate45.lef
[INFO ODB-0127] Reading DEF file: 45_gcd.def
[INFO ODB-0128] Design: gcd
[INFO ODB-0130] Created 54 pins.
[INFO ODB-0131] Created 1820 components and 4618 component-terminals.
[INFO ODB-0132] Created 2 special nets and 3640 connections.
[INFO ODB-0133] Created 350 nets and 978 connections.
[INFO ODB-0134] Finished DEF file: 45_gcd.def
[INFO RCX-0431] Defined process_corner X with ext_model_index 0
[INFO RCX-0029] Defined extraction corner X
[INFO RCX-0008] extracting parasitics of gcd ...
[INFO RCX-0435] Reading extraction model file 45_patterns.rules ...
[INFO RCX-0436] RC segment generation gcd (max_merge_res 0.0) ...
[INFO RCX-0040] Final 2656 rc segments
[INFO RCX-0439] Coupling Cap extraction gcd ...
[INFO RCX-0440] Coupling threshhold is 0.1000 fF, coupling capacitance less than 0.1000 fF will be grounded.
[INFO RCX-0043] 1954 wires to be extracted
[INFO RCX-0442] 48% completion -- 954 wires have been extracted
[INFO RCX-0442] 100% completion -- 1954 wires have been extracted
[INFO RCX-0045] Extract 350 nets, 2972 rsegs, 2972 caps, 2876 ccs
[INFO RCX-0015] Finished extracting gcd.
[INFO RCX-0016] Writing SPEF ...
[INFO RCX-0443] 350 nets finished
[INFO RCX-0017] Finished writing SPEF ...
45_gcd.spef 可在 results 目录中查看。
故障排查
本节介绍如何排查流程或任何底层应用程序工具中常见的问题。
调试全局布线中的问题
全局布线器提供了一些有用的功能,用于理解设计中的高拥塞问题。
无论设计是否存在拥塞,都可以对任何设计使用拥塞热力图。有关查看拥塞的说明见这里。
如果设计存在拥塞问题,流程将以如下错误结束:
[ERROR GRT-0118] Routing congestion too high.
内置示例请参阅 这里。
在 OpenROAD 工具根目录的终端中运行以下命令,启动 OpenROAD GUI:
cd ../tools/OpenROAD/src/grt/test/
openroad -gui
要运行全局布线,在 GUI 的 Tcl Commands 区域中运行以下命令:
source congestion5.tcl
设计将因布线拥塞错误而失败,如下所示:

在 GUI 中,您可以进入 Heat Maps 并勾选 Routing Congestion 复选框,以可视化拥塞图。

将拥塞信息导出到文本文件
您可以创建一个包含 GCell 拥塞信息的文本文件,以便在 GUI 中进一步调查。为此,请在 global_route 命令中添加 -congestion_report_file file_name,如下所示:
global_route -guide_file out.guide -congestion_report_file congest.rpt
将溢出的 GCell 可视化为标记
使用上述命令创建的文件,您可以查看有关拥塞 GCell 的更多详细信息,例如总资源、利用率、位置等。您可以按照以下步骤加载该文件:
-
第 1 步:在
DRC Viewer窗口中,点击Load并选择包含拥塞报告的文件。 -
第 2 步:存在拥塞的 GCell 摘要会显示在
DRC Viewer窗口中。同时,标记(marker)会被添加到 GUI 中。

-
第 3 步:有关布线资源信息的详情,请使用
Inspector(检查器)窗口。

点击 zoom_to 选项,您可以放大视图,如下所示:


343

被折叠的 条评论
为什么被折叠?



