ARTICLE DETAIL

资讯详情

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

芯片逆向工程全流程:从版图提取到电路仿真实战指南

芯片逆向工程全流程:从版图提取到电路仿真实战指南 芯片逆向这事圈外人听着像黑客干的事圈内人知道它其实是个特别朴素的工程活儿——拿到一块不知道内部结构的芯片通过物理或逻辑手段把它的电路图还原出来再通过仿真验证你还原得对不对。我最早接触这块是因为一个故障分析项目一块老批次的电源管理芯片频繁烧毁原厂文档语焉不详代理商也拿不到内部原理图最后只能自己动手把芯片剖开、拍照、提电路、跑仿真一步步把失效根因定位出来。从那之后我才意识到芯片逆向不是“破解别人的知识产权”那么狭隘它在失效分析、竞争调研、供应链验证、教学研究甚至安全审计里都有实打实的应用场景。这篇文章我想完整聊一遍从版图提取到电路仿真的全流程包含我实际操作中用的工具、踩过的坑、以及为什么每一步要这么干。不管你是做硬件失效分析、学生想入门芯片内部结构、还是做安全研究的同行这篇文章应该能帮你省掉不少弯路。1. 内容整体设计与思路拆解1.1 什么是芯片逆向工程完整链路长什么样芯片逆向工程的本质是从一个已经封装好的物理实体里“反推”出它的设计逻辑。正向设计是从需求到RTL代码再到网表、版图、GDSII、流片逆向则是反过来从物理版图出发通过图像处理提取出晶体管和互连再还原出门级电路和模块功能最后用EDA工具或仿真软件做功能验证。完整链路大概是这样的芯片开盖Decap→ 显微拍照Imaging→ 图像拼接Stitching→ 版图提取Layout Extraction→ 网表还原Netlist Recovery→ 电路理解Circuit Understanding→ 仿真验证Simulation。每一步都有专门的工具也有手工操作的余地。很多人一听到“版图提取”就觉得一定要用昂贵的专业软件其实并不完全是这样。早期很多逆向工程师是用Photoshop和Excel干完整个版图提取的——Photoshop用来拼接和标注图片Excel用来管理节点和晶体管连线。现在虽然有ChipAnalyzer、NetVista这类商业化工具但核心思路没变你得先理解版图上的图形对应什么器件再把器件之间连线关系整理成网表。1.2 为什么仿真环节是逆向成败的试金石仿真在逆向流程里的角色不是最后锦上添花的一步而是验证你前面所有判断是否正确的硬性标准。版图提取和网表还原过程中人为判断难免出错——多晶硅层看错了、接触孔漏标了、管子类型正好认反了这些错误在静态看图时很难察觉但一旦进入仿真波形对不上问题立刻暴露。我自己的经验是仿真能帮你筛掉至少三成以上的提取错误。尤其对于模拟电路、电源电路、振荡器这类对器件参数敏感的设计仿真结果和实测波形一对比基本能定位到具体是哪个环节理解错了。所以这篇文章虽然标题叫“从版图提取到电路仿真”但我的建议是仿真不是最后才开始的而是从你提取第一个晶体管时就同步启动的。每提取一个小模块就立刻仿真这个小模块确认无误后再往下走。这种“边提边仿真”的方式能避免到最后一步才发现基础错了的灾难性返工。1.3 适合用什么思路来搭这套流程做芯片逆向最大的陷阱是“一步到位”的心态。芯片内部动辄成千上万个晶体管想一次全部提取完再仿真几乎必翻车。我推荐的做法是把芯片按功能模块拆解——电源域、时钟域、数字逻辑区、模拟前端、输出驱动级每个模块独立提取、独立仿真最后再合到一起做整体验证。以电源管理芯片为例你会看到带隙基准源、误差放大器、PWM比较器、驱动级、功率管和保护电路这些模块。每一个模块体量都不大先逐个搞定再连起来仿真整个环路难度就被分解了。2. 芯片开盖与显微成像——逆向的第一步也是最容易毁样品的一步2.1 化学开盖和机械开盖怎么选拿到芯片第一件事是开盖也就是把封装材料去掉暴露出芯片Die表面。常见的有两种方式化学开盖和机械开盖。化学开盖用发烟硝酸或硫酸加热腐蚀掉环氧树脂封装料优点是干净、对Die损伤小适用于绝大部分塑封芯片。操作时要把芯片放在加热台上加热到大约80到120摄氏度滴入发烟硝酸等封装料软化后用丙酮清洗反复多次直到露出Die表面。危险系数不低需要通风橱、耐酸手套、护目镜操作时务必小心酸液飞溅不是闹着玩的。机械开盖则是用研磨机或激光切割机从封装背面或侧面磨掉材料适用于陶瓷封装、金属封装这类化学方法搞不定的情况。缺点是容易磨到Die本身需要随时停下来用显微镜观察进度。我自己更常用化学开盖因为大多数现代芯片都是塑封的发烟硝酸配合加热台就能干净利落地完成。如果你是第一次操作强烈建议先用废芯片练手找找滴酸量和腐蚀时间的感觉别直接拿项目芯片做实验。2.2 显微拍照与图像拼接的关键细节开盖完成后芯片表面是一层钝化层需要再用等离子刻蚀或反应离子刻蚀RIE把钝化层去掉才能看到金属层。这时就可以放到光学显微镜或扫描电子显微镜SEM下拍照了。拍照最核心的要求是重叠率。相邻两张照片之间至少有20%到30%的重叠区域否则后期拼接软件无法自动匹配特征点。对于0.18微米以上的工艺节点光学显微镜1000倍以下足够看清金属层和大部分多晶硅对于更先进的节点就得用SEM了不过那种设备就不是一般工作室能接触到的了通常需要找专业实验室。拼接工具有很多ImageJ的MosaicJ插件、Photoshop的Photomerge、Hugin这类全景拼接工具都能用。我实际用下来Photoshop的Photomerge对芯片这类纹理丰富的图像效果最好但对电脑内存要求高一个Die几百张照片拼下来32G内存起步比较稳妥。2.3 逐层去层逐层拍照芯片不是一层而是多层——金属互连层少则三四层多则十几层。逆向时必须一层一层来拍完最上层金属照片用酸或机械研磨去掉这层金属再拍下一层。去层最常用的是混合酸磷酸、硝酸、醋酸按一定比例混合湿法腐蚀不同金属层用不同配方。铝金属层用磷酸系腐蚀液铜金属层先进工艺通常需要专门的铜腐蚀液。每腐蚀一次都要在显微镜下确认是否完全去除、下层是否暴露千万别一次腐蚀过头。这里有个特别实用的心得在拍照之前先在整个Die上做几个标记点比如用激光打几个微米级的标记。这样后续每一层照片都能以这些标记点作为坐标系对齐不然拼图和后续层间叠加会非常痛苦。3. 版图提取——从图像到晶体管和连线3.1 识别晶体管先搞清楚有源区、多晶硅和金属的关系版图提取的核心是在拼接好的芯片照片上识别出各个器件的物理结构然后判断它们的连接关系。对标准CMOS工艺来说一个MOS晶体管由有源区扩散区、多晶硅栅极和金属接触孔构成。在多张层叠照片上你需要把每一层对应起来看多晶硅横跨有源区的位置就是沟道两边分别是源和漏多晶硅本身是栅极。实际操作中我会把每张层图在图像处理软件里设为不同颜色的半透明图层叠加对齐。比如金属1层用红色金属2层用蓝色多晶硅用绿色有源区用灰色。这样一眼就能看出哪根金属连到了哪个扩散区哪根多晶硅做了栅极。识别晶体管的技巧是先找多晶硅栅再判断它跨过的有源区是N型还是P型这往往需要结合周围的阱接触和衬底接触来判断。N阱里的PMOS其源漏通常接到较高电位P衬底里的NMOS源漏通常接到较低电位。如果搞反了整个电路逻辑都是反的。3.2 打勾打点式连线记录法对于规模不大的模块几十到几百个晶体管我习惯用最原始也最可靠的方式记录连线在Excel或表格软件里建一张网表每一行是一个晶体管列包含器件编号、类型NMOS/PMOS、栅极连接的节点名、源极连接的节点名、漏极连接的节点名。每确认一个连接关系就在表格里记录下来。这个工作看似笨拙但好处是不会错出错了也能快速回溯。我用过商业化的网表提取工具自动做图案识别和连线提取但是对于老工艺或照片质量一般的案例工具的识别率并不高反而需要大量手工修正不如直接人工记录来得快。这里要提一个常见套路先用自动工具做一个初版网表再人工抽查关键器件。自动工具适合做“粗提取”找到所有晶体管的位置和大致连接人工负责修正争议部分。两种方式结合效率和准确率都能兼顾。3.3 从晶体管网表到门级电路提取完晶体管级网表以后对数字逻辑区域下一步是识别标准单元比如反相器、与非门、或非门、触发器。这个过程可以手工做也可以借助EDA软件的自动识别功能。手工识别的方法很简单看到一对PMOS和NMOS栅极接在一起、漏极接在一起这就是一个反相器多个MOS管并联串联组合在一起根据上拉网络和下拉网络的拓扑关系就能判断出是什么逻辑门。关键在于把“管子连接图”翻译成“逻辑表达式”。我碰到过最头疼的情况是芯片设计公司用了大量定制逻辑Custom Logic标准单元库里根本没有对应结构只能手动作布尔化简。这时可以用卡诺图或者直接写个小脚本把晶体管的导通条件转换成布尔表达式再用Espresso这种逻辑化简工具来帮忙。3.4 模拟模块的器件参数估算模拟电路模块运放、比较器、带隙基准、振荡器的逆向不仅要还原拓扑还要估算器件的尺寸参数。因为模拟电路的增益、带宽、振荡频率都跟晶体管的宽长比W/L直接相关。从版图照片上测量W/L的方法是多晶硅栅极的长度对应L有源区的宽度对应W。在已知照片比例尺的情况下用图像测量工具量出像素距离再换算成微米。这个步骤误差能控制在10%以内就算不错了因为照片的边缘模糊、刻蚀偏差都会影响测量精度。但是在仿真验证的时候10%的参数误差通常不会改变电路的功能定性只会影响具体的性能数值。比如一个RC振荡器算出来频率是10MHz实测是11MHz这完全正常。如果仿真和实测差了一倍以上那多半不是参数误差的问题而是拓扑理解错了。4. 电路仿真选型和实操——用RC振荡电路和BUCK电路跑通完整闭环4.1 仿真工具怎么选从Falstad到Multisim再到专业EDA电路仿真工具的选择取决于你要仿真什么层级的电路。对于刚提取完的晶体管级网表最理想的是用SPICE类工具LTspice、PSpice、HSPICE做晶体管级仿真因为网表本身是SPICE格式的而且SPICE有MOSFET模型能真实反映晶体管特性。但SPICE对新手不太友好尤其是看波形、调参数这些操作上手曲线比较陡。所以根据场景不同我常用这么几个工具组合Falstad在线电路仿真免费、零安装、打开浏览器就能用。它用色块表示电压高低电流流动动画做得非常直观特别适合快速验证一个模块的逻辑方向是否正确——比如你提取了一个反相器链接上输入信号看输出是不是真的反相了。它内置了RC振荡器等常用例子散热学起来特别快。MultisimNI家的经典工具元器件库丰富虚拟仪器功能强大。这首要是做板级电路和混合信号仿真对于芯片内部提取出来的模块也能用但需要你手动输入网表或搭建原理图。它的BUCK电路仿真模板很多用来验证从芯片逆向出来的电源控制逻辑很方便。TINA-TI.tsc文件和TI套件热搜词里的“.tsc是哪个电路仿真软件生成的文件”答案是TINA-TI。.tsc是TINA-TI的原理图文件格式TI的很多电源芯片评估板原理图都用这个格式分发如果你在逆向一个TI的电源芯片拿到官方应用电路图以后用TINA-TI打开.tsc文件能直接看到完整拓扑然后和你的反向结果对照修改。Wokwi在线电子仿真平台主打Arduino和ESP32这类MCU系统仿真对数字逻辑、嵌入式外设仿真支持很好。如果你逆向的芯片里有数字控制逻辑、状态机或外设接口可以用Wokwi搭出来做行为验证。我自己的实操组合是晶体管级的小模块几十个管子用LTspice跑SPICE仿真确认基本单元的功能然后把整个模块抽象成行为级模型比如把运放抽象成理想增益模块再用Falstad或Multisim做系统级验证如果是电源芯片这种带环路控制的最后一定要用Multisim或Simulink跑一遍环路稳定性。4.2 案例一RC振荡电路——最经典的仿真验证场景RC振荡器是芯片里极其常见的模块很多反向工程教程也会拿它开刀因为结构简单、参数好算、波形直观。我给你拆解一下我用Falstad做RC振荡电路仿真验证的完整过程。假设我从版图里提取出一个三极管或运放构成的RC相移振荡器拓扑是这样的一个反相放大器输出端通过电阻R反馈到输入端同时在反馈网络里串一个电容C利用RC的相移特性来满足振荡的相位条件和幅值条件。先在Falstad里把这个拓扑搭出来。Falstad的界面里电阻、电容、运放、三极管这些元件都在元件库里鼠标点选放置连线即可。这里特别注意反馈极性一定要对如果反馈接成正反馈且满足巴克豪森条件电路就振荡如果接成负反馈或者增益不足电路就起振不了。参数方面我提一个简单估算公式RC相移振荡器的振荡频率大约在 f ≈ 1/(2πRC√(2N)) 附近N是RC级数。比如三级RC相移的振荡器用R10kΩ、C1nF估算频率约在650Hz左右。你可以在Falstad里直接给元件赋这个值然后点击运行看输出波形是不是稳定的正弦波。Falstad最让我喜欢的一点是它的“颜色显示电压”功能节点电压高低直接以颜色深浅呈现电流以流动小球显示。一个电路如果振荡了你能看到信号在环路里“流转”起来非常直观。这比单纯看波形文件更能发现连接错误——比如某条线没接上小球流到那儿就断了。4.3 案例二BUCK电路——从芯片逆向到电源级验证BUCK降压电路是电源管理芯片里最常见的拓扑。如果你逆向的芯片是DC-DC转换器内部结构通常包含基准源、误差放大器、PWM比较器、驱动逻辑、功率MOSFET外部或内部和反馈网络。把内部模块和外部BUCK电感电容搭在一起做闭环仿真是验证你提取结果是否正确的终极测试之一。用Multisim做BUCK电路仿真时我会这样搭用逆向出来的PWM控制器模型替代Multisim元件库里已有的PWM控制芯片外接电感L、输出电容C、续流二极管或同步整流MOS管形成闭环。输入端接直流电源输出端接负载电阻。关键参数设置如下假设输入电压12V输出电压3.3V开关频率200kHz电感取33μH输出电容取47μF。负载电流设计在2A。工作过程是这样的PWM控制器输出方波驱动功率管功率管导通时电感储能、电流上升功率管关断时电感通过续流二极管释放能量、电流下降。通过反馈网络采样输出电压与内部基准通常0.8V或1.2V比较误差放大器调节PWM占空比使输出电压稳定在目标值。我在Multisim里仿真时一定会测这几个点SW节点波形应该是一个方波幅度在输入电压和地之间切换占空比约等于Vout/Vin即3.3/12≈27.5%电感电流波形应该是三角波平均值约等于负载电流2A纹波幅度约ΔI(Vin-Vout)×D/(L×f)输出电压波形稳定在3.3V附近纹波在几十毫伏级别这个验证方法非常有效仿真出来的占空比和理论值对上了说明你的PWM比较器逻辑提取没错输出电压稳在设定值说明反馈连接和误差放大器极性没错效率公式算出来和仿真一致说明功率级参数估算准确。4.4 如何在仿真中重建芯片级行为模型当你提取的模块比较多不方便全部用晶体管级仿真时行为级建模就派上用场了。行为级模型不关心内部管子怎么连接只关心“输入输出关系”符合实际电路的功能。比如提取了一个误差放大器你可以直接用一个压控电压源VCVS来模拟它的增益就是运放的开环增益带宽和压摆率按实际参数设置。提取了一个PWM比较器可以用一个理想比较器加一个锯齿波发生器来模拟。这样构建的模型跑起来快得多适合整个芯片级联仿真的场景。对于Simulink它的强项是数值分析和控制系统仿真。如果逆向的芯片是电源管理相关Simulink的电力电子库Simscape Electrical能搭建完整的BUCK、BOOST、反激等拓扑做环路补偿设计和稳定性分析。我试过把从芯片里提取的误差放大器增益模型放进Simulink搭配标准的Type II补偿网络做波特图分析得到的相位裕度和实际测试吻合得很好。4.5 仿真波形与实测数据不符时怎么排查仿真和实测对不上是家常便饭别慌。通常是以下几种情况第一器件参数估算误差太大。解决方式是扫描参数范围看仿真结果是否在一个区间内变化。比如振荡器频率对RC误差敏感你可以在仿真里分别用R9.5k、10k、10.5k跑一遍看频率变化范围然后和实测对照。如果实测落在范围内说明你的提取基本正确。第二寄生参数被忽略了。芯片内部的寄生电容、寄生电阻都会影响高频特性。比如一个反相器链版图上相邻金属线之间的耦合电容可能导致信号串扰这在高速数字电路里尤其显著。可以用版图提取工具粗略估算寄生电容加进SPICE仿真里再跑一遍通常能改善仿真和实测的偏差。第三电路拓扑本身理解错了。这是最麻烦的情况只能回到版图重新确认连接关系。我遇到过几次排除了所有其他可能后才发现当初连线记录时把一个差分对的交叉连接画反了。这种错误静态看图不容易发现往往要带着“这里会不会是反的”的怀疑重新检查。5. 常见问题与排查技巧实录5.1 版图层叠照片对不齐怎么办不同层的照片对不齐是逆向里最让人抓狂的问题。拍照时芯片有微小旋转、腐蚀液导致局部形变、显微镜视场的非线性畸变都会让叠加时特征点错位。我的经验是不要奢望一次对完全部区域分区块对齐更高效。在Photoshop或ImageJ里把Die划分成几个大的区块每个区块单独做透视变换对齐然后在区块边界处融合。对不齐严重的区域用标记点做锚定手动微调。层间对齐还可以借助CAD工具把每层照片导入到一个支持图层的CAD软件里手动移动和旋转以金属接触孔作为对准参考。因为这些孔在每一层照片里都能看到是天然的坐标基准。5.2 晶体管类型判断错误怎么避免NMOS和PMOS判断反了会让整个网表陷入混乱。避免这个错误有几个技巧看阱接触。N阱里的器件是PMOSP阱或P衬底里的器件是NMOS。阱接触在版图上通常是一块较大的扩散区连着固定的电位VDD或VSS找到它们就能划分区域。看源漏电位。在模拟电路里PMOS的源极通常接高电位NMOS的源极接低电位。你可以从电源网络倒推。看版图的图形特征。PMOS的有源区和阱接触通常离得较远NMOS和衬底接触离得较近具体工艺不同特征也不同但熟悉自己的工艺库以后会形成直觉。5.3 SPICE网表仿真不收敛怎么办SPICE仿真不收敛是最常见的仿真报错。通常原因有电路存在高阻节点、电容直接并联电压源、节点没有直流通路、初始条件设置不当。我常用的解决办法在怀疑的高阻节点上并联一个大电阻比如1GΩ提供一个直流通路但注意不要影响电路正常特性给电源设置合理的上升时间比如1ms避免电压突变检查是否有悬空节点尤其是MOS管的衬底端子是否连接正确调整仿真器选项SPICE的ITL1、ITL2迭代限制适当调大GMIN值调小有一个很常见的坑从版图提取的网表里衬底连接经常丢失。因为版图上衬底接触很隐蔽提取时容易漏掉而在SPICE里MOS管的衬底端子是必须连接的否则模型就不工作。解决方法是给所有NMOS的衬底统一连到VSS所有PMOS衬底统一连到VDD通常就能跑通。5.4 从数字逻辑反推功能时状态机和时序问题怎么看数字逻辑区域的逆向难点不在单门的识别而在于理解状态机。几百个触发器连在一起光看连接图是无法知道它实现什么功能的。我的做法是先把所有触发器的输入输出关系列成表画出状态转移图再用硬件描述语言Verilog或VHDL写出来跑行为仿真验证状态流程。如果行为仿真和芯片实测或者和文档描述的功能一致就说明数字逻辑提取正确。实际操作中还有一个高效技巧不要从一开始逆向整个控制逻辑而是先寻找芯片的测试模式Test Mode或扫描链Scan Chain利用测试接口把内部状态读出来和仿真结果比对。这样做能快速定位错误模块。6. 从单模块仿真到系统级验证的进阶经验6.1 数据管理逆向工程其实是个数据管理工程最后想聊聊经验之外的经验芯片逆向一个项目做下来产生的数据量超乎想象——几百张原始照片、几十个拼接后的层图、可能上万行的网表、几十个版本的仿真工程。如果没有一套数据管理规范项目中期开始就会陷入混乱。我的习惯是以芯片型号为根目录下面分Layers、Stitch、Netlist、Simulation、Reports五个子目录。图片来源和拼图版本用带日期的时间戳命名网表用功能模块加版本号命名仿真工程里必须附一个README记录参数设置、模型文件来源和当时的仿真目标。初期觉得这很浪费时间但过了几个项目之后你会发现之前做过的模块电路是可以复用的。我后来做第二颗芯片逆向时发现里面的带隙基准结构和第一颗几乎一样直接把网表文件拷过来修改参数省了整整两天工作量。6.2 规模扩大后如何分工协作如果逆向的芯片规模较大几十万门以上的数字逻辑单打独斗是不现实的。这时需要多人分工有人负责版图提取、有人负责仿真验证、有人负责模块语义分析。协作的关键是定义好模块接口——每个模块提取完以后必须明确输入输出信号名和时序约定输出一个标准格式的网表和仿真报告供其他人集成。我见过很多协作项目失败不是因为技术不行而是因为接口定义不清晰。A组提取的模块里信号名叫VOUTB组的电路里同样一个信号叫SW_OUT集成时对不上找错找了三天。所以再强调一次命名规范和数据管理在项目一开始就要定死不能边做边改。6.3 自主可控检测与合规提醒写到这里必须郑重提醒合规边界。芯片逆向工程在法律上是一个灰色区域具体能不能做、做到什么程度取决于目的和所在司法辖区。我在这里讨论的所有内容都是出于失效分析、安全研究、教育学习、供应链验证等正当目的并且研究对象应当是自有产品、已获授权产品或者用于纯粹的教学示例。如果你计划将逆向工程技术用于商业目的或者涉及第三方知识产权建议先咨询专业法律人士。另外某些受出口管制或涉及特定安全领域的芯片对其做逆向可能触发法律问题。在这个领域知行合规比技术本身更重要。我个人在项目中也有一条铁律不接没有正规授权来源的逆向需求不参与任何可能与侵权、盗版、绕过安全措施相关的项目做技术分享时模糊掉敏感的身份信息。技术本身是中性的但使用技术的人必须对后果负责。
返回列表