ARTICLE DETAIL

资讯详情

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

芯片逆向工程:从版图提取到电路仿真的完整技术详解

芯片逆向工程:从版图提取到电路仿真的完整技术详解 1. 为什么要做芯片逆向三种典型场景与值得投入的边界1.1 停产芯片的替代研究与参数重建先纠正一个常见误会芯片逆向工程不是只有安全实验室和专利律师才需要的技术。我接触到的真实需求往往来自于一颗已经停产十几年的电源管理芯片。产线还在用原厂不提供资料替代料参数对不上这时候最可靠的路径就是反向拆解把物理版图一层层剥出来还原成晶体管级网表再放进仿真器里把行为跑通。这整套流程——版图提取加电路仿真——就是芯片逆向工程的标准闭环。这种需求在工业控制、汽车电子和医疗设备领域尤其常见。一颗芯片要供货二十年但半导体厂商的型号生命周期可能只有五到八年。停产之后用户手里只有数据手册手册里不会写内部误差放大器的补偿网络具体怎么接、内部基准电压源的温度系数如何、PWM占空比限制点在哪。这些信息全部藏在硅片里。通过逆向工程把内部核心子电路提取出来并仿真确认就能用现有器件或分立方案做一个电气特性等效的替换设计而不是拿着手册盲目选型。1.2 合规审计与知识产权风险评估另一个重要场景是专利合规审计。半导体公司做产品规划时需要确认自家设计没有落入竞争对手的专利权利要求范围。专利文件里画的是逻辑框图或版图示意图真实芯片内部到底是不是按那个结构实现的只有把芯片开封、逐层拍照、还原出电路之后才能判断。这种应用有一个前提样品来源必须合法分析目的必须限定在合规审查或学术研究范围内不能用于盗取商业机密或规避技术保护措施。我在具体项目里遇到过的最典型情况是客户需要确认某颗竞品芯片里的标准单元库布局是否与其专利中的特定晶体管排布方式一致。逆向工程给出的晶体管级网表和关键尺寸就是做这种比对时最直接的证据。当然整个过程需要法务人员提前介入明确边界和授权范围这一步比任何技术细节都重要。1.3 失效分析与安全审计中的应用失效分析也是逆向工程的重头戏。芯片在使用过程中出现短路、漏电、功能漂移常规测试只能定位到管脚层面具体是哪一条金属连线发生了电迁移断裂哪一层介质层击穿必须靠逐层剥离和成像来判断。SEM图像里一条裂开的钨塞、一处发黑的铝线都是直接的失效证据。安全审计则是另一个方向。研究芯片的安全启动逻辑、熔丝位状态、物理不可克隆函数PUF实现或者确认某颗芯片是否留有未文档化的调试接口都需要从版图上找到对应的防护结构和传感器位置。这类工作对层间对准的要求极高因为安全相关电路往往刻意做得很隐蔽比如把某个反熔丝结构藏在两层金属之间或者把传感器阵列做成和普通逻辑单元一样的外观。等我讲到逐层剥离的环节你会理解为什么这一步这么费时费力。2. 版图提取的完整链路化学去层与高倍成像的实操细节2.1 从封装开封到裸片逐层剥离拿到一颗芯片后第一件事是开封Decap把裸片从封装里完整取出来。塑料封装的主流做法是使用热浓硝酸发烟硝酸加热到100到130摄氏度左右用滴管小心滴加在封装表面环氧树脂会逐渐软化剥离。这个过程要反复多次每加一次酸就观察一下直到裸片表面清洁露出。操作时必须全程在通风橱里进行佩戴耐酸手套和面罩因为发烟硝酸一旦接触皮肤就是严重化学烧伤。陶瓷封装则是另一套玩法机械方式比化学方式更常用。用钨钢刀沿着陶瓷盖板的缝隙撬开或者用热风台对玻璃熔封层局部加热让玻璃软化后再分离。操作经验是加热要均匀急热会导致裸片边缘的金属层鼓包。开封之后的裸片表面有一层钝化层通常是氮化硅加磷硅玻璃这层要先去掉否则后续腐蚀会不均匀。等离子刻蚀机或者稀释的氢氟酸溶液BOE都能完成这一步。逐层剥离的核心原则是每一层只去掉当前需要观测的膜层同时保住下层结构。铝金属互连层常用PAN系蚀刻液去除也就是磷酸、硝酸、醋酸的混合体系腐蚀速率可以通过稀释比例控制。二氧化硅介质层用BOE腐蚀。现代多层芯片如果层数超过四层我更倾向于用机械研磨逐层减薄配合化学腐蚀做终点检测。每腐蚀掉一层立刻在显微镜下拍照记录这种照片就是后续构建立体结构的原始证据。有一说一这一步最枯燥但也最不允许偷懒。2.2 光学成像、SEM扫描与图像拼接成像环节要分两级来打。第一级是光学显微镜全局扫描用5倍到50倍物镜把整颗裸片拼成一张完整大图目的是建立坐标体系和全局布线概貌。第二级是SEM高分辨率扫描针对金属层的最小线宽和关键区域做细节拍摄。老工艺芯片比如0.35微米及以上制程光学显微镜加SEM完全够用到了0.18微米以下金属线太密光学显微基本失效必须以SEM为主。SEM有个特别好用的功能是背散射电子成像BSE模式。在这个模式下原子序数高的材料比如钨、铝金属显示为亮色介质层和硅显示为暗色材质衬度非常清楚。我实际扫描时会把加速电压调到5到10千伏工作距离控制在10毫米左右既能看清金属层又不会让电子束穿透太多层次导致图像模糊。图像拼接我常用Fiji的Grid/Collection Stitching插件或者开源的Hugin。每张图和邻图的重复区域保持在10%到20%亮度归一到相同水平先做特征点匹配再做透视校正。一个很重要的细节是在所有拼接图的同一个位置预留几个明显的十字标记pad边缘或专门的对准mark后续GDS提取时这些标记就是层与层之间的定位基准。2.3 多边形标注与GDSII文件生成图像准备好之后开始把像素转换成几何多边形。这一步最费人工但也有一些半自动手段可以加速。我的做法是先用OpenCV做阈值分割和边缘检测把每个独立色块生成闭合轮廓再在Klayout里加载原始图像作为背景图层人工修整拐角处和模糊边界的多边形。图层规划建议从底层开始定义有源区diffusion、多晶硅栅poly、N型注入nimp、P型注入pimp、接触孔contact、金属一metal1、通孔via、金属二metal2后面还有很多层就按数字递推。在Klayout里画图时每个多边形按所在层的指定层号存放最终导出GDSII或OASIS文件。导出前务必确认单位换算GDSII的基本单位通常是1纳米或1微米但图像像素到真实尺寸的换算比例必须在此时固定下来否则后面所有W/L参数都是错的。这种手工标注方式对于一个面积为几平方毫米的芯片来说工作量极大所以实践中几乎都是先做大分区。只把关注的核心子电路区域完整提取外围电源网络和IO电路只做粗略器件识别这样能把项目时间控制在可接受范围。如果你拿到的是多金属层的复杂SoC建议干脆跳过晶体管级整片提取先做标准单元匹配把重复的逻辑子模块识别出来复用效率能高一个数量级。3. 从版图到晶体管网表器件识别与连线还原的关键判断3.1 在版图中识别晶体管、电容和电阻版图还原电路本质上就是识别三类东西器件、连线、层次关系。先讲器件识别。MOSFET的判据非常明确一条多晶硅条跨过有源区并且有源区两侧各有一个接触孔连接到金属层这个结构就是一只场效应管。多晶硅条在有源区内部的部分就是栅极有源区被栅极隔开的左右两侧分别是源极和漏极。栅极宽度W等于多晶硅条横跨有源区的宽度栅极长度L则等于有源区上方沿电流方向的多晶硅条尺寸。这个W/L数值直接决定驱动能力务必要用测量工具精确量取。电容的版图特征同样好认两层电极在垂直方向上大面积交叠中间隔着介质层。老芯片里常见的是多晶硅-多晶硅电容或金属-绝缘层-金属MIM电容外观上就是两个整齐的大方块重叠。电阻则是长条状的多晶硅或阱区两端各有一个接触孔中间没有栅极跨过整个区域就是一条电阻体。电阻值按方块电阻公式估算R Rs ×L / W其中Rs是工艺决定的方块电阻L是条长W是条宽。识别过程中最容易出错的是静电防护结构的二极管和三极管。它们的外观看上去很像正常的MOS器件但连接方式完全不同。我的习惯是先把所有疑似器件标出来不急着分类等到net连线追踪完成后再根据D/S/G/B四端连接关系反推真正的器件类型这个顺序能避免大量误判。3.2 金属连线追踪与netlist生成器件识别完成后剩下的工作就是连线和net聚类。版图里同一层金属上所有相互连通的多边形属于同一个net不同层金属之间通过contact和via互相连通。这个逻辑用几何库实现起来并不复杂先用Shapely把所有多边形的交集和并集算出来再用NetworkX把每个连通域作为一个节点层间通孔作为边最终把整个图构建起来。我建议的工程做法是写一个Python脚本自动完成连通域标注但结果一定要回到Klayout图形界面里人工复核。原因很简单图像上相邻但并不接触的多边形在几何运算里很容易因为舍入误差被误合并而反过来金属线条上的小缺口又会让本属于同一net的区域被拆成两段。这两种错误单独靠脚本很难完全避免。脚本输出的是带net编号的器件连接表。每只晶体管记录四个节点漏极D、栅极G、源极S、衬底B每个节点都对应一个net编号。电阻电容同样记录两端节点。最后把这些信息翻译成SPICE网表举一个最简单的例子NMOS管示例 M1 Dnet5 Gnet3 Snet4 Bnet4 W2.0u L0.5u 电阻示例 R1 n1 n2 5.6k 电容示例 C1 n1 n2 2p只要器件参数和net编号无误这份网表就可以直接送去仿真。3.3 无参考LVS与标准单元匹配正常的芯片设计流程里有LVS版图与原理图一致性检查因为存在原始原理图可对照。逆向工程不一样手里没有原始原理图所以只能做“无参考LVS”。它的目标是做结构合理性自检。我会检查几件事是否存在既没接电源也没接地线的悬空net电源net和地net之间有没有不该出现的低阻通路所有器件的源漏是否都完整接到了某个net上。这些都是版图提取阶段最容易埋下的低级错误在仿真之前必须清干净。如果目标芯片是数字逻辑部分占主导的还有一条加速路径标准单元匹配。老工艺芯片里反相器、与非门、或非门、触发器等标准单元都有相对固定的版图模板只要提取一小块区域把各层的几何关系做成模板然后在整颗芯片版图上做模板匹配就能批量识别出大量重复单元直接生成门级网表。这一招的效果极其明显尤其是对带数字控制逻辑的电源管理芯片或传感器读出芯片。有些带AI协处理器的视频SoC也是靠这个思路先切分区域再做层级还原而不是执着于每个晶体管都手工标注。4. 电路仿真验证从SPICE网表到真实波形4.1 网表清洗与老工艺模型参数预设提取出来的网表通常不能直接扔进仿真器原因有三net命名混乱、器件尺寸异常、模型参数缺失或不适配。我的标准流程是先写一个清洗脚本做器件重命名、孤立节点删除、并联器件合并。并联MOS管在版图里很常见几个管子共享源漏是为了增大驱动能力在仿真时可以等效成一只等比例管能显著减少仿真时间。仿真器选择方面我不建议一上来就用现代小尺寸工艺模型因为提取出来的是老芯片没有PDK支持硬套先进模型只会得到一堆不收敛的报错。实用做法是用SPICE的Level 1或Level 3 MOS模型按工艺节点经验预设参数然后跑环振频率做校准。下面是我常用的老工艺NMOS模型卡.model nmos1 nmos ( level1 vto0.7 kp80e-6 gamma0.4 lambda0.05 tox25n )vto即阈值电压0.7伏适合大多数0.35微米到数微米的老工艺芯片。kp是跨导参数影响器件电流能力。lambda是沟道长度调制系数老工艺大约0.02到0.1之间。这些值只是起点最终要通过与实测波形比对来修正这一点下面专门讲。单位是最容易翻车的点。SPICE网表里所有物理量都没有显式单位按照国际单位制处理。像我上面的W2.0u表示2微米。如果版图提取时用的是纳米这里就必须写成0.002u或者2000n写错一个数量级仿真结果就完全没法看。4.2 以RC振荡电路为例走一遍瞬态仿真RC振荡电路是验证提取结果最理想的对象因为周期主要由R和C决定跟晶体管模型的细节关系不大。我们来走一遍完整过程。假设从某颗老芯片里提取出来的核心振荡器由两个反相器、一个反馈电阻和一个定时电容组成。首先把反相器定义成子电路然后把电阻电容值从版图里量出来。比如R10千欧C100皮法理论振荡频率约等于1/(2.2乘以R乘以C)算出来约454千赫兹。SPICE网表写成这样* 反相器子电路 .subckt inv in out vdd vss mp out in vdd vdd pmos1 w4u l0.5u mn out in vss vss nmos1 w2u l0.5u .ends * 主电路RC振荡器 X1 in n1 vdd 0 inv X2 n1 out vdd 0 inv Rfb out in 10k Cout out 0 100p VDD vdd 0 DC 5 .tran 0.1u 2m uic .measure tran freq_stable TRIG AT 0.5m TARG AT 1.5m .end这里的uic表示使用初始条件直接开始瞬态分析不加初始条件的话某些振荡器电路会停在直流工作点上起振不了。跑完仿真之后在Ngspice的波形界面里量一下振荡周期或者直接用.measure语句输出频率再和理论值对比。如果两者偏差在20%以内说明R和C的提取基本正确如果偏差过大先回去检查电阻条的宽度测量和电容面积估算而不是急着改模型参数。4.3 用Buck电路仿真验证功率级提取结果RC振荡电路验证的是模拟小信号路径Buck电路则是验证功率级的好载体。如果逆向对象是一颗同步Buck控制器版图里一定能找到高侧功率MOSFET和低侧功率MOSFET它们通常面积巨大在金属层上就是几块很大的金属覆盖区域很容易定位。提取出功率MOSFET后需要在网表外围补上实际应用中必然存在的器件输入电源、电感、输出电容、负载电阻。开环仿真时用PWM脉冲源直接驱动高侧和低侧栅极注意预留死区时间否则高侧还没关断低侧就开通会形成直通短路。仿真参数可以这样设输入12伏目标输出5伏开关频率100千赫兹电感10微亨输出电容47微法。运行瞬态仿真后观察SW节点波形、输出电压纹波以及电感电流纹波。这种仿真最能暴露提取错误的是导通电阻Rds(on)。高侧管和低侧管的Rds(on)由版图里MOSFET的W/L决定。如果提取时把W算小了Rds(on)偏大仿真里的开关损耗和输出纹波会明显异常如果高侧低侧的死区时间没有留对波形上会出现负压尖峰那是体二极管导通的标志。实际中我会先用示波器测出真实芯片的开关频率和SW波形再反过来调整网表里的死区时间和寄生电感参数直到两者波形形状相匹配。4.4 常见电路仿真工具怎么选仿真工具的选择取决于你要验证什么层级。我列一个常见的对照表方便你根据项目阶段直接判断。工具类型适合场景注意事项Ngspice开源本地SPICE批量脚本化仿真、老工艺晶体管级网表收敛性一般需要指定初始条件LTspice免费本地快速瞬态仿真、复杂拓扑验证元件库丰富手写老工艺模型注意语法格式Falstad Circuit Simulator在线交互教学演示、快速验证电路拓扑逻辑和模拟元件都有但不精确不能直接跑SPICE网表Wokwi在线数字逻辑、单片机嵌入式仿真偏数字方向模拟器件支持有限Simulink / Simscape桌面系统级Buck环路建模、数字控制策略验证适合控制环路不适合晶体管级电路TINA-TI桌面教育场景、原理图级仿真如果你拿到后缀为.tsc的文件可以优先用TINA-TI打开顺便回应一下那个很多人问过的问题.tsc是哪个电路仿真软件生成的文件答案是TINA-TI的原理图工程文件后缀。TINA-TI德州仪器提供的免费版教育圈用得很广。老工程师手里如果留有一些历史电路文件.tsc出现的频率不低。这类文件只能在TINA-TI里打开其他仿真器不兼容迁移到Ngspice或LTspice时只能手动重建网表。5. 仿真结果与实测对标误差从哪来怎么消除5.1 仿真与实测对不齐的核心原因仿真跑通了不代表项目结束。真正的考验是把仿真结果和真实芯片的实测波形放到一起对比。误差基本来自四个方面。第一是阈值电压Vth偏差。老芯片没有官方PDK我们预设的Vth很可能是0.7伏但实际工艺可能在0.5伏到0.9伏之间浮动。Vth对环形振荡器频率影响极大差0.1伏频率能差出百分之二三十。第二是寄生参数缺失。版图提取时我们关心的是器件但金属连线的电阻、层间电容、Pad电容全部存在于真实芯片上。这些寄生在高频行为里会被放大RC振荡器频率、Buck开关毛刺都明显受它们影响。第三是图像定位误差。手动描绘多边形时边缘轮廓偏进去或偏出来0.1微米器件的W/L比例就变了。第四是缺少温度模型。我们通常只做室温仿真实际芯片工作温度可能是60度甚至更高迁移率和阈值电压都会变化。举个实际例子我做过一颗低速RC振荡器的逆向提取理论频率用提取的R和C算出约480千赫兹SEM图像也拍得很清楚但实际芯片刚上电只有410千赫兹。我没有急着改仿真参数而是先做了一遍版图复查发现定时电容的下极板还有跳线连出去额外接了约10皮法的分布电容。把这段金属连线的寄生电容加进网表后仿真频率降到395千赫兹和实测的差距就拉回到了百分之五以内。这件事告诉我仿真和实测不一致时第一怀疑对象永远是提取阶段有没有漏掉连接关系而不是仿真器精度。5.2 用可测指标反向校准工艺参数校准的思路要反过来做用实际可测的板上信号反推工艺参数而不是猜一个参数硬凑结果。推荐的校准顺序是先用环振频率锁定Vth再用静态电流锁定kp最后用高频波形锁定寄生R和C。环振频率对Vth极其敏感对其他参数没那么敏感所以它最适合做第一校准点。在Ngspice里扫描vto从0.5伏到0.9伏每0.05伏跑一次瞬态仿真看哪一组仿真频率和实测频率重合就选哪个vto。接下来看静态电流调整kp使静态电流仿真值接近实测值。如果目标芯片是电源管理类产品SW节点波形是最重要的校准基准。把仿真波形和示波器实测波形叠在一起看主要看三个特征开通沿的上升斜率、关断沿的负压尖峰、稳态纹波的频率和幅度。这三样分别对应Rds(on)、寄生电感和输出电容等效串联电阻。每调整一个参数就重新跑一次仿真直到波形整体重合这时候提取的网表才算真正可信。5.3 反复走完全流程后总结的避坑清单最后整理一组实操注意事项都是我实际项目里踩过坑之后沉淀下来的经验。去层阶段的每一层照片都必须留档。后续层间对准全靠这些照片一旦漏拍可能只能重做整颗芯片的剥离。层间对齐标记要在GDS导入前就画好。每层图里至少留三个不在同一直线上的基准点否则后面做布尔运算时层与层错位连net都会接错。不要忽略静电防护电路。IO pad旁边的ESD保护器件会影响输入阻抗和输出电容仿真时必须保留否则端口波形会失真。先做子模块仿真不要一上来跑整颗芯片。整颗芯片网表动辄上千个器件一旦不收敛很难定位问题。把核心子电路切出来单独仿真跑通了再逐步合并。模型参数的单位要强制统一。我见过太多次因为W/L单位少写一个u导致功率管驱动能力差了一千倍的情况。发现仿真偏离实测太远优先回版图复查连接关系而不是连续调模型参数。参数调得再多也弥补不了一条net错接的问题。这套从版图提取到电路仿真的全流程我完整走过几次后最大的体会是芯片逆向工程从来不是哪个软件一键生成结果而是图像处理、几何分析和电路仿真三种能力的接力。图像质量决定提取上限电路功底决定仿真还原度中间全靠脚本和耐心缝合。如果你正准备开始第一个逆向项目建议不要直接挑战多层的复杂SoC先选一颗老工艺的单功能芯片比如一颗运放或一颗小功率Buck芯片从上到下完整跑一遍。等这条链路在你的机器上真正走通之后你对版图、器件、仿真三者之间关系的理解会比读十本教材都扎实。
返回列表