ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从RTL到流片:个人开发者如何用开源工具链完成ASIC设计

从RTL到流片:个人开发者如何用开源工具链完成ASIC设计 从“有趣的小玩意”到“流片成功”个人开发者做 ASIC 的这条路并没有想象中那么遥不可及。bitluni 分享了他第一次认真做的 ASIC 项目这背后不仅是“烧钱”和“炫技”更代表了一条正在被开源工具链和半导体制造服务重新打开的硬件创新通道。这篇文章会从这次项目的动机出发拆解 ASIC 开发的核心流程、工具链选型、常见误区和工程建议让对数字芯片设计感兴趣的开发者对“全定制硬件”有一个系统且可落地的认知。如果你和我一样平时主要用 FPGA、单片机或者树莓派做一些硬件项目第一次听到“ASIC 项目”时大概率会有两种感觉一是觉得这东西离自己太远流片一次几万到几十万美元还得懂模拟电路、版图设计、时序收敛简直是半导体大厂工程师的专属领域二是觉得即使做出来了也就是个跑马灯或者小控制器和自己的日常开发没什么关系。bitluni 的这次尝试恰好打破了这两个印象它证明了个人开发者不必等大厂开源 IP也能通过现代开源 EDA 工具和 MPW多项目晶圆服务把一个真实可用的芯片从想法变成实物。这篇博客适合三类读者第一类是正在学习 FPGA 和 Verilog、想更进一步知道“综合之后是什么样子”的数字设计初学者第二类是硬件产品创业者想评估“把核心电路做成专用芯片”到底值不值第三类是单纯对芯片设计流程好奇、想了解 ASIC 和 FPGA 根本区别的技术爱好者。1. ASIC 这个老概念为什么现在又热了ASIC 的全称是 Application-Specific Integrated Circuit专用集成电路。它和我们平时接触的通用 CPU、GPU、FPGA 不同ASIC 从设计之初就被限定在某个特定应用领域比如比特币矿机里的哈希计算芯片、手机里的基带芯片、智能音箱里的语音唤醒芯片。过去 ASIC 只属于巨头原因是经济门槛和技术门槛都很高。但从 2020 年开始一个明显的变化是开源 EDA 工具链成熟了SkyWater 130nm 工艺节点通过 Google 的免费 MPW 项目向学术和个人开发者开放让一次“试错”的成本降到了几百美元甚至免费。再加上 TinyTapeout 这类社区活动哪怕你对物理版图一无所知也可能用标准单元库里现成的门电路拼出一个小设计并流片。bitluni 的这次项目本质上是这种“个人 ASIC 运动”的技术延续。从技术背景看bitluni 是一位做嵌入式、示波器、自制游戏机出名的硬件创造者他的作品通常充满机械感和模拟电路细节。这次选择做 ASIC不只是想“做一个芯片玩”而是想把他在 FPGA 上做过的某个专用逻辑固定成真实硅片从而获得更低的功耗、更小的面积和更高的速度。这件事对内容创作者来说本身就是把“数字逻辑设计”和“真实物理世界”连接起来的最好教学案例。我的一个明确判断是ASIC 正在从“大厂垄断”走向“个人可及”但它的复杂度并没有消失只是被工具链和代工服务包装得更容易上手。对于 CSDN 读者来说现在恰恰是理解这套流程的最好时机因为无论你是否真的去流片掌握 ASIC 的基本设计方法都会反向提升你在 FPGA、CPU 架构、性能优化方面的能力。2. ASIC 到底解决了什么问题很多人误以为 ASIC 就是“用代码写个 CPU”其实关键差异不在代码而在“把电路固定下来”。FPGA 内部的逻辑单元是可配置的LUT查找表、触发器、BRAM 以及布线资源都由 SRAM 配置位控制。你加载比特流的时候实际上是在“编织”一个电路网络。它的缺点是每个逻辑单元都有大量冗余配置电路导致面积大、功耗高、频率上限受布线资源限制。ASIC 则是一个人用标准单元库或定制版图把电路“刻”在硅片上。没有 LUT 的查找逻辑也没有可编程开关门与门之间的金属连线是固定的。因此同一段 RTL寄存器传输级描述ASIC 的频率往往可以做到 FPGA 的 2 到 5 倍功耗降低 10 倍以上面积缩小数倍而成本则被摊薄在每个量产芯片里。为了让你更直观地理解这个区别我整理了一个对比表维度FPGAASIC电路可重构性可反复配置制造后固定开发周期短小时到周长月到年单芯片成本高量产时极低功耗效率中低高开发门槛较低只需数字逻辑知识高需理解物理设计与工具链适用范围原型验证、中小批量、动态硬件超大规模量产、性能功耗极致回到 bitluni 的项目他在视频里展示了一个小型 RISC-V 风格的处理器核并用它驱动了一个 LED 矩阵和音频输出。如果用 FPGA 实现设计难度其实更低但做出来的东西只能插在开发板上而做成 ASIC 之后这颗芯片就变成了一颗独立的“单片机”可以焊到 PCB 上不需要额外的配置芯片上电就能运行自己写好的程序。所以 ASIC 在这里真正解决的问题不是“我能跑一个 hello world”而是“我能不能把一段逻辑变成世界上最精简、最独立的硬件实体”。这种从可配置到固定、从工具到实物的转变才是 ASIC 最核心的价值。3. 个人 ASIC 开发流程从 RTL 到流片无论是大厂还是个人ASIC 的完整流程大体相同只是细节工具和验证方式有区别。3.1 RTL 设计与功能仿真RTL 是 Register Transfer Level 的缩写用 Verilog、SystemVerilog 或 Chisel 等硬件描述语言描述电路在每个时钟沿的状态转移。这一步和 FPGA 开发的前端完全一样。你先写一个模块比如 CPU 的取指单元、ALU算术逻辑单元、寄存器堆然后用 testbench 做波形仿真确保逻辑正确。这里需要特别强调ASIC 设计里仿真不是为了“跑通”而是为了“穷尽”。因为芯片制造出来后无法像 FPGA 一样重新下载程序任何逻辑错误都意味着整批芯片报废。所以仿真覆盖率概念会比 FPGA 开发严格得多。3.2 逻辑综合综合是把 RTL 代码映射到标准单元库的过程比如 SkyWater 130nm 库里的 NAND 门、触发器、MUX。工具会考虑你的时序约束比如时钟周期是 20ns它会计算每一条路径上的组合逻辑延迟如果超过约束就尝试换更强的驱动单元或重排逻辑。在这一步你会第一次看到“代码变成了门电路”。很多 FPGA 开发者第一次做 ASIC 时会惊讶原来同样的 always 块综合结果可能并不是你想的那个“if else 结构”而是包含一堆优先级编码器和选择器。3.3 布局布线布局是把标准单元放到芯片平面图上布线是连接它们的金属层。这一步对时序收敛至关重要因为芯片内部走线的延迟有时超过门延迟本身。开源工具 OpenLANE 会自动完成 floorplan、placement、clock tree synthesis、routing并输出 GDSII 文件。GDSII 是芯片版图的最终格式代工厂就是根据它制造掩膜版然后在晶圆上投影出电路。3.4 物理验证与签核物理验证包括 DRC设计规则检查和 LVS版图与原理图对比。DRC 检查最小线宽、间距、金属密度是否满足代工厂工艺规则LVS 则确认版图电路和综合后的网表一致。只有通过签核才能提交给流片服务。为了让你从时间维度理解投入我列一个典型的时间分配阶段时间占比说明RTL 设计25%越早做架构决策后面损失越小功能仿真15%覆盖率优先不要只跑 happy path综合与时序分析20%时钟频率目标要先想清楚布局布线20%里最容易出 DRC 问题的阶段物理验证和修版20%学会看日志和错误坐标4. 环境准备与工具链选择去流片之前先把数字前端流程跑通。目前个人开发者最常用的开源工具链是 OpenLANE SkyWater PDKProcess Design Kit。PDK 是代工厂提供的工艺文件集合包含晶体管模型、标准单元库、设计规则是连接设计工具和真实硅片的桥梁。本文以通用流程为例版本细节以实际项目为准重点演示思路。4.1 推荐开发环境操作系统Ubuntu 20.04 或 22.0464 位容器DockerOpenLANE 官方镜像硬件描述语言Verilog-2001 或 SystemVerilog仿真工具Icarus Verilog、GTKWave综合与布局布线OpenLANE内部调用 Yosys、OpenSTA、Magic、Klayout版本管理Git如果你是纯新手建议先不要在自己机器上手工编译工具链而是直接用 OpenLANE 的 Docker 镜像省去大量依赖问题。安装完成后你可以先跑一下自带的例子确认环境可用再进行自己的设计。4.2 Docker 启动命令示例# 拉取 OpenLANE 镜像 docker pull efabless/openlane:openlane_2024.06.18 # 启动容器并挂载本地设计目录 docker run -it \ -v $(pwd):/home/openlane/designs \ efabless/openlane:openlane_2024.06.18 \ /bin/bash启动之后你会进入一个包含完整 EDA 工具链的 Linux 环境。这时候可以把你的 RTL 文件导入设计目录按 OpenLANE 的分层结构来组织项目。mini_asic/ ├── src/ │ ├── my_core.v │ └── tb_my_core.v ├── config.tcl └── README.md5. 用 Verilog 完成一个最小的可流片设计为了演示整个流程我们用一个“最小数字设计”作为例子一个支持输入时钟分频和计数输出的模块它可以作为 ASIC 流程的入门级 RTL。当然bitluni 的处理器比这个复杂得多但设计流程完全一致。5.1 RTL 代码// 文件路径mini_asic/src/my_core.v module my_core ( input wire clk, input wire rst_n, input wire [7:0] cfg, output reg [7:0] cnt, output reg flag ); always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt 8b0; flag 1b0; end else begin if (cfg[3:0] 4b0) begin if (cnt {4b0, cfg[3:0]}) begin cnt 8b0; flag ~flag; end else begin cnt cnt 1b1; end end else begin cnt 8b0; flag 1b0; end end end endmodule这段代码的逻辑并不复杂当 cfg 低四位为 0 时计数输出保持低电平当 cfg 低四位不为 0 时计数器从 0 累加到对应阈值触发一次 flag 翻转然后继续循环。它展示了在 ASIC 设计中最常见的两个元素异步复位和时序逻辑。注意复位逻辑在 ASIC 里很重要。实际流片中ARSTN 的宽度和释放时序都需要做异步复位、同步释放处理否则可能引起亚稳态。我们这里为了演示简洁直接用异步复位。5.2 Testbench 代码// 文件路径mini_asic/src/tb_my_core.v timescale 1ns/1ps module tb_my_core; reg clk; reg rst_n; reg [7:0] cfg; wire [7:0] cnt; wire flag; my_core uut ( .clk(clk), .rst_n(rst_n), .cfg(cfg), .cnt(cnt), .flag(flag) ); initial begin clk 0; forever #5 clk ~clk; // 100MHz 时钟 end initial begin rst_n 0; cfg 8h00; #20; rst_n 1; cfg 8h05; // 计数到 5 翻转一次 #200; cfg 8h00; #50; $finish; end initial begin $dumpfile(tb_my_core.vcd); $dumpvars(0, tb_my_core); end endmodule运行仿真iverilog -o tb_my_core.vvp src/my_core.v src/tb_my_core.v vvp tb_my_core.vvp gtkwave tb_my_core.vcd预期现象复位释放后cnt 依次为 0、1、2、3、4到 5 时 flag 翻转之后 cnt 从 0 重新开始。如果波形不符合这个预期先检查复位时序和 cfg 信号是否被正确驱动。5.3 综合与时序约束示例OpenLANE 的配置通常用 Tcl 编写。下面是一个最小配置示例约束时钟频率为 50MHz# 文件路径mini_asic/config.tcl set ::env(DESIGN_NAME) my_core set ::env(VERILOG_FILES) $::env(DESIGN_DIR)/src/my_core.v set ::env(CLOCK_PORT) clk set ::env(CLOCK_PERIOD) 20.0 set ::env(FP_SIZING) absolute set ::env(DIE_AREA) 0 0 100 100 set ::env(SYNTH_MAX_FANOUT) 4然后运行cd /home/openlane/designs openlane --config mini_asic/config.tcl --run-tag first_run运行结束后去runs/first_run/reports/下查看面积报告和时序报告。一个健康的入门设计在 SkyWater 130nm 节点下组合逻辑级数不会太高满足约束通常不难。6. 运行结果与流片前验证当你完成仿真和综合后需要重点关注几个输出文件runs/first_run/results/final/netlist.v综合后的门级网表runs/first_run/results/final/layout.gds最终版图runs/first_run/reports/时序、面积、功耗报告建议在流片前做一次 Post-Synthesis Simulation综合后仿真也就是把门级网表放回 testbench 中跑一遍。这一步用于排除综合过程中的时序优化错误和库单元映射问题。门级仿真速度慢但在微型设计里完全可以接受很多低级错误都可以在这里提前暴露。如果这一步通过了你还可以用 OpenLANE 自带的 LVS 来对比网表和版图确保物理实现没有造成功能偏差。这一步通常不是人工判定的重点OpenLANE 会输出是否一致的结论。7. 常见问题与排查思路问题现象可能原因排查方式解决方案启动 OpenLANE 失败Docker 镜像未正确拉取或版本不兼容执行docker run hello-world验证 Docker重新拉取官方镜像或检查网络和磁盘空间综合后时序违例时钟约束过紧或代码组合逻辑过长查看reports/synthesis_timing_report.rpt放宽周期约束或优化 RTL 中的关键路径布局布线 DRC 报错标准单元间距、金属密度问题用 Klayout 打开 GDS定位具体坐标回归 OpenLANE 默认规则尽量不要手动修改 floorplan门级仿真波形异常testbench 没有正确复位或输入变化过快检查是否有 X 态传播修改 testbench 时序增加足够仿真时间流片成功后芯片上电无输出未正确配置 IO 引脚 PAD检查 padring 设计确认外部引脚映射并参考 PDK 附带的 IO 库说明8. 个人 ASIC 开发的工程建议如果你准备模仿 bitluni 的路径做自己的 ASIC 项目有几条建议值得在你动手之前认真考虑。第一先写 RTL再谈架构。个人开发者最容易犯的错误是一上来想做一个支持 Linux 的 CPU。正确的做法是先选一个非常窄的定义比如“支持 4 条指令的 8 位 CPU”或“能驱动 WS2812 LED 的控制器”然后把这个逻辑写进 RTL用仿真验证充分后再决定是否增加功能。第二仿真覆盖率比代码行数重要。流片后你无法用调试器修改逻辑所以 testbench 要尽量覆盖复位、正常、边界溢出、使能关闭等场景。哪怕只是一个计数器模块在真实工艺下出现毛刺或亚稳态的概率也比你想象的高。第三理解 EDA 工具的限制。开源 EDA 工具链已经能完成 130nm 级别的设计但它不是全自动的天网。你仍然需要理解时序路径、约束、拥塞、电源域这些概念。不然你面对一长串日志文件时会非常无助。第四MPW 服务是你的最佳选择。MPW 允许多个设计共享同一片晶圆个人只承担很小面积和掩膜成本。在功能验证完成前不要试图尝试小批量量产因为 NRE一次性工程费用非常高而且芯片生产有周期一次迭代可能就要等待数周。第五把项目当成教程来管理。如果你写博客或做视频建议把每一轮 RTL 修改、仿真波形、综合报告都记录下来。这不仅能帮助观众理解也能在你返工调试时提供重要线索。bitluni 之所以能把这个项目做成视频分享的素材就是因为他完整保留了中间过程。第六不要忽略时钟树和复位树的功耗。在 130nm 这样的成熟工艺上动态功耗主要来自时钟翻转。如果你做可穿戴或电池供电方向的产品建议用门控时钟clock gating技术这比在代码里加使能信号更节能但需要你对时钟完整性和时序验证有更多理解。9. 总结与后续学习方向ASIC 不再是大厂的专利。从 bitluni 的这次“认真做的项目”可以看到个人开发者可以通过现代开源工具链和 MPW 服务以可接受的成本完成一次完整流片。这篇文章从为什么要做 ASIC、它与 FPGA 的区别、完整设计流程、环境搭建、RTL 示例、流片前验证到常见问题和工程建议覆盖了个人 ASIC 开发的核心路径。如果你正在考虑入门建议你从一个小型计数器或温度计编码器开始先在 Icarus Verilog 和 GTKWave 下仿真通过再用 OpenLANE 跑一次综合和布局布线最后查看生成的版图和报告。走完这一轮你对“逻辑设计到物理实现”的认知会发生根本性转变。接下来值得深入的方向包括Chisel 硬件构造语言适合生成复杂处理器、SystemVerilog Assertion 断言验证提高流片置信度、低功耗设计与时钟门控、以及从标准单元库到全定制电路的进阶路径。无论如何请记住流片是一次昂贵的实验但每一次失败都能让你更接近一个真正的硬件架构师。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进