2. OpenROAD 流程初探:从 RTL 到 GDSII 的完整流程概览

说实话,很多刚接触 OpenROAD 的朋友,第一反应就是「这么多命令,我该先跑哪个?」。我个人习惯,拿到一个 RTL 设计后,先别急着敲键盘。你心里得有一张地图——从 RTL 到 GDSII,这条路到底怎么走。

OpenROAD 把整个后端流程拆成了几个核心阶段。每个阶段都有明确的目标和产出。今天我们就走一遍,看看每个环节到底在干什么。

核心观点: OpenROAD 流程不是黑盒。理解每一步的输入输出,你才能知道问题出在哪。

2.1 整体流程:一张图看懂

下面这张图,是我自己画的一个简化版流程。每次带新人,我都会先让他们看这个。你想想看,从 RTL 到 GDSII,中间要经过多少道工序?

OpenROAD 从 RTL 到 GDSII 核心流程 RTL 输入 Floorplan Placement CTS Routing GDSII 输出 综合后的网表 + 时序约束 (.sdc) 芯片面积、IO 规划 电源网络 (PDN) 标准单元摆放 优化时序 时钟树综合 时钟 skew 优化 信号线、电源线 DRC/LVS 检查

嗯,流程看起来是线性的。但实际项目中,你经常要往回跳。比如 placement 之后发现时序太差,你可能得回去改 floorplan。这很正常。

2.2 Floorplan:给芯片画地皮

Floorplan 是后端设计的起点。说白了,就是决定芯片多大、IO 放哪、哪些模块挨着哪些模块。

我记得第一次做 floorplan 时,觉得这步很简单——不就是画几个框吗?结果后来 placement 跑不动,才发现是 floorplan 的利用率设得太高了。教训啊。

我的建议: 刚开始做,core utilization 别超过 70%。留点余量给后面的绕线和时钟树。

Floorplan 阶段主要干这几件事:

  • 定义芯片面积:设置 core 的宽高,IO 边界。
  • 摆放 IO pads:根据芯片封装和信号流向,把 IO 放在合适的位置。
  • 放置宏单元:比如 SRAM、PLL 这些大块头,手动摆好位置。
  • 创建电源网络:也就是 PDN(Power Delivery Network),给芯片供电。

在 OpenROAD 里,floorplan 相关的命令主要是 initialize_floorplan 和 pdngen。我习惯先跑一个快速版,看看面积和形状是否合理,再细调。

2.3 Placement:把单元摆上去

Floorplan 定好了,接下来就是把成千上万个标准单元(比如与门、或门、触发器)放到 core 里。这就是 placement。

Placement 有两个阶段:

  1. Global placement:粗略地放,不考虑重叠,只考虑时序和拥塞。
  2. Detailed placement:精细调整,消除单元重叠,对齐到 row 上。

你可能会问:「为什么不分一次搞定?」嗯,因为全局布局要算的东西太多了。先粗后细,效率更高。OpenROAD 里用 global_placement 和 detailed_placement 两个命令。

注意: Placement 之后一定要跑一次快速时序评估。如果 setup 违例太多,别急着往下走。我曾经有一次跳过这步,结果 CTS 之后发现时序完全救不回来,只能重来。

2.4 CTS:让时钟同步

CTS 全称是 Clock Tree Synthesis,时钟树综合。它的目标很简单:让时钟信号同时到达所有触发器。

但实际做起来,一点都不简单。时钟信号要驱动几千上万个触发器,信号延迟和 skew(偏差)必须控制好。

OpenROAD 的 CTS 工具叫 TritonCTS。它会自动插入时钟缓冲器,构建一个树状结构。我常用的命令是 clock_tree_synthesis。

这里有个坑:CTS 之后,时钟网络的延迟会变。原来 placement 阶段算的时序,现在可能不准了。所以 CTS 之后必须重新做时序分析。

2.5 Routing:把线连起来

Routing 是后端流程里最耗时、最容易出问题的一步。它的任务是把所有单元之间的信号用金属线连起来。

Routing 也分两步:

  • Global routing:规划大致的走线路径,分配 routing 资源。
  • Detailed routing:具体到每一条线怎么走,检查 DRC(设计规则检查)。

OpenROAD 里用 global_route 和 detailed_route。我遇到过最头疼的问题,就是 detailed routing 之后 DRC 错误一大堆。后来发现是 global routing 阶段的资源分配不合理。

经验之谈: Routing 之前,先检查一下拥塞情况。如果某个区域太挤,提前回去调整 placement 或 floorplan,比在 routing 阶段硬扛要省时间得多。

2.6 各阶段关键指标对比

为了方便你快速回顾,我把每个阶段的核心目标和常见问题整理成了表格:

阶段 核心目标 关键输出 常见问题
Floorplan 确定芯片面积、IO、宏单元位置 die area, IO constraints, PDN 利用率过高,导致后续拥塞
Placement 摆放标准单元,优化时序 placed netlist, timing reports setup 违例,congestion 区域
CTS 构建时钟树,控制 skew clock tree, skew report skew 过大,时钟缓冲器过多
Routing 完成所有信号连接,满足 DRC routed netlist, GDSII DRC 违例,short,antenna 问题

2.7 一个小建议:先跑通,再优化

很多新手一上来就想把每个步骤调到最优。我的建议是:先跑通一个完整流程,哪怕结果很差。你至少知道整个链条是通的。

我记得第一次用 OpenROAD 跑一个简单的计数器,从 RTL 到 GDSII 花了整整一天。中间各种报错,各种查文档。但跑通之后,后面再优化就有方向了。

嗯,这一章就到这里。流程你心里有数了,后面我们再深入每个步骤的细节和坑。