ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

开源EDA工具链实战:从RTL到GDSII的Sky130流片全流程

开源EDA工具链实战:从RTL到GDSII的Sky130流片全流程 1. 为什么我要把整条链路押在开源工具上第一次听说“开源流片”这四个字我脑子里蹦出来的画面是一群人在车库里用几台旧电脑硬生生把芯片做出来。后来真上手了才发现这事没那么浪漫但也没那么玄乎。开源EDA工具链加上Sky130 PDK确实能让一个没有大厂资源、没有昂贵License的普通人走完从RTL到GDSII的完整流程最后把版图送出去流片。这条路我走过一遍中间踩的坑足够写满一个笔记本所以这篇就把整个链路拆开把那些文档里不会写、论坛里要翻半天才能找到的细节全倒出来。先说清楚这套东西适合谁。如果你是想学数字IC设计的学生学校只教了Verilog语法但没给真实工艺库如果你是做嵌入式想往芯片方向转的工程师手里只有一块FPGA开发板或者你是个纯粹的好奇者想知道一颗芯片从代码到硅片到底经过哪些环节——那这套开源方案就是为你准备的。它不要求你买任何商业工具一台跑Linux的普通电脑就能开工。但代价是你得接受工具链的不完美得习惯看日志排错得自己补很多商业流程里自动帮你搞定的步骤。Sky130 PDK是SkyWater公司开源的一个130纳米工艺设计套件包含器件模型、设计规则、标准单元库等一整套东西。OpenROAD是其中的布局布线主力Magic负责版图编辑和DRC验证再加上Yosys做综合、OpenSTA做时序分析整条链路就串起来了。关键词里提到的这几个工具基本就是这套流程的骨架。我下面会按实际操作的顺序把每个环节的关键决策、常见报错和绕坑方法讲透。2. 环境搭建别急着装工具先把版本对齐2.1 为什么版本管理是第一个大坑开源工具链最让人头疼的地方不是功能弱而是版本之间的兼容性。OpenROAD、Yosys、Magic、PDK这几样东西各自都在快速迭代你今天从GitHub拉的最新版很可能和三个月前的PDK定义对不上。我一开始就是吃了这个亏用最新的OpenROAD去跑一个旧版教程的脚本结果在读取LEF文件时直接报了一堆语法错误排查了半天才发现是LEF格式在新版里做了调整。所以我的建议是要么全用最新要么全用某个稳定发布版千万别混搭。具体来说OpenROAD现在有预编译的二进制包直接下载对应Ubuntu版本的压缩包解压就能用比从源码编译省事得多。Yosys和Magic也都有包管理器版本但要注意Magic的版本号太老的版本可能不支持Sky130的某些层定义。提示如果你用的是Ubuntu 22.04OpenROAD官方提供的二进制包可以直接跑。但如果你在CentOS或者别的发行版上依赖库的版本差异会让你痛不欲生建议直接上Docker。2.2 PDK的获取与目录结构Sky130 PDK有两个主要来源一个是SkyWater官方的开源仓库另一个是OpenLane项目维护的版本。我推荐用OpenLane配套的那个因为它已经把标准单元库、IO库、SRAM宏这些都整理好了目录结构也清晰。下载下来之后你会看到几个关键目录libs.ref存放标准单元的GDS、LEF、Liberty文件这是布局布线要用的libs.tech工艺相关的技术文件比如Magic的.tech文件、KLayout的层定义lef和gds分别对应抽象视图和完整版图这里有个细节Liberty文件分几种工艺角tt是典型、ff是快、ss是慢。做时序分析时至少要跑tt和ss两个角不然流片回来可能因为工艺偏差导致时序不满足。我见过有人只跑tt就送出去了结果芯片在低温下跑不到标称频率这就是没做多角分析的后果。2.3 环境变量与路径配置环境变量这东西看起来简单但配错了后面每一步都会出问题。你需要设置的主要有这几个export PDK_ROOT/path/to/sky130A export OPENLANE_ROOT/path/to/openlane export PATH$PATH:$OPENLANE_ROOT/flow注意PDK_ROOT指向的目录名有些教程写的是sky130A有些是sky130B这两个版本的设计规则有细微差别。A版和B版不能混用LEF和GDS必须来自同一个版本否则DRC会报出莫名其妙的错误。我建议在项目目录里放一个env.sh每次开工前source一下避免路径漂移。3. 从RTL到网表综合阶段的取舍3.1 Yosys综合脚本的定制Yosys是开源综合工具功能上当然比不上商业综合器但对于中小规模设计够用了。它的脚本语言叫Tcl但和商业工具那套Tcl不兼容你得重新学。一个典型的综合脚本大概长这样read_verilog top.v synth -top top dfflibmap -liberty $PDK_ROOT/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib abc -liberty $PDK_ROOT/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib write_verilog -noattr top_synth.v这里的关键是dfflibmap和abc两步。dfflibmap把寄存器映射到工艺库里的触发器单元abc做组合逻辑的优化和映射。如果你跳过dfflibmap综合出来的网表里会有泛化的DFF后面布局时找不到对应的物理单元直接卡死。3.2 时序约束的写法开源流程里时序约束用SDC格式和商业工具一样。但Yosys和OpenSTA对SDC的支持程度不同有些命令在Yosys里会被忽略。我一般把约束分成两部分综合阶段只给时钟定义和输入输出延迟详细的时序例外留到OpenSTA里再加。create_clock -name clk -period 10 [get_ports clk] set_input_delay -clock clk 2 [all_inputs] set_output_delay -clock clk 2 [all_outputs]时钟周期设多少合适Sky130的典型工作电压是1.8V标准单元在tt角下跑100MHz问题不大。但如果你用了大量组合逻辑建议先跑一遍综合看时序报告再决定要不要降频。别一上来就设个200MHz然后发现时序根本收敛不了那是浪费时间。3.3 综合后的网表检查综合完别急着往下走先检查网表。主要看三件事有没有latch推断出来、有没有组合环、寄存器是不是都映射到了工艺库单元。latch在数字设计里通常是不想要的Yosys会给你警告但警告藏在几百行日志里很容易被忽略。我一般用grep过滤一下grep -i latch yosys.log grep -i combinational loop yosys.log如果发现有latch回去改RTL把不完整的if-else补全。组合环更麻烦得找到环路路径然后打断。这些在商业流程里也有但商业工具的报告更友好开源工具就得自己多留个心眼。4. 布局布线OpenROAD的实战细节4.1 读取设计时的常见报错OpenROAD读设计需要三个东西网表、LEF、Liberty。顺序很重要先读LEF再读网表不然它不知道单元长什么样。我遇到最多的报错是“cell not found in LEF”这通常是因为网表里的单元名和LEF里的对不上。比如Yosys综合出来的是sky130_fd_sc_hd__dfxtp_1但LEF里可能叫sky130_fd_sc_hd__dfxtp_1——看起来一样对吧但有时候下划线数量或者大小写有差异肉眼很难发现。解决办法是用脚本提取网表里所有单元名和LEF里的做交集差集就是问题所在。OpenROAD的日志里会打印它找到了哪些单元仔细看那部分。4.2 floorplan与电源规划Floorplan决定了芯片的面积和形状。OpenROAD里用initialize_floorplan命令需要指定die面积和core面积。core面积不能太小否则布局密度过高布线会congestion。我一般先设一个宽松的面积跑完布局看利用率再决定要不要缩小。电源规划是另一个容易翻车的地方。Sky130的标准单元有VPWR和VGND两个电源引脚你需要用add_global_connection把它们连到电源网络上。如果漏了这一步后面布线会报“unconnected power pin”而且这个错误不会在早期暴露往往跑到最后才出现让人欲哭无泪。add_global_connection -net VDD -inst_pattern .* -pin_pattern VPWR -power add_global_connection -net VSS -inst_pattern .* -pin_pattern VGND -ground4.3 布局阶段的参数调优OpenROAD的布局分全局布局和详细布局两步。全局布局用global_placement详细布局用detailed_placement。全局布局有几个关键参数-density控制目标利用率默认0.7左右。如果你设到0.85以上工具会拼命把单元塞进去结果就是局部密度过高后面布线绕不出去。我的经验是先跑0.6的密度看时序和congestion报告再逐步往上加。每次加0.05观察变化。如果加到某个值后congestion突然恶化就退回上一档。这个过程可能要迭代三四次但比后面布线失败再重来要快得多。4.4 时钟树综合的注意事项时钟树综合CTS是布局和布线之间的关键步骤。OpenROAD的CTS工具叫TritonCTS用法是clock_tree_synthesis。这里有个坑CTS之前必须确保时钟定义正确否则工具不知道哪些网络是时钟。如果你在SDC里用了create_clockOpenROAD会自动识别但如果你用的是create_generated_clock有时候需要手动指定。CTS之后要跑一遍时序分析看时钟偏斜skew有多大。Sky130的H树结构在中小规模设计上skew可以控制在100ps以内但如果你的时钟负载很大可能需要加缓冲器。TritonCTS会自动插buffer但你可以通过-buf_list参数指定用哪种缓冲单元。5. 布线、DRC与GDS导出5.1 全局布线与详细布线的衔接布线分全局布线和详细布线。全局布线决定每条线大概走哪个区域详细布线确定具体的金属层和通孔。OpenROAD里用global_route和detailed_route两个命令。全局布线后要看congestion报告如果某些区域overflow严重得回去调整布局或者floorplan。详细布线的参数比较多我一般关注这几个-droute_end_iter控制迭代次数默认是64但如果设计不大可以降到20左右加快速度-verbose打开详细日志方便排查DRC违规。5.2 DRC验证Magic与KLayout的分工DRC是流片前最关键的检查。Sky130的DRC规则有几百条Magic和KLayout都能跑但各有侧重。Magic的DRC更贴近工艺厂的标准KLayout的更快但有时候会漏报。我的做法是先用KLayout快速跑一遍修掉明显的违规再用Magic做最终验证。Magic跑DRC的命令是drc check drc whydrc check会统计违规数量drc why会显示具体位置和规则名。常见的违规包括金属间距不够、通孔覆盖不足、N阱间距违规。有些违规是工具误报比如某些标准单元内部的图形这时候需要看工艺厂的DRC手册确认。5.3 GDS导出的最后检查GDS导出用Magic的gds write命令。导出前要确保所有层都正确映射特别是text层和pin层。如果pin层没导出后面做LVS时找不到端口。导出后可以用KLayout打开GDS肉眼检查一下版图是否完整有没有明显的缺失。还有一个细节Sky130的GDS里包含标准单元的完整版图文件会比较大。如果只是送出去流片可以只导出顶层单元和它引用的部分但为了保险我一般全量导出。6. 那些让我熬夜的报错与解决思路6.1 “invalid magic number”到底是什么这个词在热词里出现了我猜很多人搜它是因为遇到了Magic启动报错。这个报错通常有两种情况一是GDS文件损坏二是Magic的版本和GDS的格式不匹配。Sky130的GDS是GDSII格式但有些工具导出的是OASIS格式Magic读OASIS需要额外配置。解决办法先用file命令确认文件类型如果是OASIS用KLayout转成GDSII。如果是GDSII但Magic还是报错检查Magic的版本太老的版本可能不支持某些GDSII特性。6.2 时序不收敛的排查路径时序不收敛是数字设计的老大难问题。在开源流程里排查路径和商业流程类似先看是哪条路径违例再看是逻辑级数太多还是驱动能力不够。OpenSTA的报告里会列出最差的几条路径我一般按这个顺序查违例路径的起点和终点是什么中间经过了多少级逻辑每级的单元延迟和线延迟各占多少有没有可以优化的空间比如换驱动更强的单元、插入缓冲器、调整布局有时候问题不在逻辑本身而在时钟树。如果skew太大建立时间和保持时间会同时恶化。这时候得回去调CTS的参数。6.3 天线效应违规的处理天线效应是工艺制造中的问题长金属线在刻蚀过程中会积累电荷可能击穿栅氧。Sky130的DRC里包含天线规则检查。如果报天线违规解决办法通常是在靠近栅极的地方加一个二极管或者把长线断开加跳线。OpenROAD有自动修天线效应的功能在详细布线时加-fix_antennas参数。但自动修不一定能全部解决剩下的得手动处理。手动处理时要注意二极管要放在靠近接收端的位置而且方向要正确。7. 流片前的最后清单走到这一步你已经有了GDS、时序报告、DRC报告、LVS报告。在送出去之前我建议按这个清单过一遍检查项工具通过标准DRCMagic零违规LVSNetgen网表与版图一致时序OpenSTAtt和ss角都满足天线OpenROAD零违规电源目视所有单元电源连接正确端口KLayoutpin层完整LVS这一步容易被忽略但很重要。Netgen是开源的LVS工具需要准备网表和版图的网表文件。如果LVS不过说明版图和原理图不一致可能是少了某个单元或者连线错了。还有一点流片前一定要确认工艺厂的MPW日程。Sky130的流片通常通过Google的MPW项目或者Efabless的Shuttle有固定的截止日期。错过一次可能要等几个月。所以时间规划要留足余量别卡着截止日期提交。8. 我在这条路上学到的事这套开源流程走下来最大的感受是它逼着你理解每一步在做什么。商业工具把很多细节封装起来了你点个按钮它就帮你搞定但开源工具每一步都要你自己配、自己查、自己修。这个过程很痛苦但走完之后你对芯片设计流程的理解会比只用商业工具的人深得多。另一个体会是社区的力量很重要。OpenROAD、Magic、Yosys这些项目都有活跃的论坛和Slack频道遇到问题搜一下往往能找到答案。我遇到的“invalid magic number”报错就是在GitHub的issue里找到的解决方案。所以别闷头自己搞该问就问。最后说个实际的Sky130的工艺是130纳米这个节点做数字电路绰绰有余但做射频或者模拟就要多考虑一些。如果你做的是纯数字设计按上面的流程走基本没问题。如果涉及模拟模块Magic的版图编辑功能会用到更多需要额外学一些技巧。我后续可能会再写一篇专门讲模拟部分但那又是另一个故事了。
返回列表