ARTICLE DETAIL

资讯详情

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

个人开发者如何设计ASIC芯片?从RTL到GDSII的开源工具链全流程解析

个人开发者如何设计ASIC芯片?从RTL到GDSII的开源工具链全流程解析 大家先思考一个问题一个没有流片渠道、没有 EDA 工具授权、更没有几百万研发预算的独立开发者能不能做出一颗真正属于自己的芯片放在十年前答案基本是“不能”。ASIC 这个词在大众认知里一直是三星、台积电、英特尔这些巨头的地盘跟个人开发者没什么关系。直到开源 EDA 工具链、开源 PDK工艺设计套件和类似 TinyTapeout 这类聚合流片项目的出现才把“设计一颗芯片”这件事的门槛拉到了个人开发者够得着的范围。bitluni 的“第一次认真做的 ASIC 项目”之所以有不少人在讨论正是因为它是这条路径上一个非常典型的实践样本一个原本擅长嵌入式开发和视频内容创作的硬件爱好者完整地走了一遍从 RTL 到 GDSII 再送去流片的流程。这篇文章不是标题党也不是让你看完就以为自己能马上造出 CPU。我会从“个人做 ASIC 到底意味着什么”讲起把 ASIC 和 FPGA 的区别、开源工具链的关键组成、一次真实流片流程的完整链路、最小代码示例以及最容易踩的坑全部拆开讲一遍。不管你是做嵌入式的、写 RTL 的、还是做软件开发的这篇都能帮你建立一个对 ASIC 开发的整体认知框架。1. 这篇文章真正要解决的问题“ASIC”这个缩写全称是 Application-Specific Integrated Circuit专用集成电路。它指的是为特定用途设计的芯片而不是像 CPU、GPU 那样通用的处理器。为什么要关注别人“第一次认真做 ASIC”这件事因为它背后折射出的问题很现实芯片设计的门槛是不是真的降下来了过去个人要接触 ASIC基本只有两条路一条是去芯片公司上班在大公司的流程里负责其中一个模块另一条是买一块 FPGA 开发板体验一把“硬件逻辑设计”。但 FPGA 和 ASIC 之间的距离远比很多人想象中大。FPGA 是现成的可编程逻辑器件你配置的是已有的查找表和布线资源ASIC 则是从空白晶圆开始一层一层光刻、刻蚀、沉积最后变成一颗独立的芯片。前者像在毛坯房里做装修后者像从零开始盖一栋楼。本文要解决的问题有几个帮读者建立 ASIC 开发全流程的概念。从 RTL 设计到综合、布局布线、物理验证、流片每个环节在做什么为什么需要它。剖析开源 ASIC 工具链到底能不能用。Yosys、OpenROAD、Magic、KLayout这些工具分别负责什么组合起来能不能替代商业 EDA。回答“个人开发者怎么真正跑通一次流片”。成本和入口是什么TinyTapeout 这类项目为什么是当前最现实的路径。列出新手最容易踩的坑。不是教你背命令而是告诉你设计阶段哪些错误会被留到物理实现阶段放大。如果你是那种“看完教程就想着手实践”的开发者这篇文章正好适合你。如果你只是想了解芯片设计的基本原理这篇也能帮你建立一个不容易被各种概念混淆的框架。2. ASIC 与 FPGA 的边界与真相很多从 FPGA 入门硬件设计的开发者第一次接触 ASIC 时会产生一个错觉ASIC 不就是“把 FPGA 代码烧到芯片里”吗这个说法大概只对了一半。RTL 代码层面的确可以复用但芯片的实现方式和验证流程完全不同。先看两个最核心的区别。2.1 FPGA 是配置ASIC 是制造FPGA 内部有大量可配置的逻辑块CLB、DSP 单元、BRAM 和可编程布线网络。你写好的 RTL 代码经过综合、布局布线之后生成的是一个比特流bitstream下载到 FPGA 芯片后通过配置内部的开关和查找表来实现逻辑功能。整个过程没有物理制造只有“配置”。做错了重新下载一个比特流就行代价几乎为零。ASIC 不同。你设计的 RTL 代码要经过逻辑综合映射到标准单元库Standard Cell Library中的具体门电路再经过布局布线决定每个单元放在硅片上的物理位置和金属连线走向最后生成 GDSII 文件交给晶圆厂进行流片。流片就是真的在硅片上制造一颗芯片一次 MPW多项目晶圆流片通常需要数周时间不能改。这是最核心的认知FPGA 里的“改设计”是在已有芯片上改配置ASIC 里的“改设计”意味着重新做一版芯片。2.2 为什么 ASIC 性能更强、成本摊薄后更便宜既然 ASIC 这么麻烦为什么还要做因为 ASIC 是“按需定制”的。它没有 FPGA 里大量冗余的可编程逻辑和布线资源芯片面积可以做得更小、功耗更低、频率可以更高。当出货量足够大时单颗芯片的制造成本可以摊得很低远低于同样性能下 FPGA 的方案。这也是为什么手机 SoC、网络交换机芯片、矿机芯片、AI 加速芯片几乎全部是 ASIC。FPGA 的优势在于灵活性和开发速度适合产品原型验证、小批量设备、以及对上市时间要求极高的场景。ASIC 的优势在于极致性能、功耗和量产后单颗成本。两者不是替代关系而是不同阶段、不同量级下的选择。2.3 一个容易误导人的说法“ASIC 设计就是写 Verilog”很多教程会让你产生一个错觉用 Verilog 写一个模块然后跑一下开源工具链生成版图就完事了。这个流程确实能走通但它隐藏了一个残酷的事实RTL 只是整个 ASIC 设计流程的入口后续的综合、时序约束、物理实现、验证每一步都比 RTL 本身更复杂。bitluni 这种第一次认真做 ASIC 的项目真正值得关注的地方不是他的电路设计有多复杂而是他把完整流程走了一遍并且在这个过程中暴露了大量“教程不会告诉你”的细节。这些细节才是新手真正需要提前知道的。3. 个人做 ASIC 的入口为什么打开了开源工具链的拼图个人做 ASIC 的入口最直接的推动力不是某一个单一工具而是一整条开源工具链的形成。3.1 三大拼图开源 EDA、开源 PDK、聚合流片完整拼图由三部分组成拼图作用代表项目开源 EDA 工具完成综合、布局布线、物理验证等设计流程Yosys, OpenROAD, Magic, KLayout, Netgen开源 PDK提供工艺规则、器件模型、标准单元库SkyWater SKY130, Google SKY130 PDK聚合流片入口把多个设计合并到同一块晶圆上分摊流片成本TinyTapeout, Efabless Caravel三者缺一不可。过去 EDA 工具贵、PDK 保密、流片成本高三条路全堵死。现在开源 EDA 解决了“工具”问题SkyWater 130nm PDK 解决了“工艺库”问题TinyTapeout 和 Caravel 解决了“怎么把设计变成实物”的问题。3.2 为什么 SkyWater 130nm 是关键以前开源 PDK 几乎是空白。没有 PDK综合工具就不知道目标工艺库有哪些门电路、每种门的时序和功耗是多少、布局工具也不知道设计规则约束是什么。SkyWater SKY130 是一个 130nm 工艺节点的开源 PDK由 Google 和 SkyWater Technology 合作推出采用宽松的许可证发布。它让开源 EDA 工具链有了可以落地实现的工艺基础。130nm 虽然远谈不上先进制程但对于个人学习、小型 ASIC 项目、DIY 芯片已经完全够用。它兼顾了“真实制造”“成本可控”“设计规则可学习”三个需求是当前个人 ASIC 设计最合适的工艺起点。3.3 TinyTapeout个人开发者最现实的流片路径TinyTapeout 是将多个用户的小型设计合并到一次 MPW 流片中这样个人只需支付很小的费用就能获得自己设计的芯片样本。它提供了一套标准化的项目提交方式比如用info.yaml描述项目让开发者不需要自己去谈晶圆厂、不需要了解复杂的封装流程就能走通“设计 → 流片 → 拿到芯片”的完整闭环。对绝大多数第一次接触 ASIC 的开发者来说TinyTapeout 的意义不只是一次“能拿芯片”的体验更重要的是它把物理设计流程的复杂度打包、简化成了可以接受的量级让新手可以把注意力集中在 RTL 设计本身而不是一头扎进 EDA 工具的海量参数里。4. ASIC 开发全流程拆解从 RTL 到 GDSII现在把 ASIC 开发的完整流程拆开看一遍。无论是商业 EDA 还是开源工具链核心流程基本一致区别在于具体工具和参数配置。4.1 整体流程概览ASIC 数字后端流程可以概括为以下几个阶段RTL 设计 → 功能仿真 → 逻辑综合 → 布局规划 → 布局 → 时钟树综合 → 布线 → 物理验证 → GDSII 输出 → 流片每一步的输出都是下一步的输入。任何一步出错都需要回到对应阶段修改这也意味着完整设计和验证周期的冗长。个人开发者必须接受这个现实ASIC 设计不是“写代码 → 编译 → 下载”的快速迭代模式而是一个需要严格分阶段验证的复杂流程。4.2 RTL 设计与功能仿真RTLRegister Transfer Level是寄存器传输级描述是数字设计的主流抽象层级。它描述的是数据在寄存器之间的流动和变换逻辑通常用 Verilog 或 SystemVerilog 编写。这个阶段的核心工作就是把要实现的电路功能用代码的方式描述清楚。设计完成后需要编写 testbench 对 RTL 进行功能仿真。仿真器会模拟 RTL 代码在给定输入下的行为输出波形或日志验证逻辑是否正确。开源工具中Verilator 是常用的仿真工具它把 Verilog 编译成 C 模型执行速度比传统解释型仿真器快不少。4.3 逻辑综合从代码到门电路逻辑综合负责把 RTL 代码映射到特定工艺库中的标准单元上。换句话说综合工具会把代码翻译成物理上真实存在的门级电路并根据约束条件选择合理的单元类型。综合的输入有三个RTL 代码。工艺库文件如 SkyWater 的 Liberty 文件描述每种标准单元的功能、时序、功耗。约束文件SDC描述时钟频率、输入输出延迟等设计要求。典型约束示例create_clock -name clk -period 20 [get_ports clk] set_input_delay 5 -clock clk [get_ports data_in] set_output_delay 5 -clock clk [get_ports data_out]这里-period 20表示时钟周期为 20ns即目标时钟频率 50MHz。综合工具会尽量在满足该时序约束的前提下选择面积和功耗合理的门电路。开源工具中Yosys 通过synth_sky130命令可以直接将 Verilog 综合到 SkyWater 130nm 工艺。它调用了 ABC一个逻辑综合与优化工具来完成底层逻辑优化和映射。4.4 布局布线布局Placement决定每个标准单元在芯片版图上的具体位置。布线Routing决定这些单元之间的金属连线怎么走以及连线的层数。这一步对时序、功耗、信号完整性影响巨大。OpenROAD 是目前与 Yosys 搭配使用的主流开源布局布线工具。它可以从综合后的网表开始完成 floorplan、placement、clock tree synthesis、routing以及后续的时序分析和优化。4.5 物理验证决定“能不能制造出来”物理验证是流片前最后一道质量关卡主要包含DRC设计规则检查检查版图是否满足晶圆厂的制造规则比如线宽、间距、覆盖面积。不满足规则的版图无法制造出合格芯片。LVS版图与原理图一致性检查检查版图的实际连接是否和原始网表一致。这一步是为了防止在物理实现过程中引入连接错误。时序签核Timing Sign-off在提取版图寄生参数后再次确认时序是否满足约束。开源工具链中Magic 可以完成版图编辑和 DRC 检查KLayout 也可以查看和检查版图Netgen 则用于 LVS 比较。5. 从 RTL 到 GDSII 的最小示例用计数器走通一遍为了不让你对前面这些流程只停留在概念理解这里用一个最简单但完整的示例设计一个 4 位计数器然后把它走完从 RTL 到 GDSII 的主要流程。虽然你未必需要立刻在自己的电脑上装完全部工具但有了这个示例再去看任何 ASIC 教程都能知道对方在做什么。5.1 编写 RTL 代码// 文件路径rtl/counter.v module counter ( input wire clk, input wire rst_n, output reg [3:0] count ); always (posedge clk or negedge rst_n) begin if (!rst_n) count 4b0000; else count count 1b1; end endmodule这个模块的功能非常简单异步复位时钟上升沿计数加一。选择一个简单模块作为示例是因为 ASIC 流程中真正复杂的不是 RTL 功能而是后续每一个阶段的工具配置和物理实现细节。先跑通一个最小的模块比一上来就挑战复杂 CPU 设计要高效得多。5.2 编写 testbench 并运行功能仿真// 文件路径tb/tb_counter.v timescale 1ns/1ps module tb_counter; reg clk; reg rst_n; wire [3:0] count; counter u_counter ( .clk(clk), .rst_n(rst_n), .count(count) ); initial begin clk 0; rst_n 0; #100 rst_n 1; end always #10 clk ~clk; initial begin $monitor(time%0t, count%0d, $time, count); #1000 $finish; end endmodule使用 Verilator 运行仿真verilator --binary --timing -Wall tb/tb_counter.v rtl/counter.v --top-module tb_counter ./obj_dir/Vtb_counter预期输出是count从 0 递增到 15 后回绕到 0。如果count不递增或出现 x 态首先检查两个方向异步复位是否有效释放时钟是否有边沿。5.3 用 Yosys 做逻辑综合实际综合命令取决于你的工具安装情况这里给一个典型的开源综合脚本片段yosys -p read_verilog rtl/counter.v; synth_sky130 -top counter -json counter.json synth_sky130会调用 SkyWater 130nm 的标准单元库将 RTL 综合为门级网表。输出counter.json是后续布局布线工具可以直接读取的格式。不要指望一条命令就能在自己的机器上瞬间跑通。开源 EDA 工具的常见槽点就是依赖环境配置繁琐不同发行版、不同版本的工具之间可能存在兼容性差异。遇到问题优先看日志里的 ERROR 行排查依赖库和版本是否匹配。5.4 用 OpenROAD 做布局布线OpenROAD 通常需要写一个配置脚本这里只展示最核心的步骤openroad -no_init -exit scripts/place_route.tcl其中place_route.tcl里需要指定网表文件、PDK 文件、时序约束这些输入。实际项目里这个脚本可能是几十甚至是上百行涉及到晶圆尺寸、核心利用率、电源网络定义等内容。第一次做 ASIC 时最稳妥的方式是找一个已经能跑通的官方示例先复制、再修改不要从零开始写配置文件。5.5 物理验证与 GDSII 导出布局布线完成后会得到最终的版图文件。在 Magic 中运行 DRC 检查在 Netgen 中运行 LVS 检查。确认通过后导出 GDSII 文件这就是你设计最终交给晶圆厂的“图纸”。对于使用 TinyTapeout 的开发者到这个阶段后只需要把项目文件RTL、配置文件、说明文档按照 TinyTapeout 的提交规范上传后续的合并流片、封装、寄送芯片这些事都由平台统一处理。6. 如何评估你的 ASIC 设计真的能工作很多第一次做 ASIC 的人会经历一个从兴奋到崩溃的过程功能仿真过了、综合没问题、版图画完了结果流片回来芯片不工作。ASIC 不是一个“写完代码就能保证运行”的东西。它的验证体系和软件完全不同。这里给出几个在提交流片前必须验证的核心维度。6.1 功能验证你的逻辑真的对吗这是最基础的一层。你的 RTL 代码在理想情况下是否实现了预期功能。功能仿真可以通过 Verilator 或 Icarus Verilog 完成。关键是要保证 testbench 的覆盖率不能只用一两条路径就草草收场。边界条件、复位状态、总线冲突、时钟域切换这些场景都要在仿真里覆盖到。6.2 时序验证在最坏条件下还能跑吗ASIC 设计必须考虑工艺偏差、电压波动、温度变化。同一个设计在 slow 工艺角、低电压、高温条件下信号传播延迟会增大很多在 fast 工艺角、高电压、低温条件下信号可能提前到达导致 hold time 违例。开源工具链中的 OpenSTA 可以用来做静态时序分析检查设计是否存在 setup/hold 违例。6.3 物理验证能造出来吗DRC 是制造层面的约束。即使逻辑完全正确、时序完全满足如果版图里有一个间距违反规则晶圆厂就无法为你制造或者制造出来的芯片会有短路或断路。流片前DRC clean 是绝对的硬性要求。6.4 综合策略不要做过度的性能追求第一次做 ASIC 的开发者很容易在时钟频率上过度纠结。实际上TinyTapeout 这类项目对芯片频率的预期不会很高很多设计运行在几十 MHz 甚至更低。把注意力放在正确性和可制造性上比追求极限频率更有意义。7. 个人做 ASIC 的常见误区与排错思路结合不少第一次做芯片的人踩过的坑我把最常见的几个问题整理成了一张排查表比零散地查资料高效得多。问题现象可能原因排查方式解决方案功能仿真通过但综合后功能不对testbench 覆盖不完整存在未初始化寄存器检查 RTL 中所有寄存器的复位逻辑增加仿真时间为所有寄存器添加明确的复位值增加边界测试用例布局布线后时序违例setup time 不够综合时约束过紧或布局布线对时钟网络优化不足查看时序报告确认关键路径所在模块放宽时钟约束优化关键路径逻辑调整 floorplan综合工具报错找不到标准单元工艺库路径配置错误或 PDK 未正确安装检查 PDK 安装路径确认工具搜索路径包含 PDK 文件重新安装 PDK检查工具配置脚本中的库路径DRC 报告大量违规布局布线策略过于激进电源网络规划不合理打开版图查看违规位置定位是间距还是线宽问题调整核心利用率优化电源网络增加间距设置流片回来芯片完全不工作芯片上电时序有问题或复位逻辑设计有缺陷检查芯片数据手册和测试板原理图确认复位信号在时钟稳定后释放检查电源上电顺序7.1 新手最容易踩的“版本坑”开源 EDA 工具链的版本兼容性是一个隐藏的深坑。Yosys 的某个版本和 OpenROAD 的某个版本之间可能与特定 PDK 版本的组合出现不兼容。如果网上教程的运行方式和你本地的结果不一致优先检查工具版本号和 PDK 版本号是否匹配。推荐的做法是使用 Docker 镜像或者使用官方提供的预配置虚拟机。Efabless 的 OpenLane 项目就把整条开源流程打包成了一个完整的自动化流程可以显著降低环境配置的复杂度。对于第一次做 ASIC 的人来说直接手动装配 Yosys OpenROAD Magic 这套组合容易让人崩溃先从 OpenLane 的官方示例跑通再逐步理解内部机制是成功率最高的路径。7.2 不要用软件的思维做硬件设计写软件时你可以频繁提交、快速回归。但在 ASIC 设计里一次流片周期需要数周甚至更久改一次 mask 的成本也非常高。因此ASIC 设计必须在进入物理实现阶段之前把功能验证做充分。不能指望“先流片一片有问题再改一版”。这个思维转变是所有从软件开发转到 ASIC 领域的工程师遇到的第一道心理门槛。8. 做 ASIC 项目的工程建议如果你看完前面的内容打算认真开始你的第一个 ASIC 项目下面这几点是我认为最有价值的建议也是很多“第一次做芯片”的项目总结里反复出现的共同经验。8.1 不要一上来就自己撸工具链很多新手在最开始就想从零安装 Yosys、OpenROAD、Magic、KLayout还要手动配置 PDK 路径。这个投入非常大而且很容易碰到版本不兼容问题最后一个月过去了还没开始滴 RTL。更推荐的做法是直接使用 OpenLane 或 TinyTapeout 官方推荐的 Docker 环境先把官方示例跑通拿到一个 GDSII 文件。再回到自己的设计用同样的流程生成自己的 GDSII。先跑通再深入钻研细节。8.2 设计规模宁小勿大第一次做 ASIC设计规模一定要克制。一个 8 位计数器、一个简单的 UART、一个 LED 驱动器、一个小型状态机这些都很合适。目标不是做出一颗复杂的 SoC而是完整地走完流程、拿到一颗自己设计的、能跑的芯片。芯片设计领域有一个残酷的现实面积越大布局布线的复杂度越高物理验证的问题越多流片失败的概率越大。把功能控制在“简单但完整”的范围内才是第一次流片最理性的选择。8.3 重视配置文件和文档记录ASIC 项目里最容易被低估的其实是配置管理和文档能力。流程中的每一步都依赖大量配置时序约束文件、PDK 版本、工具版本、floorplan 参数。任何一项变更都可能影响最终结果。建议从一开始就用 Git 管理所有 RTL 代码、脚本和配置文件并在 commit 信息里记录工具版本方便回溯。8.4 关注功耗与散热个人做 ASIC 很容易忽略功耗问题。虽然 130nm 工艺的功耗密度不算高但如果设计内部有高翻转率的节点芯片在运行时依然可能发热。对于 TinyTapeout 这种以学习为目的的流片项目功耗问题通常不会严重到烧毁芯片但设计时减少无谓的信号翻转、合理使用时钟使能clock enable是值得养成的习惯。8.5 做好“流片即验收”的心理准备最后也是最重要的流片之后你就是这颗芯片的“第一用户”。拿到芯片后先按照预先设计好的测试方案进行上电测试从最基本的电源、时钟、复位开始验证不要一上来就跑复杂功能。准备好逻辑分析仪和示波器这些工具在嵌入式开发中的用法和芯片调试时基本一致但关注点要从“程序跑得对不对”变成“信号波形对不对”。9. 总结与后续学习方向bitluni 第一次认真做 ASIC 项目给整个硬件社区带来的启发不在于电路有多复杂而在于“个人开发者已经可以跑通从 RTL 到流片的完整流程”这件事本身。开源 EDA 工具的成熟 SkyWater 130nm 开放 PDK TinyTapeout 聚合流片平台这三者构成了当前个人开发者接触 ASIC 设计最现实、成本最低的路径。如果你决定继续深入可以从这几个方向逐步拓展先跑通 OpenLane 官方示例生成自己的第一个 GDSII 文件。不要着急理解所有内部细节先建立整体概念。设计一个小型模块比如 UART 或 I2C 从机控制器走完完整流程。这个模块需要有一定复杂度才能暴露问题但又不能复杂到让你失去耐心。研究时序约束的细节。这是 ASIC 和 FPGA 开发差异最大的地方没有真正理解 setup/hold time就很难理解为什么综合后的结果会“不满足要求”。学习芯片测试的基础知识。流片芯片的测试和仿真验证是两套完全不同的方法后者是理想环境下的验证前者是物理世界里的实测。第一次拿到自己的芯片时一套完善的测试方案能省掉大量排查时间。做一颗芯片和写一段测试通过的代码是完全不同的体验。前者会迫使你面对理想模型和物理现实之间的所有差距而这恰恰是整个芯片设计流程中最有价值的部分。
返回列表