
Cadence Virtuoso IC617是我这几年来每天都在用的模拟/混合信号IC设计环境。从画原理图到跑仿真再到版图和后仿几乎被各种小问题折磨过无数遍。原本是在工位上零散记笔记后来发现组里新来的同事反复问同样的问题就把这些内容整理成一个“技巧收集区”覆盖安装环境、原理图、ADE仿真、版图验证、PEX和常见报错。内容不算系统教程更像是一份踩坑笔记适合刚上手IC617的学生和刚接触模拟IC设计的工程师参考也欢迎老手继续补充。1. 环境与安装IC617最容易被卡住的几步1.1 选系统、装依赖、配许可一个环节都不能省IC617最常见的安装环境是CentOS/RHEL 6或7我自己用的是CentOS 7整体兼容性比较省心。如果你只有Ubuntu也不是完全不能用但需要额外处理一堆系统库兼容问题小白阶段建议直接在虚拟机里装CentOS省下的时间足够把后面的仿真流程跑通了。系统准备好之后磁盘空间要留够。IC617安装包解压后动辄十几个GB而且工作目录、仿真缓存、临时文件都会吃空间根目录和home都建议预留60GB以上。别等仿真跑到一半报磁盘满那种情况不仅浪费时间还会把积累的仿真数据搞乱。许可证这块不同公司/学校流程不一样但核心是环境变量要指对。常用的变量是LM_LICENSE_FILE或CDS_LIC_FILE指向license文件或license server的porthostname。很多第一次安装的人把环境变量写在多个配置文件里结果启动时加载了两遍license manager端口冲突virtuoso起来后立刻报错。我的做法是把许可相关的配置统一写在一个文件里只在~/.bashrc或~/.cshrc中source一次。依赖库方面最常见的报错是启动时提示缺少libXp.so.6、libXpm.so.4这类X11老库。用yum install libXp libXpm装一下就行如果用的是CentOS 7可能还要装compat-libXp。另外虚拟机上跑virtuoso时DISPLAY变量和环境要一致否则软件起不来或者界面闪烁普通用户常常忽略这一点。1.2 环境变量和启动脚本source一次就好很多人把virtuoso、icfb这些命令直接绑到PATH里然后用系统默认的shell启动结果每次都要重新手工export一堆变量。我建议写一个专门的启动脚本比如start_ic617.sh内部设置好所有环境再启动避免污染系统环境也方便切换不同版本。一个参考的bash版本脚本大致是这样的#!/bin/bash export CDS_INST_DIR/opt/cadence/IC617 export CDS_ROOT_DIR$CDS_INST_DIR export CDS_LIC_FILE5280your_license_server export PATH$CDS_INST_DIR/tools/bin:$CDS_INST_DIR/tools/dfII/bin:$PATH export LD_LIBRARY_PATH$CDS_INST_DIR/tools/lib/64bit:$LD_LIBRARY_PATH export DISPLAY:0 ulimit -s unlimited virtuoso注意ulimit -s unlimited这行有些IC617在加载较大版图时如果栈空间受限制会莫名崩溃加上这一句能减少很多诡异问题。启动脚本做好之后在安装目录或者home下放一个以后每次直接执行即可。还有一个容易被忽视的点不要重复source环境文件。有时候为了省事把环境配置同时写进/etc/profile、~/.bashrc、~/.bash_profile然后每次打开终端都来回加载看起来命令能用了实际环境变量可能是旧的叠加值。遇到过几次PDK路径指向错误都是这样造成的。1.3 关于IC617的几个特性OA库、多线程和内存IC617默认使用OpenAccessOA数据库和老版本的CDBA不兼容。如果你从IC5141或更老的版本迁移过来工艺库和Design Library要手动转换不能直接复制文件夹。PDK厂商一般会提供转换流程或者你可以在CIW窗口里用CDB2OA菜单操作转换前务必备份原库转换后要检查instance、pin和property是否完整。IC617对多线程仿真的支持也明显更稳。比如spectre仿真可以开启多核-mt模式在ADE L的Setup-Simulation Options里配置。不过要跑多核必须确认PDK模型和所使用的仿真器版本支持不然会收到“parallel simulation not supported”的提示。设计很大的时候开4核通常能省一半时间特别适合后仿和corner批量仿真。内存问题也值得提前重视。IC617在版图编辑和PEX提取时如果内存不够往往不是直接报错而是开始卡顿、闪退最后弹一个崩溃窗口。机器建议至少16GB内存跑大型RF或混合信号项目最好32GB以上。遇到大版图时关闭多余的窗口和后台仿真能明显改善体验。2. 原理图绘制与网表生成每天都会用到的高频技巧2.1 画原理图前先记住这几个快捷键原理图编辑器是每天接触最多的界面快捷键熟练度和画图速度直接挂钩。IC617里最常用的几个快捷键我列在下表里新手可以先背这几个再逐步扩展功能快捷键备注添加器件实例iAdd Instance画导线wAdd Wire添加引脚pAdd Pin复制cCopy移动mMove拉伸sStretch撤销uUndo查看属性qProperties全图缩放适配fZoom Fit添加网络标号lWire Name / Label有一个很容易犯的错用复制快捷键c复制器件后点击鼠标左键确定位置但如果此时没改坐标或没有按Esc退出会一直处于复制状态。尤其在大原理图中很容易复制出一堆重复器件。我习惯复制完成后立刻按Esc再检查一下新器件的坐标。连线的时候如果想让节点自动对位建议打开Options-Editor里的“Add Wire Auto-Target”选项。这功能能根据当前鼠标位置自动吸附到最近的pin或线段画复杂模块时特别省力。总线的连线名要写成bus3:0的形式统一命名规则不然LVS跑出来的网表容易对不上。2.2 同网络高亮选择从杂乱的图里快速抓出目标“怎么选中同一个网络”是群里被问过很多次的经典问题。在Virtuoso Schematic Editor中点击某一根导线后用菜单Edit-Select-Net或者直接按快捷键ShiftS就能把整个网络连通的导线、引脚、线名都选中。这个操作在查看电源网络、地网络和反馈环路时非常有用配合q查看属性能快速理解一个陌生模块的连接关系。在版图编辑器中也有类似功能叫“Select Net”同样能基于连通性选中整个网络。如果要用高亮突出某个网络可以用菜单Highlight-Highlight Net选择网络名即可。高亮颜色可以自定义我通常给电源用一种颜色地用一种颜色这样调试寄生参数时一眼就能分辨。如果你的设计是层次化结构跨页连接容易出问题。IC617中跨页要用off-page connector通常在analogLib里可以找到。如果运行“Add Intersheet Reference”时报错多半是off-page connector的名字重复或者方向不对。我遇到时的处理方式是先把所有跨页符号删除重新统一添加再执行Tools-Add Intersheet Reference选择“Update All”日志里就不会再报duplicate的错。2.3 自制symbol和HDL模型库别总依赖PDK自带库很多时候PDK自带的symbol不够用或者想快速建一个行为级模块比如理想放大器、ADC/DAC模型可以用Create-Cellview-From Cellview从schematic自动生成symbol。生成后记得编辑symbol引脚顺序让它们和版图逻辑一致不然画顶层图时引线会乱七八糟。如果你会用Verilog-A/AMSIC617自带的ahdlLib是非常好的参考库。里面有很多行为级器件模板比如理想电阻、压控振荡器、开关电容等。新建一个cellview时在Library Manager里选择ahdlLib下的VerilogA符号然后右键选择“Edit Verilog-A”就能写自己的模型文件。使用这类HDL模型时要注意仿真view的选择。很多新手把模型写在verilogaview里但仿真时没有把该cell的view列表改成veriloga结果还是调用默认schematic或symbol导致行为模型根本没生效。我在仿真前会在ADE的Setup-Environment里查看“View List”是否包含veriloga通常加上veriloga放在spectre之前模型才能正确加载。2.4 导出BOM和网表导之前一定要Check and Save从原理图导出BOM是“导出一时爽检查火葬场”的重灾区。IC617里Tools-Export-BOM可以直接输出CSV/Excel但模板中的列名要和器件属性一致比如Value、Part Number、Manufacturer。有些工程师画schematic的时候喜欢把电阻值直接写在instance name里而没有填Value属性导出的BOM就会缺少核心信息。我的习惯是在导出前先做一次Check and Save确认所有器件都有完整属性和连线。这个操作还能顺带检查有没有浮空引脚避免导出网表和LVS时产生疑问。导出CDL网表时同样要先保存使用Tools-Export-CDL然后把关键选项比如“Include Library Cell Properties”打开否则后仿阶段在PEX中容易丢失参数。还有一个小技巧如果你在原理图里引用了多个库中的同名cell导出网表时容易混淆。建议在项目开始时就把参考库固定下来不要在中途随意替换否则网表里会出现大量路径不一致。3. 仿真设置与结果分析ADE L/ADE XL实战3.1 模型库和工艺角怎么设置才不容易翻车仿真第一步不是画电路而是确认模型库加载正确。在ADE L中选择Setup-Model Libraries添加PDK提供的模型文件例如xxx.lib或xxx.scs同时要指定工艺角。不同PDK对工艺角的命名不一样有的叫tt/ss/ff有的叫typical/slow/fast需要查PDK文档。在模型库窗口里每一行模型文件后面都有一个“Section”字段直接填tt或$(corner)。如果填的是$(corner)就可以通过全局变量批量控制corner。例如在Variables-Edit里添加变量corner tt之后把corner改成ss后重新仿真所有模型都会跟着换。这种方法比手工改每个模型文件路径高效得多特别是在多工艺角批量仿真时。ADE XL在工艺角处理上更直观它把corner、温度、电源电压都抽象成独立的“Corner”对象每个corner可以勾选不同的变量组合。配置好之后可以一键跑满全corner。注意corner文件和section设置同样要提前验证否则跑完一大堆任务才发现模型加载错误浪费计算资源。有个容易踩的坑路径中的空格或中文。PDK模型文件路径尽量不要放在带空格和中文的目录下spectre在读取时容易报“unable to open file”或更奇怪的解析错误。我一般把所有PDK和设计文件放在/home/xxx/pdk和/home/xxx/design这样的纯英文路径下。3.2 瞬态仿真不收敛先查DC再调参数最后才怀疑算法“瞬态仿真不收敛”几乎每个模拟工程师都会遇到IC617的报错信息通常很笼统比如tran仿真无法收敛、time step too small。我的排查顺序是固定的先跑DC确认工作点能收敛如果DC都不收敛先看电路连接、电源和地、器件模型是否完整。如果DC没问题瞬态不收敛的常见原因在于信号突变。比如输入源上升时间设成了0瞬间跳变会导致仿真器不断缩小步长最后小于最小步长报错。解决方法之一是在激励源里设置一个极短但不为0的上升时间或者在节点上挂一个小电容来缓冲突变。另一个方法是设置初始条件在仿真器选项中给关键节点加nodeset或ic让电路从更接近稳态的起点开始仿真。在ADE L的Simulation-Options里有几个参数值得常备gmin、cmin、reltol、iabstol、vabstol。增加gmin和cmin能增强不收敛电路的稳定性但过大的gmin会影响精度。我通常先使用gmin1e-15、cmin1e-18试一下再看结果。还需要注意算法选择把method从默认的euler改成gear2对大多数振荡器和开关电容电路更友好。还有一点容易被忽略动态元件的初始状态。比如cap器件的初始电压是0如果电路启动时需要某个节点已经处于高电平必须手动设置初始条件否则仿真会在0时刻产生巨大电流瞬态直接导致不收敛。3.3 PWL波形文件导入别再用单调函数糊弄激励源了做复杂系统仿真时一个真实输入波形比简单的pulse信号有价值得多。IC617中的vsource可以配置成PWL类型支持手工输入时间电压对也支持直接读取外部文件。文件格式很简单第一列是时间秒第二列是电压伏用空格或Tab分隔用#注释行最后一行以换行结束。在ADE中把vsource的Source Type设成pwl然后直接在“File”字段填文件路径例如/home/xxx/tb_data/input.pwl。如果文件里时序包含毛刺仿真时建议设置合理的maxstep否则spectre会花很多时间在小的时间步上。导入PWL后需要在Simulation-Options里把仿真总时间设置大于PWL文件的总时长。之前有次导入一个1us的激励文件结果瞬态只仿了100ns波形看起来毫无变化我还以为是电路问题后来检查才发现总时间设短了。3.4 参数扫描和批量仿真从每次手改变量中解放出来在ADE L里跑参数扫描最简单的办法是Tools-Parametric Analysis。选择需要扫描的变量比如cload或w设定起始值、终止值和步长。配置好后点击“Run”它会自动执行多轮仿真并把结果整理成表格。这个方法适合做共源级放大电路的负载电容扫描、振荡器频率随电流变化扫描等常见场景。如果需要进行多变量组合建议直接用ADE XL。创建一个新的ADE XL testbench在变量栏添加需要扫描的变量然后设置corner和设计点。相比在ADE L中循环手动改参数ADE XL可以并行跑多个point还能自动生成工艺角和温度组合。我一般在项目早期就切换到ADE XL写testbench后期基本不再用ADE L做大批量仿真。需要注意的是参数扫描后查看波形时不同曲线会叠加在同一张图中。为了快速定位可以在波形窗口中用横纵轴标尺测量具体数值也可以把某一条曲线导出成CSV再处理。如果工程师习惯用Python做数据分析建议将仿真结果导出为PPT或Excel再用pandas处理比在波形窗口里手动截图高效得多。4. 版图设计、DRC/LVS与PEX后仿4.1 版图编辑器的快捷键和显示配置版图编辑器里最常用的几个命令和原理图编辑器重合度很高但有几个特定快捷键建议单列功能快捷键备注画矩形rRectangle画路径pPath添加器件实例iInstance复制cCopy移动mMove拉伸sStretch测量距离kRuler清除所有标尺ShiftKClear Rulers标签/文字lLabel全图适配fZoom Fit版图新手常犯的错误是网格设置不对。工艺设计规则里最小单位往往是纳米级如果网格设置太大画出来的矩形坐标不能对准后面DRC会报一堆间距违例。在Options-Display里把User Grid设置为工艺最小精度的整数倍比如0.005um或0.001um同时开启“Snap to Grid”。显示层的颜色和填充样式也是效率神器。PDK安装后一般会有自带的display.drf但不同工艺之间的图层颜色规则不一定一样。我建议把常用层的颜色固定下来比如M1红色、M2蓝色、poly绿色然后保存到用户目录下。这样在不同项目、不同机器之间切换时图层显示不会混乱。4.2 Layout XL联动让原理图和版图同步更新如果要手动从原理图一个个摆器件再对器件属性补全那效率太低了。IC617的Layout XL可以建立schematic-driven layoutSDL流程用XL方式打开版图后它会自动识别原理图中的器件和网络在放置时提供飞线引导。使用XL模式后从原理图中点选器件再在版图窗口中放置它的instance属性自动与schematic一致。布线时可以先用“Interactive Routing”自动连接飞线再用stretch微调。如果原理图做了改动比如换了一个电阻或改了一个连线XL模式会提示更新版图自动同步器件。还有一个小细节在XL版图中按X可以直接下钻到某个instance的schematic按ShiftX上移返回层级。这在查LVS错误时特别好用看到某个手动放置的器件没配对可以直接跳回原理图检查。4.3 DRC/LVS/PEX后仿的标准操作流程DRC/LVS通常用Calibre或者PDK绑定的验证工具。IC617里一般是通过菜单Launch-Calibre Interactive或PVS来调用。第一步加载PDK提供的runset文件比如calibre.drc、calibre.lvs。记得把“Check Design Rules”选项和你使用的层次、IP/layer mapping对齐否则结果没有意义。LVS报错最常见的是hcell缺失。如果版图中调用的是标准单元或自家IP需要在LVS compare阶段设置hcell列表将schematic cell和layout cell一一对应否则会认为“layout instance count mismatch”。当你发现LVS报大量invalid instance时先检查hcell配置再怀疑画错。PEX后仿是模拟版图验证中最耗时的步骤。用Calibre Run PEX时选择PEX rule文件输出格式必须设为calibre或gds相关格式。完成后会在Library Manager里生成一个calibreview这个view就是提取了寄生RC之后的电路。后仿时要么直接用calibreview替换schematic要么在ADE中创建一个自定义config把逻辑设计里的schematic view替换成calibre view。后仿前还要特别检查电源和地的提取网络。有些PDK的提取规则需要额外识别VDD、VSS这类全局网络如果没设置提取后的寄生电阻会把电源路径拆得乱七八糟导致后仿性能严重偏离前仿。建议在PEX设置里把“Global Nets”明确指到正确的电源和地。4.4 EMX嵌入VirtuosoRF电路的电磁仿真要点RF设计里经常要对电感、变压器、传输线做电磁仿真EMX是当前嵌到Virtuoso流程里比较顺的工具之一。安装EMX插件后在Virtuoso菜单栏里会出现EMX相关的入口可以直接读取当前版图窗口中的版图数据不需要另外导出GDS再导入。基本操作流程是在版图中框选要仿真的区域比如一个螺旋电感。然后在EMX菜单里创建端口通常把电感的两个端口分别定义为port1和port2并设置参考地。点击运行后EMX会基于工艺的layer stack和金属厚度计算R、L、C寄生最终生成S参数文件或等价的Spice模型。回填模型时EMX能自动在原理图中生成一个带S参数的symbol之后可以直接在仿真器里pull进来。关键是版图框选区域一定要包含足够的周围地平面否则地回流路径不完整仿真结果会和实测差很多。我之前做过一次电感仿真因为没有把下方的地网格完整纳入提取的电感值偏低接近10%后来把范围扩大后才恢复正常。使用EMX还需要确认工艺层叠文件是否与PDK匹配。不同PDK的介电常数、金属电导率差异很大如果层叠文件不匹配仿真的Q值会明显失真。项目在开发阶段最好用官方PDK中的样例验证一遍EMX结果确认设置正确后再大规模使用。5. 常见报错和排查实录这些坑我几乎都踩过5.1 程序异常退出this application has quit unexpectedlyIC617用久了偶尔会碰到一个很让人崩溃的弹窗This application has quit unexpectedly. To help Cadence detect and analyze the problem...。这通常是Java组件或图形界面进程崩溃常见诱因包括/tmp空间满了、Java堆内存不足、显示驱动的兼容性问题。处理步骤我一般按这个顺序来先看CIW和终端日志找到崩溃前的最后操作。如果是CPU占用飙升后崩溃多半与资源耗尽有关清理/tmp下的临时文件关闭不用的窗口重试。如果频繁出现可以尝试在启动virtuoso时加上-nograph参数绕开部分GUI组件的初始化。内存方面可以在启动脚本里增加Java堆大小设置。使用virtuoso -J-Xmx4g这类参数把Java堆上限调到4GB能解决很多因堆空间不足导致的图形崩溃。另外检查~/.cadence目录是否有异常日志或损坏的cache删掉后重新启动能修复一部分因为缓存冲突导致的反复崩溃。5.2 仿真器件未定义和模型库加载失败仿真报错device model not defined或undefined model十有八九是模型库没加载或者加载了错误的section。先说最基础的检查到ADE L的Setup-Model Libraries里看模型文件是否在列表里文件路径是否存在同时确认section和PDK工艺角一致。第二种可能是原理图中器件的Model Name和模型库里的模型名不一致。比如说原理图里放了一个nmos4但模型库里只定义了nch那spectre自然找不到模型。解决办法是打开器件属性把Model Name改成与PDK匹配的名字。很多PDK symbol的CDF属性已经能自动映射但自己做的schematic符号可能没有配置好。如果是使用了ahdlLib或自建的Verilog-A模型检查仿真view是否包含veriloga。在ADE L的Setup-Simulation窗口里把veriloga加到view list中并且放在spectre前面否则仿真器会优先选择其他view。模型文件如果写错端口方向也会报“unresolved reference”这时要回看模型代码中的inout端口声明。5.3 time step too small不收敛问题不能只调迭代次数前面聊过瞬态不收敛的排查思路这里再举一个具体例子。一个共源级放大电路做瞬态仿真输入信号是一个5MHz方波结果spectre报time step too small。我一开始想调大maxstep后来发现根本不是步长限制的问题而是输入方波从0跳到VDD时上升时间设成了0。后来我把vsource的上升时间改成1ns再把仿真器算法改成gear2问题直接消失。除了这些如果电路中存在理想电压源直接给电容充电也会有类似的不收敛现象。在调试时可以在报错节点附近临时加一个极小电容cmin这相当于给节点提供一个数值阻尼让迭代过程更容易收敛。需要注意“调大迭代次数”并不是万灵药。有些人看到Iterations参数就把它从100改到10000结果算了一晚上还在原地踏步。正确做法是先找到真正导致震荡或跳变的节点用初始条件或合适的数值算法去解决迭代次数只是最后兜底的手段。5.4 冷门问题ODBC数据源、intersheet references、环境变量在使用Cadence系列工具时网上搜“ODBC数据源”往往会看到大量Allegro/CIS相关的内容实际上IC617中很少直接涉及ODBC。如果你的工作流需要连接外部数据库比如器件库集中管理那多半是公司自定义流程或Allegro环境。IC617中如果强行要配置一般是在操作系统层面设置ODBC数据源然后在Skill脚本中调用数据库接口属于比较高级的定制化需求。普通开发者遇到ODBC问题时先确认自己是不是打开错了工具不要浪费时间在IC617里找ODBC配置界面。跨页引用Intersheet References报错在原理图章节已经提到过最常见的原因就是off-page connector命重复、方向不一致。执行Tools-Add Intersheet Reference时如果报错先删除一页里的跨页符号重新添加再更新引用。很多人喜欢复制粘贴跨页符号结果复制出来的名字被自动改成带后缀的变体导致引用无法匹配。环境变量类问题则要聚焦到CDS_LIC_FILE、LD_LIBRARY_PATH和PATH这三兄弟上。遇到“cannot find virtuoso”或“cannot load libXp”这类问题用env命令查看当前环境变量对照本文1.2的脚本逐条排查。通常都是漏了一条LD_LIBRARY_PATH或source了多个冲突的cadence版本路径。6. 效率提升把IC617用成顺手的日常工具6.1 把常用显示和快捷键配置固化下来很多人换了机器后图层颜色、快捷键设置全部重置又要重新调一遍。其实IC617的显示配置保存在display.drf文件中快捷键映射可以通过.cdsinit加载。我一般把自定义的.cdsinit、display.drf、.cdsenv放在一个配置目录下然后在~/.cdsinit里加一行load路径。例如在.cdsinit里写load(strcat(getShellEnvVar(HOME) /cadence_setup/display.drf))这样启动virtuoso时会自动加载自定义显示配置省去了每次打开Options-Display重新设置的麻烦。快捷键绑定可以用hiSetBindKey写在.cdsinit里比如把CtrlR绑定成快速Run仿真习惯之后效率会提升不少。6.2 用skill和ocean脚本处理重复劳动IC617内置的Skill语言非常适合做批量操作。比如说要批量修改所有电容的初始电压或者给所有电阻实例统一添加一个属性手动一个个点非常痛苦。一个简单的Skill循环能搞定。刚开始不需要写多复杂的代码从录功能开始——IC617有Tools-Skill Debugger和日志窗口把操作过程记录下来再稍加修改就能变成脚本。仿真方面ocean脚本是批量跑仿真的利器。在ADE中点击Session-Save Ocean Script就能导出一份当前仿真设置的ocean脚本。编辑脚本改变变量值后在终端执行ocean -restore script.ocn就能脱离GUI跑仿真。对于需要连续跑多个module的回归测试这个功能非常实用。我第一次用ocean还是为了跑后仿的几十个corner组合手点鼠标点到怀疑人生。后来把仿真参数写进脚本配合shell循环一夜之间跑完所有后仿corner第二天上班直接看结果。建议所有做模拟IC的工程师都值得花一周时间学一下ocean和基础Skill。6.3 我个人的几条使用习惯最后分享几条我这几年的使用习惯。第一工程文件命名要规范cellview的名称里不要带中文和特殊符号否则PDK脚本和网表工具经常报一些莫名其妙的错误。第二每次大规模修改前备份库用tar打包即可别只依赖Library Manager的Save因为某些误操作会直接破坏整个cellview。第三跟仿真和网表相关的临时文件定期清理。$HOME/simulation或$HOME/workspace下会自动生成很多历史仿真数据如果一直不清磁盘空间很快就爆了。我一般每个项目结束后会把需要的波形和结果导出然后把simulation目录里的旧任务清理掉。第四尽量使用相对路径来指向PDK和设计库避免把绝对路径写死在脚本里。一旦整个项目目录迁移相对路径只需要统一改一次根目录而绝对路径要到处改很容易漏掉。IC617确实有很多让人抓狂的小毛病但熟悉了它的脾气之后这套工具能提供非常稳定的模拟设计流程。以上这些技巧不是一次性整理完的而是这些年踩坑之后慢慢沉淀下来的。现在把它们放进“收集区”是希望后来的人遇到类似问题时能少走一些弯路。如果你也有独门技巧欢迎在评论区补充这个收集区会一直更新下去。