DeepDataFlow
Earlgrey in G2:用开源工具和 AI 助手跑百万单元 SoC · 第 6 篇,共 6 篇

一台笔记本,一次 22 GB

用开源工具做一颗百万单元的芯片要花多少内存和运行时间、为什么决定能跑什么的是内存而不是 CPU,以及更多机器在哪里有帮助、在哪里没有。

发布日期 2026-10-22 · 第 6 篇,共 6 篇 · DeepDataFlow

芯片的布局布线是在一台笔记本上跑的:Intel Core Ultra 7 155H,22 个线程、30 GB 内存。另外三台小机器在 Slurm 上分担了一些比较轻的任务。最后这一篇讲这在实际上代表什么:我们设定的限制、时间花在哪里、绕线阶段试了二十次才走完,以及有更多硬件时我们会改什么。

限制

三个限制在整个项目里一直有效:

  • 一次一个 EDA 任务。 两个 20 GB 的任务塞不进 30 GB。
  • 每个任务 10 个线程, 在每个工具里明确设定。
  • 每个任务 22 GB 内存上限,并关掉 swap。 每个任务都在 systemd-run --user --scope -p MemoryMax=22G -p MemorySwapMax=0 下运行。超过上限的任务会很快以清楚的内存不足错误结束,而不是让笔记本 swap 到动弹不得。芯片绕线时我们把上限调高到 26 GB,那也是在工程师同意之后。

在 Slurm 上,--mem 只影响调度,并不会真正限制。小节点最多只有大约 15 GB,低于芯片和 otbn 任务需要的 20 GB 以上。所以我们按任务预期的内存峰值来挑节点,大任务都留在笔记本上。

时间花在哪里

芯片 v5 的各个阶段,数据来自每次运行的 GNU time 日志。「使用核数」是 CPU 时间除以实际时间:平均有几个线程(总共 10 个)在忙。

阶段实际时间使用核数内存峰值
init4 分钟1.24.4 GB
floorplan8 分钟1.05.1 GB
place2 小时 51 分钟1.615.8 GB
CTS6 分钟1.59.7 GB
post-CTS 修复34 分钟2.817.5 GB
route26 小时 12 分钟8.922.4 GB
post-route12 分钟1.320.1 GB
finish(轻量)8 分钟0.36.1 GB
寄生提取(OpenRCX,4 个 corner)30 分钟0.83.7 GB
签核 STA(OpenSTA,每个 corner)3 分钟2.25.9 GB

有两个明显的模式:

  • 布局和它的修复大部分只用一个核。 芯片的布局平均只用了 1.6 个核;扁平芯片 24.7 小时的布局里,有 22.5 小时是单线程的 repair_design(第 2 篇)。在那里,更多的核也帮不上忙。帮上忙的是层次化。
  • 详细绕线用满所有线程,也用掉最多内存。 它是唯一让 10 个线程里大约 9 个一直在忙的步骤,内存峰值也由它决定。最大的模块也是一样:otbn 的绕线花了 6 小时,用了 9.4 个核、19.5 GB。

相比之下,签核很便宜。只要文件已经有了,寄生提取半小时,一次时序分析几分钟,所以修正之后重跑签核很容易。

试了二十次,大部分是内存

布局之后,芯片 v5 试了二十次才走完最后五个阶段。大部分失败都是碰到上限的内存不足,而不是崩溃或结果错误:

每个阶段试了几次,以及每次是什么让它停下来。
每个阶段试了几次,以及每次是什么让它停下来。

几个重点:

  • 少了一个线模型,让 CTS 复制出 106,806 个时钟门控。修正只是一行 set_wire_rc。
  • 全局绕线的峰值是 25.8 GB,上限是 26 GB。
  • 绕线后处理里的一次设计规则检查,在全局绕线还加载着的时候,占了 18 GB 的数据。
  • 热图、天线修复,以及 finish 阶段的填充单元加上时序报告,每一项都曾让一次运行超过上限。
  • 有一次工程师需要把笔记本拿回来用,所以绕线在第一轮里暂停,之后从保存的全局绕线结果继续。

每一次失败都永久改变了流程:

  • 全局绕线和详细绕线分成两个进程,中间保存全局绕线的结果。
  • 芯片不画热图。
  • 在报告之前先存 checkpoint, 报告内存不足时就不会丢掉结果。
  • 轻量的 finish,不放填充单元;绕线后处理不做完整的设计规则检查。
  • 演示时关掉天线修复,记成遗留问题。

这些都不稀奇。但它们加在一起,决定了一个百万单元的顶层到底能不能在 30 GB 的机器上跑起来。

2:08

在 YouTube 观看(英文) ↗在 Bilibili 观看(中文) ↗

总数

345+ CPU 小时97 次有计时的运行,10 月 10 日到 19 日(这是下限)
270 h + 63 h芯片和 otbn;另外八个模块加起来不到 15 h
22.4 GB所有运行里最高的峰值:芯片的详细绕线

这个总数是下限。计时日志从 10 月 12 日才开始有,而且每个阶段只保留最后一次运行,所以扁平芯片 24.7 小时的布局、大部分早期的模块运行,以及每一次失败的尝试都不在里面。

每个模块的 CPU 小时,来自 GNU time 日志。几乎全部是芯片和 otbn。
每个模块的 CPU 小时,来自 GNU time 日志。几乎全部是芯片和 otbn。

什么时候更多机器有帮助,什么时候没有

更多内存能省下最多时间。 二十次尝试里大部分是内存问题,不是速度问题。一台 64 GB 的机器能避开大部分失败,也就不需要拆进程、协商上限。

更多机器对彼此独立的任务有帮助:

  • 九个模块一个接一个,布局布线花了大约 20 小时。在内存够的机器上,它们可以并行。i2c、aes 和 kmac 这类小模块放得进 15 GB 的节点;otbn 的绕线(19.5 GB)和一些 finish 阶段(大约 22 GB)放不进去。
  • 四次第二级 floorplan 检查(第 3 篇)每次大约一小时,峰值接近 20 GB。有四个够大的节点,就只要一小时,而不是四小时。
  • 探测和签核运行都很小,放在哪里都行。拥挤度探测在一个 Slurm 节点上只跑了 15 秒。

更多机器缩短不了一次长时间的运行。 26 小时的详细绕线是一台机器上的一个进程,已经用了大约 9 个核。布局大部分是串行的。缩短它们的是设计:层次化让布局从 24.7 小时变成 2.8 小时,而更好的 floorplan(修好 kmac 通道)才能缩短绕线。

一个画面看完这个系列

这个系列展示的所有东西:

24.7 h → 2.8 h芯片布局,扁平 vs 层次化
9 个模块、11 个实例硬化后作为 IP 复用
1.22M → 34.6K顶层全局绕线溢出,靠数据降下来
26 h,剩 15,056芯片的详细绕线,遗留问题都记下来
2 个 bug 提交上游没有寄生参数的时钟 buffer 从 24,531 降到 8
VDD 断开事后由我们自己的检查发现
101 个决定每个都附上原因,七天之内
1 台笔记本22 个线程、30 GB,一次一个任务
1:38

在 YouTube 观看(英文) ↗在 Bilibili 观看(中文) ↗

仍然不是流片

如同我们一路上说的:上面几层金属是替代的 10 层金属堆叠,存储器是 FakeRAM 模型,时钟是 10 MHz 的演示目标,芯片也还有遗留问题。这些遗留问题是 15,056 个绕线违例、没有时序例外的 IO 路径、没有 hold 报告,以及 pad 环上断开的 VDD 连接。芯片 v5 还混用了两个 OpenROAD 版本和一个修补过的数据库。

下一个芯片版本 v6 会补上这些缺口:

  1. 电源网络连到 pad 的金属层,VDD 和 VSS 都检查。
  2. 重做 kmac 通道,并在绕线前用最差窗口规则检查。
  3. IO 路径的时序例外。
  4. 签核里的 hold 报告。
  5. 整次运行只用一个 OpenROAD 版本,不打补丁。

去哪里找

开源工具可以把一颗百万单元的 SoC 从 RTL 做到签核时序。有一个记录一切的流程管理器、一个在它的规则里工作的助手,以及一位做决定的工程师,这就是一个能跑、能讲清楚、也能在一台笔记本上重复的项目。