2. 环境搭建与流程初探:在 Linux 环境下编译安装 OpenROAD,运行第一个 RTL-to-GDS 流程,理解基本命令行操作
好,咱们正式开始动手了。这一章的目标很明确——把 OpenROAD 装起来,跑通一个完整的 RTL-to-GDS 流程。我见过不少新手卡在环境搭建这一步,其实说白了就是几个依赖没装对、版本没选好。别急,跟着我来,一步步走通。
2.1 环境准备:你需要什么?
OpenROAD 官方推荐 Ubuntu 20.04 或 22.04 LTS。我个人习惯用 22.04,包更全一些。硬件方面,建议至少 4 核 CPU、8GB 内存,跑小设计够用了。如果你用虚拟机,记得给足资源。
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 | Ubuntu 22.04 LTS |
| CPU 核心 | 2 核 | 8 核以上 |
| 内存 | 4 GB | 16 GB |
| 磁盘空间 | 10 GB | 50 GB(含 PDK) |
| Python 版本 | 3.8 | 3.10 |
2.2 编译安装 OpenROAD
OpenROAD 提供了两种安装方式:预编译二进制和源码编译。我建议你走源码编译,虽然慢一点,但能保证和你的系统完全匹配。而且出了问题你也知道去哪找。
2.2.1 安装依赖
先把基础工具链装好:
sudo apt update
sudo apt install -y build-essential cmake clang llvm bison flex \
libreadline-dev gawk tcl-dev libffi-dev git \
graphviz xdot pkg-config python3 python3-pip \
libboost-all-dev libeigen3-dev libspdlog-dev
嗯,这里要注意,libboost-all-dev 包比较大,下载时间可能长一些。我建议你找个网络好的时段操作。
2.2.2 克隆源码并编译
git clone --recursive https://github.com/The-OpenROAD-Project/OpenROAD.git
cd OpenROAD
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
-j$(nproc) 参数会让编译并行进行,充分利用你的 CPU 核心。我第一次编译时没加这个参数,等了快一个小时……后来才发现是自己傻。
2.2.3 验证安装
装完后,运行一下看看:
openroad -version
如果看到类似 OpenROAD 2.0-xxxx 的输出,说明安装成功了。我习惯再跑一个简单的 Tcl 脚本确认一下:
openroad -no_init -exit
这条命令会启动 OpenROAD 然后立即退出,不报错就说明基本环境没问题。
2.3 获取 PDK 与设计文件
OpenROAD 本身不包含工艺库,你需要单独下载 PDK。我推荐用 SkyWater 130nm 开源 PDK,它和 OpenROAD 配合得最好。
git clone https://github.com/The-OpenROAD-Project/sky130hd.git
cd sky130hd
make
这个过程会下载并安装 SkyWater 130nm 的库文件。注意,PDK 文件很大,大概 2-3GB,耐心等待。
同时,你还需要一个设计文件。OpenROAD 官方提供了几个示例设计,比如 gcd(最大公约数计算器),很适合入门:
git clone https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts.git
cd OpenROAD-flow-scripts/flow/designs/sky130hd/gcd
2.4 运行第一个 RTL-to-GDS 流程
好,现在万事俱备,我们来跑第一个流程。OpenROAD 的流程是通过 Tcl 脚本控制的,每个步骤对应一个命令。
2.4.1 流程概览
一个标准的 RTL-to-GDS 流程包含以下步骤:
- 综合(Synthesis):将 RTL 代码映射到标准单元库
- 布局规划(Floorplan):确定芯片的尺寸和宏单元位置
- 布局(Placement):将标准单元放置在芯片上
- 时钟树综合(CTS):构建时钟网络
- 布线(Routing):连接所有单元
- 签核(Signoff):检查时序、功耗、DRC 等
你想想看,这就像盖房子——先画图纸(综合),然后打地基(布局规划),接着砌墙(布局),再铺水电(CTS),最后装修(布线)。
2.4.2 运行流程
进入示例设计目录,直接运行:
cd OpenROAD-flow-scripts/flow
make DESIGN_CONFIG=./designs/sky130hd/gcd/config.mk
这条命令会启动整个流程。第一次运行会比较慢,因为要下载一些额外的库文件。我的机器上大概需要 10-15 分钟。
如果你想分步执行,可以这样:
make synth # 综合
make floorplan # 布局规划
make place # 布局
make cts # 时钟树综合
make route # 布线
make finish # 签核
分步执行的好处是,你可以在每一步之后查看中间结果,方便调试。
2.4.3 查看结果
流程完成后,结果文件会保存在 results/sky130hd/gcd/ 目录下。最重要的文件是:
6_final.gds:最终的 GDSII 版图文件6_final.def:设计交换格式文件6_final.spef:寄生参数文件reports/:各种报告,包括时序、面积、功耗等
你可以用 klayout 或 gdsview 打开 GDS 文件看看版图。我第一次看到自己跑出来的版图时,还挺有成就感的。
2.5 理解基本命令行操作
OpenROAD 的核心是一个 Tcl 解释器。你可以在交互模式下输入命令,也可以写脚本批量执行。
2.5.1 交互模式
直接输入 openroad 进入交互模式:
openroad
OpenROAD 2.0
> read_lef /path/to/lef
> read_def /path/to/def
> place
> route
> exit
交互模式适合调试,但正式跑流程还是用脚本更靠谱。
2.5.2 脚本模式
把命令写到一个 Tcl 文件里,然后运行:
openroad -script my_flow.tcl
我习惯把每个步骤拆成单独的脚本,比如 01_synth.tcl、02_floorplan.tcl,这样方便复用和调试。
2.5.3 常用命令速查
| 命令 | 功能 | 示例 |
|---|---|---|
read_lef |
读取 LEF 文件 | read_lef sky130hd.lef |
read_def |
读取 DEF 文件 | read_def gcd.def |
read_verilog |
读取 Verilog 网表 | read_verilog gcd.v |
synth |
运行综合 | synth -top gcd |
floorplan |
运行布局规划 | floorplan -s 0.5 0.5 0.5 0.5 |
place |
运行布局 | place |
clock_tree_synthesis |
运行时钟树综合 | clock_tree_synthesis |
route |
运行布线 | route |
write_gds |
输出 GDS 文件 | write_gds output.gds |
help 命令查看每个命令的详细用法。比如 help place 会列出 place 命令的所有参数。
2.6 本章知识体系
下面这张图总结了本章的核心内容,从环境搭建到流程运行,再到命令操作,你可以对照着检查自己掌握了多少。
2.7 常见问题与避坑指南
跑流程时难免遇到问题,我把自己踩过的坑列出来,你遇到了可以直接对照:
- 编译报错:找不到某个库 —— 先检查
apt源,有些库名字可能不一样。比如libspdlog-dev在 Ubuntu 20.04 上叫libspdlog-dev,但在 18.04 上可能叫libspdlog1-dev。 - 流程卡在综合阶段 —— 通常是 Yosys 版本不兼容。我建议用 OpenROAD 自带的 Yosys,不要自己单独装。
- 布线后 DRC 错误很多 —— 检查 PDK 版本是否匹配。我曾经用错 PDK 版本,结果 DRC 报了上千个错误,后来发现是 LEF 文件版本不对。
- 内存不足导致进程被 kill —— 减少并行线程数,或者换台内存更大的机器。小设计 8GB 够用,大设计建议 32GB 起步。
make clean 或者手动删除 results/ 和 reports/ 目录下的旧文件,避免新旧文件混在一起造成混乱。
好了,环境搭好了,第一个流程也跑通了。你现在应该对 OpenROAD 的基本操作有了直观感受。记住,EDA 工具的学习没有捷径,多跑几个设计,多看看日志,慢慢就熟练了。