拓冰建站拓冰建站
首页 / 资讯中心 / 正文

芯片设计全流程:从RTL代码到硅片

不少朋友第一次接触“芯片设计”四个字容易觉得这是实验室里穿着无尘服、对着显微镜搞的神秘工种。但真在这个行业里待过就会发现芯片设计和做软件、做硬件开发一样本质是一套把“想法”逐步变成“实物”的工程流程。只不过这个“实物”不是手机App也不是一块电路板而是一块指甲盖大小的硅片。从你脑子里的功能定义到写Verilog代码再到版图、光刻、流片、测试中间要跨越的关卡比想象中多得多。这篇文章我想以一名设计工程师的视角把“从代码到硅片”的完整路径捋一遍。不管你是刚入门的学生、写嵌入式软件的工程师还是想了解芯片行业的投资人都能从中看到一枚芯片是怎么从一行行代码变成实实在在的硅片的也能避开我在实际项目中踩过的一些坑。整个过程我会尽量讲得直白一点涉及具体工具和步骤时也会把原理说清楚方便你在自己的项目里直接参考。1. 先建立全景图一枚芯片从“代码”到“硅片”要闯几道关1.1 芯片设计的抽象阶梯芯片设计最反直觉的一点是它看着像写代码实际却是在“用代码描述物理器件”。整个流程可以理解成一层层向下“翻译”的过程。最顶层是架构定义决定这颗芯片要做什么、支持哪些功能、接口长什么样。接着是RTL设计工程师用Verilog、SystemVerilog这类硬件描述语言写出模块行为这大概相当于软件工程师手里的“源码”。再往下综合工具把RTL转换成由标准单元组成的门级网表也就是把“代码”转成“元器件清单连接关系”。到了后端布局布线工具再把这个网表铺到具体的硅片面积上画成一层层版图。最后版图交给晶圆厂通过光刻、刻蚀、沉积、掺杂这些工艺步骤在硅片上做出真实电路。这个从抽象到具体的阶梯和软件开发的层次有可比性。你在文本文档里写Python代码它不会自己“跑”起来需要解释器或编译器把源码变成机器能执行的指令芯片设计也一样RTL代码最终要通过综合、布局、布线变成光掩膜图形才能刻到硅片上。区别在于软件代码运行在已经存在的CPU上而芯片设计是在“凭空造出这枚CPU本身”所以它的验证成本和出错代价都比软件开发高得多。1.2 复杂SoC和简单芯片共用一套流程骨架一颗复杂的SoC比如瑞芯微的RK3588芯片内部相当于一座微型城市CPU核心是住宅区GPU是娱乐中心NPU是专门做AI运算的加速器ISP负责图像信号处理内存控制器是交通枢纽各类外设接口像城市出口总线则是贯穿全城的主干道。高通那类车载芯片更夸张NPU架构里还包含多级缓存、张量加速单元、向量处理单元和专门的调度器一旦把架构图画出来密密麻麻的模块连接会让你头皮发麻。但别被复杂的SoC吓住更常见的其实是TP4056、CP4054这样的小芯片。就拿TP4056来说这是一颗锂电池充电管理芯片内部功能就是恒流充电、恒压充电、充满检测和温度保护。CP4054是SOT-23-5封装的单节锂电充电芯片功能更简单网上很多设备坏了之后都会问“5脚CP4054坏了用什么芯片代替”答案通常是找同类型的4054或4056做成模块替代。这类芯片整个设计流程不会超过几个月内部可能就几百个门电路但它同样要走RTL设计或者更直接的全定制模拟设计、版图绘制、流片和测试。流程的骨架其实是固定的设计、验证、制造、测试、量产。区别只在规模和工艺难度。所以下面每个环节我会先用一颗复杂芯片作为主线来讲解再提醒你这部分在小芯片项目里通常如何简化避免为了理解流程而陷入不必要的细节。2. 前端设计代码是如何“翻译”成电路结构的2.1 硬件描述语言与软件代码的思维差前端设计最核心的语言是Verilog和SystemVerilog。很多人一开始会犯一个错误把Verilog当成C语言来学写完一段代码就想让它“从上到下依次执行”。这是一个非常危险的理解方式。软件代码是顺序执行的逻辑。比如快速排序算法、C语言的文件读写操作、用Python画爱心之类的代码跑在CPU上时是“一条指令接着一条指令被取指、译码、执行”的依赖的是冯·诺依曼体系里“程序计数器不断往后跳”的机制。而硬件描述语言不一样它描述的是一大堆同时工作的电路模块。举例来说你在Verilog里写两个always块它们在仿真和实际电路里是并行发生的谁先谁后取决于事件触发和信号关系而不是代码行的位置。所以写RTL的时候脑子里应该想的是“这行代码会综合成什么电路”是触发器还是组合逻辑是选择器还是比较器而不是“程序走到这一行会做什么”。这也是为什么很多从纯软件转过来的工程师会非常痛苦。写惯Python、Java的人习惯“一次做一件事”但写RTL要求你同时考虑几十个模块的并发行为、相互握手、时钟域关系。用工具方面现代EDA环境里也有代码补全和示例代码库能帮你少敲很多重复代码但思维方式的转变没有任何工具能替你完成。2.2 一个最小模块的RTL长什么样举个最简单的例子你要设计一个分频器把100 MHz时钟分成1 MHz时间上就是每50个周期翻转一次输出。RTL代码差不多是这样的module clk_div( input wire clk, input wire rst_n, output reg clk_out ); reg [5:0] cnt; always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt 6d0; clk_out 1b0; end else if (cnt 6d49) begin cnt 6d0; clk_out ~clk_out; end else begin cnt cnt 1b1; end end endmodule这段代码综合后会变成一组D触发器和一个比较器加加法器而不是什么“程序逻辑”。这里面有个很重要的细节非阻塞赋值“”模拟的就是触发器在时钟沿同时更新的行为如果你错误地用它做组合逻辑综合出来的电路几乎肯定会出问题。实际项目中分频器往往不会直接用计数器在每个周期翻转一次而更倾向于用锁相环或数控分频器但原理门槛是没变的。从“代码”到“硅片”的第一步就是把这些用文字描述的电路行为变成EDA工具能接受的输入。后面综合工具来分析它、优化它、映射到标准单元库最终变成一张“零件清单”。你会忽然发现RTL代码实际是这个设计流程中人类最能直接阅读、最容易验证修改的一层再往下就是工具的天地了。2.3 验证占掉70%工时不是开玩笑RTL写完之后接下来的工作才真正让人掉头发验证。流片一次很贵尤其先进工艺。7nm芯片光是掩膜版费用就是几百万美元起步28nm稍微便宜但还是六位数人民币级别哪怕用成熟工艺流片一片MPW多项目晶圆的几百纳米工艺往往也要几十万人民币。如果芯片流片回来发现逻辑有bug意味着几百万成本直接打水漂。所以业界几乎把一半以上的人力压在验证上。验证工程师要搭testbench、写UVM验证环境、做断言、跑回归最后还要统计覆盖率。代码覆盖率只是入门指标它只能告诉你“代码里哪些行被执行过”但功能覆盖率、断言覆盖率、跨时钟域覆盖率每一项都关系到芯片是否真正满足设计规格。我个人的经验是一个中等规模的SoC项目设计团队可能就十个人验证团队差不多也是这个规模但验证消耗的机时和调试时间往往比设计本身多出好几倍。很多新入行的工程师都急着成为“写RTL的人”却低估了验证的意义。真正做过项目之后你会明白写出一个能综合、能跑仿真、覆盖率达标、最终流片成功的RTL背后最花精力的不是“写功能”本身而是一轮又一轮的边界检查、异常路径处理和跨团队沟通。3. 逻辑综合与DFT电路开始“显形”还得为测试留后门3.1 综合把RTL变成门级网表RTL经过前端验证之后进入逻辑综合阶段。综合工具比如Synopsys Design Compiler会把RTL代码映射到工艺厂商提供的标准单元库上。这个标准单元库里面有什么有与非门、或非门、反相器、D触发器、锁存器、多路选择器、加法器单元等每种单元还有不同驱动强度、不同面积、不同功耗的版本。综合最关键的是约束文件也就是你要告诉工具“这颗芯片要跑多快”。最简单的一条约束是时钟周期比如“时钟频率500 MHz周期2 ns”。综合工具会尝试把RTL中的逻辑路径安排在2 ns的时间内完成信号传播超出这个时间就用更快的单元、更合理的结构去优化面积和功耗作为次要目标再调整。这就引出了芯片设计里经典的“三角权衡”速度、面积、功耗不可能三者全占只能根据产品定位取舍。到了这一步“代码”已经变成了电路网表。你可以把网表理解成一份庞大的连线表里面列出了所有用到的标准单元以及它们之间的连接关系。从软件工程师的角度看RTL最后编译出来的不是“可执行文件”而是“硬件图纸”。3.2 DFT与芯片测试PAT控制很多人第一次听到“PAT”是在芯片测试机的调试现场被吓了一跳。PAT并不是什么神秘咒语它是“Pattern”的缩写指的是测试机ATE跑在芯片上的测试向量文件。芯片测试的核心逻辑很简单给芯片灌入输入激励采样输出信号和预期结果对比判断这颗芯片是好还是坏。所谓的芯片测试PAT控制就是如何去写、去调试、去控制这些pattern在测试机上的执行顺序、时序关系、电压电流条件。但芯片内部有数百万甚至数十亿个晶体管光靠芯片外部引脚可没法把信号送到每个角落。这就需要一个关键设计DFT可测性设计。最常用的是扫描链技术。芯片正常工作模式下触发器各干各的进入测试模式后寄存器被串成一条长链测试机通过移位把激励注入到触发器再捕获电路内部状态经过一系列移位读出来。也就是说芯片在流片之前设计工程师就已经为“体检”留好了通道。DFT覆盖率是芯片能否量产的重要指标如果覆盖率不够测试机测不出来某些潜在故障这些坏芯片可能流到客户手上造成更严重的售后问题。所以我在项目里养成了一个习惯越早接入DFT越早跑覆盖率分析越早回头改RTL的可测性问题后面就越省事。等网表都固定了再补DFT痛苦程度会翻几倍。3.3 低功耗与安全启动设计阶段的隐藏战线除了功能和可测性现代芯片设计还得考虑两件不那么显眼的事功耗和安全。功耗方面时钟门控是最基本的手段把一个模块不工作时的时钟直接关掉能省下大部分动态功耗更复杂点的还有多电源域设计让某些模块在待机时彻底断电动态电压频率调整DVFS则用在CPU、GPU这类场景按负载实时调节电压和频率。安全方面SoC芯片启动时通常会有安全启动Secure Boot流程。BootROM里的代码会读取外部固件用SHA-2哈希校验摘要、再用公钥验签确认固件没有被篡改才允许执行。这句话和软件世界里经常出现的“SHA-2代码签名补丁”是一回事只不过在芯片里验签代码通常被固化在芯片内部你在应用层根本看不见但它决定了固件能不能顺利启动。设计阶段如果不提前考虑安全密钥存储、信任根、加密引擎后面想补就难了。4. 后端物理设计把电路真正“画”到硅片上4.1 布局布线到底在做什么前端交付的是一张“零件清单”但工厂真正需要的是“每个零件放哪、走线怎么走”。这活叫物理设计也就是常说的芯片后端。后端流程一般从Floorplan开始就是决定各个模块在硅片上的大致位置。CPU放左上角GPU放右上角内存控制器挨着DRAM接口模拟模块离数字逻辑远一点。摆放位置直接影响后面布线难度和电源网络质量。接下来是标准单元布局这个过程中要考虑拥塞度、时序、功耗分布再往后是时钟树综合名字很形象要把时钟信号从时钟源同步送到成千上万个寄存器尽量让每个寄存器收到时钟沿的时间一致这就是时钟偏斜控制。最后是布线将所有单元的真实金属连线布完还要反复检查时序收敛、天线效应、电迁移之类的问题。版图工程师和工具日夜加班终于交付了一个GDSII文件。这个文件就是芯片的“设计图纸”里面记录了每一层光罩的图形坐标晶圆厂拿到它就可以做掩膜版。很多人以为到这一步设计就结束了其实后端还有个“设计规则检查”要过比如金属最小宽度、间距要求这些规则如果违反工厂制造出来就是断线短路产品直接报废。4.2 制程工艺里的物理坑为什么28nm和7nm差别巨大因为工艺尺寸越小单位面积能塞进的晶体管越多速度越快、功耗越低但代价是物理效应越来越难搞。先进工艺下一根金属线的电阻、电容、耦合噪声都会影响信号传播。IR Drop问题就是电源网络上的压降想象一下整栋楼的人同时开空调电压往下掉芯片里电源供应不足时序就容易崩。天线效应则是刻蚀过程中导体表面积聚电荷可能击穿栅氧化层需要在布线规则上做跳层处理。还有电迁移金属原子在电流作用下会逐渐迁移细线可能过几年“断掉”这种可靠性问题必须在设计时控制电流密度。从个人经验来说后端阶段的调试难度往往不在某一个点而在于“修好东墙补西墙”。你解决了某条路径的时序违例结果旁边模块的拥塞度又超标了你优化了电源网络IR Drop好了但布线资源紧张。做后端一定要有全局视野不能头痛医头。4.3 射频芯片的板载天线设计是后端里的“附加题”不是所有芯片都要面对射频问题但如果你碰的是ESP32-C5这种带Wi-Fi的芯片或者任何需要板载天线的射频SoC那后端设计就要多出不少麻烦。ESP32-C5的板载天线设计是一个被反复讨论的话题因为天线这东西不能用普通数字布线的思路去处理。板载天线最核心的是净空区天线周围不能铺地、不能走线否则会改变天线的谐振频率和辐射效率。其次要走线阻抗控制常见的是50欧姆单端线线宽、到地平面的距离、介电常数都会影响阻抗最好用场仿真工具算一遍。再就是天线匹配网络串联电感、并联电容需要放在天线馈点附近元件位置稍偏一点驻波比就变得很难看。实际做板子的时候我会建议至少留出PI型匹配网络的位置方便后面实测时调试。芯片设计过程中如果涉及射频方法也一样电磁仿真必须提前介入不能等全部布局完成再开始。5. 流片、测试与首次启动芯片的“出生”与“第一次呼吸”5.1 从GDSII到硅片光刻制造简述GDSII文件到了晶圆厂制造过程就开始了。晶圆厂先根据版图做出一套光掩膜版每一层电路图形对应一张“底片”。晶圆本身是高纯度硅棒切出来的薄片表面会依次经历氧化、涂胶、曝光、显影、刻蚀、沉积、离子注入等步骤把图形一层层“印”上去。光刻的原理可以简单理解成把掩膜版上的图形通过紫外线投影到涂了光刻胶的硅片上胶被曝光后发生化学变化显影后露出需要刻蚀的区域再用等离子体把多余的材料去掉。晶体管就是这么一层层堆出来的。流片周期通常要几个月从提交到拿到第一批晶圆短则两三个月先进工艺可能大半年。这个过程出了任何问题连带成本和时间都极其昂贵。所以设计团队经常把“流片前评审”当成一场考试所有模块的负责人、验证负责人、后端负责人、测试负责人围在一张桌子上反复核对已知问题清单。宁可晚几周提交也别带着大家都知道的风险去流片这是行业里用教训换回来的共识。5.2 晶圆测试与封装测试芯片出厂前的两道质检硅片制造完成之后一大片晶圆上整齐排列着几百上千颗Die裸片。这时候不能直接拿去卖要先经过CP测试也就是晶圆测试。测试机会用探针卡扎在每颗Die的焊盘上跑一遍pattern把明显坏掉的Die标记出来。这一步的意义是尽早淘汰坏片避免封装费用浪费在坏片上。之后晶圆被切割成单颗Die好片送去封装。封装不只是把芯片包起来还要把芯片的PAD连接到引脚或焊球上。我们常用到的TP4056、RK3588、ESP32都是封装后的成品。封装完成之后还要做FT测试也就是成品测试在不同温度条件下再跑一遍完整的芯片测试pattern确认封装过程没有引入新问题。芯片正式出货前所有测试数据都会被记录在案用于后续质量分析。值得一提的是现在很多产品制造环节也依赖视觉识别。比如OpenPnP这类开源贴片机底部相机在某些芯片上识别不了最常见的原因就是芯片表面反光太强、引脚形状复杂、Mark点对比度不够。这虽然不是晶圆厂测试环节但思路是相通的芯片表面特征必须让机器“看得清”“看得准”无论是测试探针接触还是贴片机视觉定位都要求封装设计和表面印刷有足够的可靠性。5.3 首次上电与SoC启动流程芯片开始“说话”芯片封装回来测试都过了这还不算完。设计师拿到第一批样片后最激动的时刻就是Bring-up第一次上电。启动一个全新的SoC工程师要依次检查很多点。首先要看电源是否正常各电压域的时序是否符合设计预期然后看时钟是否起振PLL能不能锁定接着通过调试接口尝试连接CPU内核看看能否读取寄存器。一切正常后芯片会按照BootROM里的引导代码从外部存储加载bootloader再把操作系统或应用固件加载起来。这就是SoC芯片启动的标准路径。在启动过程中最容易被忽略的就是软件工具链的配套。很多刚接触STM32的开发者第一次问的问题是“STM32芯片包怎么安装”“Keil5怎么安装STM32芯片包”实际上Keil MDK安装设备支持包DFP之后才能识别特定型号的芯片。ST官方提供DFP包安装后在芯片选择列表里才能看到STM32H723这类型号。对一颗新芯片来说如果IDE不支持、启动文件不对、Flash算法不匹配哪怕芯片本身设计没问题开发者也很难用起来。芯片从“硅片”变成“能跑代码的器件”还要靠完整的软件生态来补上最后一公里。就连蓝牙SoC这类低功耗芯片也一样。像富芮坤的芯片虽然硬件功能都做出来了但开发者普遍关心的还是怎么OTA升级固件。你会发现芯片能不能顺利把新固件下载进去、能不能安全地切换启动分区很多时候比的不是芯片强弱而是Bootloader写得是否顺滑、协议栈是否成熟。6. 从芯片到产品工程师避坑清单与学习路径6.1 常见问题速查表从选型、资料到工具链这么多年下来我积累了不少从芯片选型到量产的踩坑经验。下面这张表整理了我遇到频率最高的问题以及对应的排查方向方便你直接对照参考。现象可能原因排查与解决方案芯片型号在Keil/IAR里找不到未安装对应厂商的DFP/芯片包去官网下载Device Family Pack并安装重启IDE后再选型贴片机/OpenPnP识别不了芯片反光、引脚对比度差、Mark点不清调整光源角度和亮度改用背光或侧光更新视觉模型必要时加画Mark点Windows提示代码31驱动加载失败驱动不匹配或芯片进入异常状态检查驱动版本设备管理器删除设备后重扫确认电源和复位引脚电池充电ICTP4054等烧了输入电压过高、引脚接反、散热不足先查datasheet的绝对最大额定值换同类型IC前确认引脚定义一致芯片有型号但查不到资料型号被定制或渠道不透明用完整丝印反查找原厂代理要datasheet和errata测试机pattern跑不过PAT中时序约束与芯片实际不符用示波器抓实际波形核对测试机电平、驱动沿、采样沿芯片功耗偏大时钟门控没生效、电源域配置错误检查低功耗配置寄存器确认各模块时钟是否被真正关断有一个经验值得单独拿出来说拿到任何一款新芯片第一件事不是看原理图模板而是通读datasheet和errata。errata是芯片原厂后来发现的问题清单里面会写清楚哪些功能有坑、怎么规避。很多“怎么调都不对”的诡异故障翻errata往往能省下几天时间。6.2 想入行芯片设计怎么走才不迷茫如果你看完整个流程产生了“我也想试试”的念头那就再补充一点学习路径的建议。芯片设计不是一个能靠“看视频”学会的领域它非常依赖实践和工具。第一步是把数字电路基础打牢触发器、组合逻辑、时序分析这些是理解所有EDA工具结果的前提。第二步学Verilog和SystemVerilog重点不是背语法而是看到一段RTL能说出它综合出来是什么电路。第三步上一块FPGA开发板FPGA虽然不是ASIC但它在“用代码描述硬件”这个思维训练上和芯片设计完全一致。等你把FPGA上的UART、SPI、状态机、FIFO都调通再回头学逻辑综合、DFT、后端就会顺畅很多。如果你已经在做嵌入式开发想转芯片设计你的调试经验其实非常值钱。你更懂芯片最终是怎么被使用的更懂外设行为是否符合实际需求这些在芯片定义阶段非常关键。我个人见过不少优秀的芯片架构师都是从嵌入式软件出身的。但也要有心理准备芯片设计岗位普遍对学历和理论基础要求更高数学、时序、物理方面的知识短板早晚都要补。当然如果没有条件进入大型芯片公司也有很多小项目可以练手。比如自己用开源EDA工具写一点RTL用综合工具跑一遍标准单元流程或者在现有SoC平台上试着修改外设逻辑。哪怕只是把一颗TP4056的规格书研究透能讲清楚它是怎么实现恒流恒压切换的也已经比大多数人更接近芯片设计的本质了。最后分享一个我自己感触很深的细节。芯片设计流程里有一个“sign-off”的概念意思是每个环节结束时负责人要在检查清单上签字确认愿意为这个环节的质量承担后果。这种习惯在其他行业里很难见到但它让人对“交付”这件事非常敬畏。从代码到硅片每一次签名背后都是无数个加班的夜晚、无数条被推翻的方案、无数个在测试机上反复跑不到的pattern。可也正是这些看似繁琐的流程让我们能安心地把一颗芯片交给下游的千万开发者让他们去创造更有趣的应用。希望这篇文章能把这条路的轮廓讲清楚让你少走一些弯路。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门