芯片设计

一段需求,Micius 一路做到GDS 版图

聊聊你的设计流程
行业
芯片设计 · 从 RTL 到 GDS 全流程
场景
数字 IC 设计团队 · RTL 到 GDS
方案
芯片设计
15 轮
一次运行中“报错 → 定位 → 回溯修正 → 重跑”的轮数
+5.39 ns
一次运行的布线后建立时间最差裕量;100 MHz,时钟约束 10 ns 未放松
346 次
一次运行的工具调用;从需求到 GDS 在同一会话里,没有人工输入

从一段需求到一块芯片版图,中间隔着十几道工序,平时靠前端和后端几位工程师接力,交接一次,上下文就要重讲一遍。这次团队把整条链交给 Micius:一段需求进去,它自己调 EDA 工具跑仿真、综合、布局布线,最后交出 GDS 版图,全程没有人工输入。

挑战

从需求到版图,中间隔着十几道工序

一块数字芯片从需求走到版图,要拆需求、定架构、写 RTL 和仿真,再到综合、布局规划、电源网络、时钟树、布线、时序分析、门级仿真,最后导出 GDS 版图文件。每道工序有自己的工具和报告,上一道的输出就是下一道的输入。

问题往往出在工序之间:很多毛病到下游才暴露,根子却在上游。布线失败,源头可能在综合;时序不收敛,可能要回头改架构。一处改完,后面的工序都得重跑。

这条链平时由前端和后端几位工程师接力,交接一次,上下文就要重讲一遍。像这样规模的一个模块,以往要一个小团队协作几天。把整条链交给模型,难就难在出错时要知道退回哪一步。

这一次,团队把整条链交给 Micius。一段需求进去,Micius 在同一个会话里做到 GDS:346 次工具调用,15 轮报错、定位、回溯修正、重跑,全程没有人工输入。

方案

先把需求拆成能检查的约束

要设计的是一块教学用的实时图像滤镜芯片:对 8 位灰度图做 3×3 Sobel 边缘检测,按可配置的 8 位阈值输出黑白,幅值不低于阈值给 255,否则给 0。

硬约束写得很细:图像尺寸和阈值逐帧可配;滑动窗口只用两条行缓存;像素不丢、不重、不乱序;单时钟 100 MHz,每周期一个像素;开源 45 nm 教学工艺库,芯片区域 250×250 µm;交付源码、测试环境、约束、脚本、网表、GDS 和结果报告。

Micius 先把这段话拆成一条条能检查的约束,再建工程、写 RTL。

接着它按规格写了一份参考模型,写的时候不看 RTL。照 RTL 写的模型容易和 RTL 错在一处,错了也比不出来;两份各自从规格出发,才可能对不上,对上了才算数。

RTL 过 lint,0 个错误、0 个警告。仿真跑了 7 帧,既有 16×16、32×24 这样的常规帧,也有 4×4 的小帧,阈值取到 0 和 255。输出像素重建成图像帧,和参考模型逐个比对,51,289 个像素全部一致。

回溯

哪一步报错,就回到问题的源头

进入后端,报错多了起来。Micius 每次都一样处理:读报错、找原因,判断问题出在哪道工序,回到那一步改,再从那里往下重跑。

第 11 轮最典型。详细布线失败,报错说一条常量网络布不了线。根子在综合:网表里的常量信号没有接到输出固定电平的 tie 单元上,布线器无从下手。Micius 退回逻辑综合,把常量绑到 tie 单元,再从综合往下,把布局规划、电源网络、时钟树、详细布线重走一遍。

也有退回 RTL 的:第 7 轮布局规划出错,Micius 回到 RTL,把绝对值运算改写成无符号比较;第 5 轮 RTL 仿真报错,它补上仿真要用的时间单位声明,再从 lint 重新跑。每一轮改了什么、为什么改,都记在执行记录里。

流程示意在下游报错,回到上游改,再把中间的工序重跑一遍。

时序

约束不动,改结构

建立时间裕量,指的是信号比下一个时钟沿提前多少到达。第一版跑完布线做时序分析,建立时间最差裕量(WNS)是 −7.18 ns,总负裕量(TNS)−6,099 ns。100 MHz 下一个周期只有 10 ns,初版把整套 Sobel 计算挤在一拍组合逻辑里,路径太长。

把时钟放慢最省事,Micius 没这么做:约束不动,回 RTL 把计算拆成两级流水线,再往下跑,WNS 回到 −1.82 ns,TNS −840 ns。

剩下的差距交给后端的设计修复和时序修复。再做一次分析,WNS +5.39 ns,TNS 归零,保持时间最差裕量 +0.043 ns。

流程示意约束线不动,设计两次改动,最差裕量从负到正。

成果

交回的,是一套能复查的结果

导出的 GDS 芯片尺寸 250×250 µm,符合要求;布线器报告的 DRC 违例是 0。综合后有 8,523 个标准单元,版图里一共 10,597 个实例;按默认翻转率估算,功耗 3.97 mW。

功能验证做了两遍。RTL 和综合后的门级网表,各自和那份独立写的参考模型比对,51,289 个像素两次全部一致,说明综合没有把测过的功能改坏。

需求里列的交付物都在工程目录里:源码、测试环境、约束、脚本、网表、GDS、结果报告。报告里每个数字都取自工具返回值,工程师顺着执行记录能查到它出自哪一次调用。

这块芯片按教学用途设计,用的是开源 45 nm 教学工艺库;面积和功耗只做记录,没有额外优化;时序只看了布线后的典型工艺角,没有签核。交回的是可复查的设计和证据,离流片还远;哪些结论站得住、还要补哪些检查,由工程师复核后定。

这套做法也适用于

  • 已有 RTL 的后端设计

    把验证过的 RTL 和约束交给 Micius,可以从综合一路跑到版图;哪一步报错,就回到出问题的那一步修正,再往下重跑。

  • 时序收敛

    时钟约束不放松,先找出违例路径,再在改结构和后端修复之间取舍;每一次改动和结果都留下记录,供工程师挑选。

  • 换一套工艺库重跑

    同一份设计换到另一套工艺库上,可以把综合到版图重新走一遍,并列出面积、时序和功耗的差别。

  • 改动后的回归比对

    设计改动后,可以从改动所在的那一步往下重跑,再让 RTL 和门级网表都对照参考模型比对一遍。

从 RTL 到 GDS,还要几个人接力?

告诉我们典型模块的规模、在用的工艺和工具流程、签核要求,我们走一遍,说明 Micius 能先做哪些、哪些要工程师把关。