芯片逆向这事,圈外人听着像黑客干的事,圈内人知道它其实是个特别朴素的工程活儿——拿到一块不知道内部结构的芯片,通过物理或逻辑手段把它的电路图还原出来,再通过仿真验证你还原得对不对。我最早接触这块是因为一个故障分析项目:一块老批次的电源管理芯片频繁烧毁,原厂文档语焉不详,代理商也拿不到内部原理图,最后只能自己动手,把芯片剖开、拍照、提电路、跑仿真,一步步把失效根因定位出来。从那之后我才意识到,芯片逆向不是“破解别人的知识产权”那么狭隘,它在失效分析、竞争调研、供应链验证、教学研究甚至安全审计里都有实打实的应用场景。
这篇文章我想完整聊一遍从版图提取到电路仿真的全流程,包含我实际操作中用的工具、踩过的坑、以及为什么每一步要这么干。不管你是做硬件失效分析、学生想入门芯片内部结构、还是做安全研究的同行,这篇文章应该能帮你省掉不少弯路。
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振荡器等常用例子,散热学起来特别快。
Multisim:NI家的经典工具,元器件库丰富,虚拟仪器功能强大。这首要是做板级电路和混合信号仿真,对于芯片内部提取出来的模块也能用,但需要你手动输入网表或搭建原理图。它的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相移的振荡器,用R=10kΩ、C=1nF,估算频率约在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误差敏感,你可以在仿真里分别用R=9.5k、10k、10.5k跑一遍,看频率变化范围,然后和实测对照。如果实测落在范围内,说明你的提取基本正确。
第二,寄生参数被忽略了。芯片内部的寄生电容、寄生电阻都会影响高频特性。比如一个反相器链,版图上相邻金属线之间的耦合电容可能导致信号串扰,这在高速数字电路里尤其显著。可以用版图提取工具粗略估算寄生电容,加进SPICE仿真里再跑一遍,通常能改善仿真和实测的偏差。
第三,电路拓扑本身理解错了。这是最麻烦的情况,只能回到版图重新确认连接关系。我遇到过几次,排除了所有其他可能后,才发现当初连线记录时把一个差分对的交叉连接画反了。这种错误静态看图不容易发现,往往要带着“这里会不会是反的”的怀疑重新检查。
5. 常见问题与排查技巧实录
5.1 版图层叠照片对不齐怎么办
不同层的照片对不齐,是逆向里最让人抓狂的问题。拍照时芯片有微小旋转、腐蚀液导致局部形变、显微镜视场的非线性畸变,都会让叠加时特征点错位。
我的经验是:不要奢望一次对完全部区域,分区块对齐更高效。在Photoshop或ImageJ里,把Die划分成几个大的区块,每个区块单独做透视变换对齐,然后在区块边界处融合。对不齐严重的区域,用标记点做锚定,手动微调。
层间对齐还可以借助CAD工具:把每层照片导入到一个支持图层的CAD软件里,手动移动和旋转,以金属接触孔作为对准参考。因为这些孔在每一层照片里都能看到,是天然的坐标基准。
5.2 晶体管类型判断错误怎么避免
NMOS和PMOS判断反了,会让整个网表陷入混乱。避免这个错误有几个技巧:
看阱接触。N阱里的器件是PMOS,P阱或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组提取的模块里信号名叫VOUT,B组的电路里同样一个信号叫SW_OUT,集成时对不上,找错找了三天。所以再强调一次:命名规范和数据管理,在项目一开始就要定死,不能边做边改。
6.3 自主可控检测与合规提醒
写到这里,必须郑重提醒合规边界。芯片逆向工程在法律上是一个灰色区域,具体能不能做、做到什么程度,取决于目的和所在司法辖区。我在这里讨论的所有内容,都是出于失效分析、安全研究、教育学习、供应链验证等正当目的,并且研究对象应当是自有产品、已获授权产品,或者用于纯粹的教学示例。
如果你计划将逆向工程技术用于商业目的,或者涉及第三方知识产权,建议先咨询专业法律人士。另外,某些受出口管制或涉及特定安全领域的芯片,对其做逆向可能触发法律问题。在这个领域,知行合规比技术本身更重要。
我个人在项目中也有一条铁律:不接没有正规授权来源的逆向需求,不参与任何可能与侵权、盗版、绕过安全措施相关的项目,做技术分享时模糊掉敏感的身份信息。技术本身是中性的,但使用技术的人必须对后果负责。