十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

从RTL到硅片:自研芯片设计、验证与回片测试全流程实战

从RTL到硅片:自研芯片设计、验证与回片测试全流程实战 “我们造了一颗芯片而且它很快。”这句话写在项目周报里很容易但真正把它变成现实需要走完一条很长的路需求定义、架构评估、RTL 编码、验证收敛、逻辑综合、布局布线、FPGA 原型验证、流片、回片、上电、联调最后还要跑完一轮性能测试。这篇文章不聊 PPT只讲三件事一颗芯片从代码到硅片的完整流程是什么在量产之前你用什么手段证明它“快”以及第一次做芯片的团队最容易在哪里翻车。如果你之前主要在写嵌入式 C 代码、GPU Kernel 或者搞 AI 模型部署对“造芯片”的印象可能还停留在“烧钱、周期长、门槛高”。确实是这样。但这个门槛并不是只属于大型半导体公司的一个十几个人的硬件团队只要验证策略合理、工具链选型正确、回片测试计划到位也能把一颗专用加速芯片从源代码变成物理硅片并且做到功能稳定、性能达标。这篇文章的方式以团队自研加速芯片的全流程为背景尽量不依赖具体型号和工艺节点重点讲清楚每个环节要做什么、要验证什么、要收集哪些数据。目录概览如下先看核心能力与适用边界然后是环境准备、RTL 设计与仿真、综合与后端、FPGA 原型验证、回片测试、批量回归脚本、资源与性能观察最后是问题排查和工程经验。每部分都会给出可直接落地的操作建议以及踩坑后的排查思路。如果你正准备启动一个芯片项目或者只是想搞明白“为什么别人能做出很快的芯片、我们能不能复刻”这篇文章可以直接收藏。1. 核心能力速览能力项说明设计语言SystemVerilog / Verilog 为主配合 Python、Make、Shell 做自动化验证验证手段RTL 功能仿真、FPGA 原型验证、回片后板级测试三层递进主要特点面向专用计算的流水线设计强调时序收敛、吞吐率与功耗控制性能指标工作频率、关键路径延迟、吞吐率、功耗以流片后实测数据为准对外接口常见接口包括 AXI、SPI、UART、I2C 和 GPIO具体以芯片手册为准开发平台Linux 工作站 商业 EDA 或开源工具链 FPGA 开发板批量支持RTL 回归脚本、自动化测试用例批量跑、日志与波形自动归档使用边界必须使用授权 IP遵守知识产权与出口管制规定不仿冒他人版图快速解读一下这个表。最核心的能力不是某一项“黑科技”而是把设计、验证、实现三层串起来的能力。RTL 写得好只能算开始验证能否在短时间内收敛、综合后时序是否能满足约束、回片后能不能稳定跑起来才是真正拉开差距的地方。这篇博客的重点也放在这条链路上。至于“它很快”这个结论不是靠嘴说的。要同时满足几个条件功能仿真全部通过FPGA 原型验证得到预期的吞吐数据流片回片后指标与仿真趋势一致关键路径余量充足功耗没有击穿封装上限。任何一环掉链子这句话都只是一句“周报文学”。2. 适用场景与使用边界这种自研芯片最适合的场景是算法明确、数据流固定、对实时性或者功耗有强需求的专用计算任务。典型例子包括图像预处理加速、音频信号处理、AI 推理加速、数字信号滤波、协议控制器等。比通用 CPU 更容易把时频做高因为流水线结构是为固定工作负载定制的不需要处理过多指令集兼容问题。但并不是所有项目都适合自研芯片。如果算法还在频繁变动、需求每两周重写一版那只适合在 FPGA 上做快速迭代不要急着流片。原因很简单芯片的物理设计周期远比 FPGA 工程改造长一旦算法变化牵动数据通路和存储结构RTL 层面的修改会逐级放大到后端、封装和测试环节成本几何级上升。另一个不适合的场景是团队没有专职验证工程师而是让写 RTL 的人顺手验一下。一个没有覆盖率和约束驱动的验证流程带着 bug 去流片流片回板发现问题后再想修补基本只能靠 eco 和软件 workaround代价非常高。还要明确知识产权和合规边界。芯片设计过程中使用的 EDA 工具必须来自正规授权渠道IP 核按授权范围使用不能把某个开源内核改名后声称自研也不能直接复制竞争对手的版图或 RTL。流片、封装、测试环节涉及的技术和材料也要确认符合当地出口管制和贸易合规要求。芯片如果包含数据采集、网络通信、音视频处理等能力使用场景还要满足隐私和数据安全法规未经授权不得采集或传输个人信息。专业一点的说法是能力越强边界越要提前画清楚。3. 芯片开发环境准备与前置条件芯片开发的软件环境与普通嵌入式开发差别很大主要分三块RTL 设计、逻辑仿真、综合与物理实现。先看一套比较通用、也能在本地快速跑起来的环境配置。3.1 操作系统与硬件优先选择 Linux推荐 Ubuntu 20.04 或 22.04。不要用 Windows 直接跑大型综合工具文件路径、符号链接、脚本兼容性会带来一堆额外问题。如果是单机开发内存建议 64GB 起步CPU 核数越多越好因为仿真和综合都是并行密集型任务单核性能反而没那么关键。磁盘建议预留 200GB 以上EDA 工具安装、波形文件、综合报告都会占空间。3.2 开源工具链安装如果项目处于早期架构探索、模块级验证阶段可以先不购买商业 EDA用一套开源工具链跑通流程Icarus Verilog 做功能仿真GTKWave 看波形Verilator 做高频仿真加速Yosys 做逻辑综合验证。# 安装基础工具 sudo apt update sudo apt install -y git make gcc g python3 python3-pip \ iverilog gtkwave verilator # 安装 cocotb用于 Python 驱动 RTL 验证 pip install cocotb这套环境适合验证小规模模块但不要指望它直接替代商业工具做大型 SoC 综合。开源工具链适合拿来学习、做算法验证、写小模块测试进入大中型工程后还是需要商业 EDA 或者学校、公司的流片资源。3.3 FPGA 原型验证平台除了软件仿真还要一块容量合适的 FPGA 开发板。选型看两个指标逻辑单元数量和 DSP 数量是否覆盖目标设计以及是否包含足够的高速接口。如果是验证一颗图像加速芯片可能需要 HDMI 输入输出或者 MIPI 接口如果验证的是 AI 加速器要看板卡存储器带宽是否接近目标芯片的带宽假设。对第一次做芯片的团队来说FPGA 板卡上跑通意味着芯片架构大概率没有结构性问题值得把这块资源提前准备到位。3.4 回片测试仪器流片回板后的调试需要的东西包括逻辑分析仪或高性能示波器用于抓总线信号。可编程电源用于控制核电压、IO 电压和上电顺序。JTAG 下载器与调试软件用于读寄存器和控制复位。万用表、热成像仪用于排查电源短路和局部过热。回片测试环境看起来像个嵌入式调试现场但数据记录和自动化要求更高。建议一开始就把所有测量仪器接入测试机通过脚本抓取数据而不是靠人眼读屏幕。4. 从 RTL 到 GDSII一颗芯片是怎么造出来的这个章节讲芯片制造之前的完整实现链路。即使你只是做 RTL 前端也建议了解后端做什么因为很多性能问题是在前端设计阶段就埋下的。4.1 RTL 设计与微架构第一步是把功能需求拆成模块确定数据通路、控制状态机和流水线深度。这里用一颗简单的乘加单元举例它代表一个典型的加速器数据通路片段。// 一个带使能信号的乘加单元 // 注意这是教学示例代码实际芯片中的 MAC 结构会更复杂 module mac #( parameter DATA_WIDTH 16 )( input logic clk, input logic rst_n, input logic valid_in, input logic [DATA_WIDTH-1:0] a, input logic [DATA_WIDTH-1:0] b, output logic [2*DATA_WIDTH-1:0] result, output logic valid_out ); logic [2*DATA_WIDTH-1:0] acc; always_ff (posedge clk or negedge rst_n) begin if (!rst_n) begin acc 0; valid_out 1b0; end else begin valid_out valid_in; if (valid_in) acc acc a * b; end end assign result acc; endmodule写 RTL 时最容易犯的错误是一上来就堆大片 always_ff把多个功能耦合在一个状态机里。更好的做法是独立模块化设计每个模块只做一件事用 valid/ready 握手信号隔离。这样后续做性能优化、插流水级、加低功耗控制都会容易很多。微架构层面决定芯片“快不快”的关键往往不是单个模块的实现而是流水线之间的匹配度。4.2 逻辑综合与时序约束RTL 写完后不能直接送去流片。先要做逻辑综合把 RTL 转成门级网表。综合需要约束文件最关键的是时钟约束。# 综合约束示例周期需按目标芯片实际情况换算 set clk_period 2.0 create_clock -period $clk_period [get_ports clk] set_clock_uncertainty 0.05 [get_clocks clk] set_input_delay 0.2 -clock [get_clocks clk] [all_inputs] set_output_delay 0.2 -clock [get_clocks clk] [all_outputs]综合报告里最需要关注的是 setup 时序余量和 critical path。如果某条路径的延迟占满了时钟周期说明设计在该频率下无法收敛需要优化流水线、调整逻辑结构或者放宽约束。这里有一个常见误区盲目调低时钟频率换取时序收敛。频率降下来了芯片“快”的属性就没了应该优先优化关键路径。4.3 布局布线、DRC/LVS 与签核综合完成后的门级网表还要经过布局布线把逻辑门和触发器等物理单元摆到芯片版图上连接数以亿计的金属导线。这一步主要靠后端的 EDA 工具但前端工程师需要参与两部分一个是时序报告会回馈到 RTL 设计如果某些模块的面积或延迟超出预期需要回到前端改代码另一个是 DRC/LVS也就是版图规则检查和网表一致性检查只要通过才能进入签核、生成 GDSII 文件并交付流片。签核阶段还会做功耗分析和电源网络验证确保芯片在实际运行中的电压降和电流密度不超标。回片后出现偶发崩溃很多都是这一步的模型没覆盖全所以在设计阶段就要把电源意图、时钟树结构定义清楚。4.4 流片、封装与回板这一步是把 GDSII 文件交给晶圆厂制造。流片周期从几周到几个月不等取决于工艺节点和封装复杂度。流片期间不建议干等着最佳做法是准备测试板、编写回片测试程序、整理批量回归脚本。芯片封装回来后首先做短路和开路测试再上电、烧录固件、检查时钟然后才能开始功能调试。5. 功能测试与效果验证怎么证明它快“快”是一个需要被测量的指标。测试越早开始越好回片之前就要在仿真和 FPGA 上留下性能基线。5.1 RTL 仿真测试统计时钟周期在 RTL 阶段性能指标主要靠两个数据一个是完成特定任务需要多少个时钟周期另一个是在某个时钟约束下能否完成时序收敛。先用 testbench 确认功能正确。timescale 1ns/1ps module tb_mac; logic clk; logic rst_n; logic valid_in; logic [15:0] a, b; logic [31:0] result; logic valid_out; mac #(.DATA_WIDTH(16)) u_mac ( .clk (clk), .rst_n (rst_n), .valid_in (valid_in), .a (a), .b (b), .result (result), .valid_out(valid_out) ); initial begin clk 1b0; forever #5 clk ~clk; end initial begin rst_n 1b0; a 16d0; b 16d0; valid_in 1b0; repeat (10) (posedge clk); rst_n 1b1; (posedge clk); valid_in 1b1; a 16d3; b 16d5; (posedge clk); valid_in 1b0; wait (valid_out 1b1); (posedge clk); if (result 32d15) $display(PASS: result%0d, result); else $display(FAIL: result%0d, result); $finish; end endmodule跑完仿真后观察波形要关注 valid_out 和 result 的时序关系。如果 valid_out 发出时 result 还没有稳定说明握手逻辑有问题。要测试“快”除了功能正确还要记录数据从进来到出去的周期差异这决定芯片的实际吞吐能力。5.2 FPGA 原型验证提前采样性能FPGA 原型验证的意义是在真实时钟和真实接口环境下跑一遍设计。FPGA 的频率通常低于 ASIC但可以验证结构上有没有瓶颈。比如 DMA 读取数据、运算单元处理、DDR 写入这三个环节能不能流水并行。如果 FPGA 上实测吞吐率远低于仿真预期大概率是总线带宽或存储访问冲突造成的这类问题越早发现越好。FPGA 上还要测功耗。板卡上的电流数据可以反映设计在真实数据激励下的动态功耗水平。嵌入式工程师习惯直接在板子上量电流芯片前端工程师则需要把功耗、频率、电压三者关联起来看形成一张类似“能效曲线”的观察表用来判断在某个频率下功耗是否合理。5.3 回片测试用实测数据说话芯片回片后测试流程要分成几个阶段上电无短路测试先看电源电流是否异常大再检查各电压域电压值。时钟与复位测试确认 PLL 能不能锁定复位释放后模块是否进入预期状态。寄存器读写测试通过 JTAG 或 UART 访问寄存器确认片上接口正常。功能单元测试跑一遍 RTL 仿真用过的同样用例对比结果。性能基准测试跑实际应用场景下的 benchmark记录延迟和吞吐。回片测试最大的坑是上电时序。多个电源域如果没按规格上电芯片会出现闩锁或者寄存器状态不确定。第一次回板测试环境不要急着自动化先把最小步骤人工跑通每一步都记录波形和电流再逐步扩大测试范围。5.4 性能 benchmark 设计性能 benchmark 要与芯片目标场景强相关。如果芯片是图像加速器就播放一段固定视频帧统计处理一帧需要的平均周期数如果是 AI 推理器就选几组典型网络结构统计单次推理延迟与功耗如果是协议控制器就测量大流量下的丢包率和最大吞吐。测试数据要具备可重复性输入样本不能变环境温度和供电电压要尽可能稳定记录的数据要包括时钟周期、时间戳、功耗和关键路径余量。6. 自动化回归与批量测试脚本芯片验证会跑大量用例。手动跑一遍不现实必须有自动化回归和批量测试。下面这套脚本的思路适用于模块级 RTL 验证与回片后的测试程序复用把测试用例用统一的目录结构组织起来每次一键运行并输出 PASS/FAIL 总结。import subprocess from pathlib import Path CASES [test_mac, test_adder, test_pipeline] def run_case(name: str) - None: Path(build).mkdir(exist_okTrue) compile_cmd fiverilog -o build/{name}.vvp tb_{name}.sv {name}.sv compile_res subprocess.run( compile_cmd, shellTrue, capture_outputTrue, textTrue ) if compile_res.returncode ! 0: print(f{name}: COMPILE_FAIL) print(compile_res.stderr) return run_res subprocess.run( fvvp build/{name}.vvp, shellTrue, capture_outputTrue, textTrue ) if run_res.returncode 0 and PASS in run_res.stdout: print(f{name}: PASS) else: print(f{name}: FAIL) print(run_res.stdout) print(run_res.stderr) if __name__ __main__: for case in CASES: run_case(case)批量任务要特别注意三点。第一每个用例独立目录避免共享文件互相覆盖。第二失败用例保存完整日志和波形否则后人很难复盘。第三脚本要固定 EDA 工具版本和路径最好用 Docker 或统一装机镜像冻结环境否则换一台机器跑测试结果可能对不上。对回片后的测试自动化回归也有意义。测试板和测试机之间通过串口或以太网建立连接每次执行一组用例后把结果回传如果某个用例失败自动保存当时的寄存器快照。这样在芯片问题定位时能节省大量时间。7. 资源占用与性能观察做芯片的人常把“资源占用”挂在嘴边但要分清楚说的是哪种资源。RTL 仿真阶段看的是 CPU 和内存占用综合与布局布线阶段看的是磁盘、内存和许可证回片测试阶段看的是功耗、电池电流和接口带宽。这三类资源观察方法完全不同。先说仿真阶段。大型 SoC 仿真很耗时通常要开多核并行同时需要几十 GB 内存。如果仿真速度明显变慢先看是不是波形 dump 过多。不要全层级 dump用配置只抓关键信号或按时间段 dump能大幅降低资源占用。VCD 文件是文本格式体积很大有条件时使用 FSDB 或缩减采样率的波形格式归档压力小很多。再谈芯片实现阶段的面积和功耗。面积主要看综合报告里的逻辑面积、存储器数量和 IO cell 数量。功耗则区分动态功耗和静态功耗。动态功耗跟翻转率强相关数据通路的频繁翻转会显著拉高功耗因此要做时钟门控和操作数隔离。静态功耗主要由泄漏电流造成工艺节点越先进越明显。很多团队看功耗只看峰值会忽略平均功耗在连续运行场景里的影响这两者都要追踪。“快”最后要反映在能效上。比如一个加速器用 200 MHz 跑在 0.8V 核电压下芯片电流是 1.2A算出功耗约 0.96W吞吐率 12 GOPS那能效就是 12.5 GOPS/W。同样是 12 GOPS如果功耗跑到 2W能效降到 6在移动设备场景就不合格。所以测性能不能单看频率和吞吐功耗和时钟频率是一起读的。降低功耗的常见手段包括在数据通路中插入操作数隔离逻辑让未使用的模块保持不动对片上存储器做 bank 级时钟门控对多级流水线做动态电压频率缩放负载低时降频降低电压。每一条都在 RTL 阶段就要设计进去后端工具能优化一部分但优化空间比前端设计阶段小很多。8. 常见问题与排查方法芯片项目的排错链路很长这里整理十几个经常遇到的问题按现象分组。问题现象可能原因排查方式解决方案仿真波形大量出现 X/Z复位未释放、信号未初始化查测试台复位时序和信号初值补复位完善初始值逻辑综合后 setup 时序违例关键路径过长、约束不合理看 critical path 报告插入流水级优化组合逻辑综合后面积异常大代码写成了不可综合风格、资源复用不足报告里按模块统计面积重构模块增加资源共享FPGA 频率远低于 ASIC 预估组合逻辑过深、布线拥塞看时序报告与资源利用率调整流水划分减少跨区域路径回片后上电就短路电源网络短路、封装异常先用万用表量电源对地阻抗联系封测检查测试板焊接回片后寄存器可以访问但功能功能不输出内核时钟未稳定、使能信号未拉高逻辑分析仪抓内部时钟信号检查 PLL 配置检查复位释放批量回归脚本换机器就失败工具版本或路径不一致打印脚本运行环境用 Docker 或固定工具链性能与仿真预测差异大芯片实际功耗导致降频、总线带宽不足比较实测波形和仿真波形定位瓶颈模块调软件或微架构芯片发热严重动态功耗过大或短路热成像和电流测试降频、优化翻转率、电源管理每个问题对应不同排查工具但有一条共同经验不要拍脑袋改代码先复现问题再用波形或日志定位。仿真阶段的问题用波形定位FPGA 上的问题用 chipscope 或逻辑分析仪定位回片后的硬件问题则要用示波器和寄存器快照结合判断。9. 最佳实践与工程建议第一颗芯片项目要控制风险不要追求把所有指标一次做到极致。一个更稳妥的路线是先在 FPGA 上跑通最小功能集再逐步加入高级特性。很多团队一开始就奔着“高性能”去设计复杂的异步多核架构结果验证资源跟不上流片延期。不如先把基础流水线做稳跑完一遍全流程再优化。建议从一开始就建立一套“最小可运行验证环境”。具体包括一个简单的 RTL 模块、一个能打印 PASS/FAIL 的测试台、一条可重复执行的仿真命令、一个看波形的流程。后续所有的复杂功能都在这套基础环境上叠加。环境越简单新人上手越快迭代速度也高。RTL、验证用例、约束脚本、综合报告、FPGA 工程、测试数据这些资源要按项目阶段分别建立目录使用 Git 管理并设置不要直接在主干上跑大改。回片前的 freeze 清单最好也提前准备确认所有 RTL 变更都通过了回归测试、所有约束文件都没有 TODO、所有文档都同步更新然后把当前版本打一个 tag防止之后想回退时找不到历史版本。外部工具集成方面如果芯片有对外接口测试板自动化测试平台要限制访问范围不能把调试口直接暴露到外部网络批量测试任务要加日志和失败重试机制避免单个用例卡住整个回归进程。涉及人脸、指纹、音视频、网络行为等数据采集的场景必须确认数据来源合法、用户授权明确测试数据不能使用未脱敏的真实数据。发布或者商用前的复核也很重要。功能级别复核的是逻辑正确性性能级别复核的是吞吐和延迟达标功耗级别复核的是芯片在各工作模式下的电流表现。三者都通过后再考虑对外发布结论。10. 总结与下一步一颗芯片“很快”的结论最终来自完整的验证链条RTL 功能仿真证明逻辑正确综合时序报告证明频率收敛FPGA 原型验证证明系统可运行流片回板后的性能测试证明物理硅片与设计预期一致。四层验证都通过才可以说“我们造了一颗芯片而且它很快”。对整个项目而言最值得尝试的其实是把完整流程跑通一次哪怕是拿一个小规模功能模块走一遍从 RTL 到 FPGA 的过程也能让团队对芯片开发有整体认知。最先应该验证的是基础功能仿真和 FPGA 上的数据吞吐这两项能反映架构问题。最容易踩坑的地方是时序收敛它既是后端问题也是前端架构问题建议在项目早期就通过模块级频率目标来约束 RTL 设计。后续可以继续扩展的方向包括采用更先进工艺节点增加片上存储容量扩展指令集或数据通路宽度加入低功耗待机模式以及设计更完善的 debug 观测架构。芯片设计是一个迭代工程第一颗芯片跑通之后第二颗的挑战就在低功耗和性能调优上而不是还在基础流程里挣扎。希望这篇博客能给想入局自研芯片的团队一个可靠的路书。建议收藏备用后面流片排期和回片测试时会经常需要对照查看。
返回列表