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
注意: 不要用 CentOS 或 RHEL 7,OpenROAD 的依赖在这些老系统上很难凑齐。我曾经在 CentOS 7 上折腾了两天,最后还是换回了 Ubuntu。

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 核心。我第一次编译时没加这个参数,等了快一个小时……后来才发现是自己傻。

小技巧: 编译过程中如果报错,先检查网络连接。很多依赖是从 GitHub 拉取的,国内用户可能需要配置代理或镜像。

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 流程包含以下步骤:

  1. 综合(Synthesis):将 RTL 代码映射到标准单元库
  2. 布局规划(Floorplan):确定芯片的尺寸和宏单元位置
  3. 布局(Placement):将标准单元放置在芯片上
  4. 时钟树综合(CTS):构建时钟网络
  5. 布线(Routing):连接所有单元
  6. 签核(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
核心要点: OpenROAD 的命令都是 Tcl 过程,你可以用 help 命令查看每个命令的详细用法。比如 help place 会列出 place 命令的所有参数。

2.6 本章知识体系

下面这张图总结了本章的核心内容,从环境搭建到流程运行,再到命令操作,你可以对照着检查自己掌握了多少。

第2章知识体系图 第2章:环境搭建与流程初探 环境搭建 RTL-to-GDS 流程 命令行操作 系统要求 依赖安装 源码编译 综合 布局规划 布局 CTS 布线 交互模式 脚本模式 常用命令 💡 学习路径建议 先装好环境 → 跑通完整流程 → 理解每个步骤的作用 → 掌握常用命令 遇到问题先看日志,日志里通常有明确的错误提示

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 工具的学习没有捷径,多跑几个设计,多看看日志,慢慢就熟练了。