
像我们这种常年泡在 Cadence Virtuoso 里的人早就习惯了这样一种状态原理图画得漂漂亮亮仿真跑得飞起结果一到版图环节就卡壳。尤其是刚接触版图设计的同学最容易在“根据原理图画版图”和“把版图跟原理图正确联起来”这两个环节翻车不是连线对不上就是 LVS 报一堆错找不到原因。今天这篇东西我就围绕 Virtuoso 从原理图到版图的完整流程把里面最容易踩的坑、最该注意的细节以及我自己平时用的那套实操习惯一次性讲清楚。这篇内容适合几类人看正在学校用 Virtuoso 做课程设计的微电子相关专业学生刚入职模拟版图岗位的新人以及自己搭 IP 块、需要独立完成前端到后端的小团队工程师。无论你是刚学会画原理图的新手还是已经会画点版图但总是联不通的老油条这篇文章都能给你一些直接能用的东西。1. 全流程认知原理图、版图与联接的本质很多人把 Virtuoso 里的工作拆成一堆零散操作其实整个流程就三件事画原理图画版图把两者对上。想明白这三件事的关系后边所有操作都不会跑偏。1.1 前端原理图和后端版图到底分别做了什么原理图阶段我们的核心任务是表达“电路功能”。你放一个 NMOS、两个电阻、一个电容用线把它们连起来标注好节点名称导通过 ADEL 跑仿真看波形。这个阶段强调的是电气连接关系谁跟谁相连管子的宽长比是多少偏置电流往哪流这些都是逻辑层面的东西不需要关心形状和位置。版图阶段就完全不同了。还是那颗 NMOS但你得把它变成一个具体的物理图形有源区、多晶硅栅极、接触孔、金属连线每层掩膜的形状、间距、包围关系都必须符合 Foundry 的 DRC 规则。此时你关心的是“设计规则检查能不能过”“面积大小合适不合适”“电流走向合理不合理”“匹配性好不好”。版图里的一切都是为了“把原理图里的电气关系在物理硅片上真实地做出来”。至于“联接”我觉得得从两个层面理解。第一个层面是物理连线版图里你要用金属层、过孔老老实实把各个器件的端口连起来连成一个完整的物理网络。第二个层面是逻辑映射你在版图上放的这个管子、这个电阻必须能跟原理图里的某个器件实例一一对应起来版图上画出的某个网络必须能跟原理图里某个 net 对应起来。这个对应关系就是后面 LVSLayout vs. Schematic要检查的内容。很多新手只盯着第一个层面的联接把金属线画得四通八达却忘了第二个层面结果 LVS 一跑器件不匹配、节点悬空问题一堆。1.2 Virtuoso 的库、单元与视图关系在 Virtuoso 里一个完整的设计一定涉及三要素库Library、单元Cell、视图View。层次结构是 Library 下面有 CellCell 下面有多个 view。原理图对应 schematic view符号对应 symbol view版图对应 layout view提取后的寄生带参数网表对应 extracted view。我见过不少新手直接在一个已有的库里乱建 cell甚至不 attach 工艺库就开始画这是第一个大坑。创建一个新库的时候必须在 Library Manager 里选中 Technology File把它 attach 到当前项目对应的工艺库上否则后边加器件时会发现 PDK 里的元件调不出来或者画版图时没有 layer 定义。一般学校的实验室或者公司的环境里工艺库和 PDK 都是现成的你新建库时直接选那个工艺库的 attach 选项即可。如果是自己搭环境一定要把 tf 文件和 display 文件加载正确。另外要养成一个习惯每个模块尽量独立成 cell层次化设计。比如你做一个带隙基准可以把它拆成偏置电路、运放、启动电路几个子单元各自画好 schematic 和 layout然后在顶层例化。这样每个 cell 的 schematic 和 layout 都较小后边 XL 生成、DRC/LVS 检查、ECO 修改都方便很多。我见过有人把整个 ADC 全画在一个 cell 里打开版图卡得鼠标都移不动还浑然不觉为什么后端同事总抱怨。设计也是工程要留余地给别人也是给自己方便。2. 原理图绘制别让前端成为后端的坑别以为原理图画得能仿真就算完事。原理图的质量直接决定了你后边版图 XL 生成、LVS 通过需要花多少时间。我这里说的原理图质量不只是“有没有画错”还包括符号规不规范、引脚方向合不合理、net 命名是否清晰。2.1 从建库到画完原理图的规范流程刚开始用 Virtuoso 画原理图的同学我建议按这个流程来能少走很多弯路。第一步在 Library Manager 里新建库右键 New Library名字用有意义的名字比如 project_bias 或者 test_bias别用 test1、test2 这种。创建时选择 Attach to an existing technology library选中你的工艺 PDK 库这样后面才能调用工艺库里的器件。第二步在库下面新建 cellview 选 schematic点 OK 进入原理图编辑器。第三步用快捷键i调入实例。在 PDK 库中你可以找到 nch、pch、res、cap 等基础器件选择你需要的尺寸。放置后用q修改属性比如 W、L、finger 数目。然后按w连线按p添加 pin端口按c复制m移动u撤销Esc退出当前命令。这些快捷键是 Virtuoso 的基本盘一定要记熟。画连线的时候注意线和线之间有没有真的连上最好放大确认一下。在 Virtuoso 原理图里交叉的两根线如果没有一个小圆点junction它们就是不导通的这点和很多 PCB 工具的显示习惯不完全一样。要是连线该接没接后边仿真结果就是错的而且往往你根本想不通错在哪。画完原理图之后按ShiftX可以进到下一层Check and Save 快捷键是x弹出 check 窗口或者按ShiftC我习惯直接点击菜单 Design → Check and Save检查有没有悬空 wire、重复 label、未连接 pin 之类的低级错误。设计再赶这一下也不要省后边的教训会让你记住这句话。2.2 符号与引脚原理图和版图之间的翻译官有些同学画原理图只画了顶层电路不建 symbol等到在上一层电路里要例化这个模块时才傻眼。一个 cell 要想被别的 cell 调用必须要有 symbol view。Virtuoso 可以自动生成 symbol方法是打开 schematic选择 Design → Create Cellview → From Cellview工具会自动根据你添加的输入输出 pin 生成一个方形符号框。你可以再手动调整一下 pin 的位置让它符合你的阅读习惯一般电源在上、地在下、输入在左、输出在右。引脚类型input、output、inout在生成 symbol 和后续 XL 时特别重要。如果某根线其实是要双向的但你把它定义成了 input后边做 top 连接的时可能会报连线方向冲突。还有引脚名的命名不要用无意义的 A1、A2、B1要用和原理图 net 实际意义一致的名字比如 vin、vout、clk、vbias。否则后边 LVS 报错时你光对着名字猜就要猜半天。我在实际项目里吃过一个亏某次做一个 LDO原理图里带隙模块的运放输出引脚名字起得随意叫 n1结果到后边 XL 生成版图时到处找这个连接关系因为 n1 这个名字跟 top 层其他模块的 net 名撞了。Virtuoso 会默认以名字来匹配 net名字一旦不唯一后边所有层级的连接都会跟着乱套。原理图阶段的命名规范真的直接决定版图阶段的工作量。2.3 仿真检查画完原理图先别急着进版图画完原理图很多新人就急着去 Layout这是最典型的错误。版图本质上是对原理图的物理实现原理图功能是否正确都还没有验证你画版图等于在一个错误的基础上做物理设计后面的问题全是叠加的。所以我的原则原理图必须通过至少一轮仿真确认功能和电流电压状态合理才允许进入版图阶段。仿真使用的工具是 Virtuoso 自带的 ADELAnalog Design Environment或者 ADE L / ADE XL。以 ADEL 为例启动后要设置 simulator比如 spectre、选择 model library通常 PDK 会自带各工艺角的 model 文件。工艺角的设置在 ADEL 里主要是通过 Model Libraries 的 section 切换比如你针对 tttypical、ssslow-slow、fffast-fast分别跑仿真就用 different section 来指定。也可以在 ADE XL 里用 corner 支持一次跑多组工艺角和温度组合。激励设置如果不熟练最容易出问题的就是 PWL 波形导入。很多场景下你需要输入一个复杂的数字波形或者自定义的模拟波形不可能手动一个个点添加节点。最简单的方法是创建一个 vpwlf 源指定一个 .csv 或者 .txt 文件文件里每一行两个数值分别是时间和电压值单位要统一用秒和伏特。比如0 0 1n 0 1.5n 3.3 5n 3.3 ...这个文件路径最好不要带中文和空格否则 Virtuoso 有时候解析会出莫名的错误。导入后在 ADE 里的 tran 仿真时间设置得稍长一点确保波形完整跑完。这一步看似技术含量不高但很多卡住仿真验证的人都栽在文件格式和路径这种地方。2.4 原理图页面的那些隐藏坑除了画图和仿真本身原理图周边还会遇到一些很玄学的问题。比如我们在用其他 EDA 工具画多页原理图时经常碰到“有的页面页码重复了导出 PDF 时只有部分区域显示”的情况。这种问题在 Cadence 环境里有时也会出现——原理图分页很多时page number 设置重复会导致生成网表时模块名称错乱或者输出 PDF 时页面内容互相覆盖。我在 Virtuoso 里的习惯是多页原理图尽量用 hierarchical design把一个复杂电路拆成多个子模块尽量避免在一页里塞上千个器件。真的需要多页时检查每一页右下角的 title block 信息确保 page number 连续且唯一生成 PDF 之前先 Check and Save 一遍再用 plot 或者 export 输出减少各种低级的属性修改没有生效的坑。还有 ADE 仿真里设置工艺角容易犯迷糊。很多人只在 Model Libraries 里选了一个 section却忘记在 Analysis 里设置对应温度结果 ss 工艺角 27 摄氏度的组合不够覆盖最恶劣条件。实际做项目时我一般用 ADE XL 的 corner 功能将工业级范围比如 -40、27、125 摄氏度和工艺角做笛卡尔积跑完整矩阵再决定要不要进入版图这个习惯帮我省了非常多后端返工的麻烦。3. 从原理图到版图用好 XL 这把钥匙版图完成后能不能跟原理图正确对上是验证阶段的关键。而 Virtuoso 提供的 Layout XL 就是帮你把原理图和版图的映射关系自动建立起来的工具。很多人傻乎乎地在 layout 里手动画器件完全抛弃 XL这是大忌。3.1 为什么要用 XL 流程而不是手动创建Virtuoso 里打开版图的方式有两种直接新建一个 layout view或选择 Launch → Layout XL。Layout XL 是基于原理图驱动的版图工具它能在版图里自动拉出原理图中所有器件的形状器件本体、PIN 位置并把它们之间的连接关系以飞线rats nest的方式显示出来。如果不用 XL你只能手动从 PDK 里调用器件放到版图上然后自己一根根对照原理图接线。一旦原理图修改了版图很难同步更新。而且最麻烦的是手动创建的版图没有原理图映射信息后面跑 LVS 时工具不认识这个多边形是原理图里的哪个管子LVS 就要做大量的识别和匹配匹配不上就会报错。用 XL 的正确打开方式在原理图界面点击 Launch → Layout XL工具会打开一个新的 layout 窗口并弹出一个 Generate 的选项。选择 Generate All InstancesXL 会把原理图里的所有器件按逻辑生成到版图里同时显示连接关系。生成后你可以自由拖动、旋转、镜像这些器件飞线会跟随移动随时告诉你哪个 net 连着哪些 pin。因为映射关系已经存在后面 LVS 基本就是水到渠成。3.2 器件摆放与布局规划的经验生成完器件、看到飞线之后不要马上就一根根去连线。先把布局规划好再布线。好的布局能让你后边少走 50% 的弯路。规划布局时不要只照着原理图的顺序一排线性排开而是要按照“功能模块”来划分区域。比如一个运放差分输入对放一起电流镜负载放一起输出管放一起一个带隙基准核心的 PTAT 管和电阻放一起运放放旁边启动电路放边上。把同一功能支路的器件就近放能缩短关键的信号路径减少寄生电阻电容对性能的影响。放器件时留意方向。Virtuoso 里可以通过r旋转、M镜像来调整器件方向。大规模生产时一般希望 p管和n管方向一致、电源地总线有规则。为了后边的连接和 DRC 干净尽量把器件的 pin 朝向外部或朝向你要拉线的方向。我通常会把电流镜、差分对的 pin 方向摆成对称形状这样后边连线时不用绕圈走线也顺滑很多。再强调一点布局不是光看当前这一个模块要思想你的 top 层走线方向。转角的金属最好考虑与电源、地的整体流向保持一致避免一个模块一层横走、一层竖走把顶层走线空间堵死。做大规模一点的设计建议提前在纸上或脚本里规划好各模块的宽高比例别到画完才发现某个模块把另一个模块挤得无处可去。3.3 电流镜匹配等模拟重点处理模拟版图里电流镜匹配几乎是必考项目。如果你只是把两个管子随便摆在一起、平行走线跑 LVS 也许能过但实际流片出来后由于工艺梯度、氧化层应力等因素两份电流可能明显不匹配电路指标直接飘了。电流镜匹配的常见做法是共质心common centroid布局。比如两个要匹配的管子不要简单并排而是采用 ABBA 或者更复杂的叉指interdigitate结构。把两个管子分别拆成多根 finger交叉布置使得它们在 x 和 y 方向上的工艺梯度都能平均化。在 Virtuoso XL 里你可以通过修改管子的 fingers 数量来实现叉指也可以用 Layout XL 的 Apply Device Constraints 功能来分组、设定匹配约束让工具保持两个管子的排列对称。匹配不只是器件本身连线也要匹配。我当时踩过一次很深刻的坑两个电流镜管的栅极我分别用两根完全不同长度、不同层金属的线从两边拉过去LVS 过了但后仿真时发现偏置电压在两个管子上表现不对称。后来才知道金属连线的寄生电阻不同会在小电流下引入明显的失配。匹配管子的连线长度、层数、过孔数量尽量保持一致这才是真正的版图意识。还有 dummy 器件的摆放。大管子周围如果不加 dummy边缘的刻蚀速率和中间不一样也会造成失配。通常在匹配管的左右两侧各加一根 dummy finger并注意 dummy 的端子不要形成额外通路一般接电源或地或者浮空处理具体按 PDK 的 design rule 来。4. 联接连线的核心操作布局规划好了映射关系也建立起来了接下来就是大家都最关心的“联接”——版图物理连线。这一步虽然看起来就是拉 Metal 打 Via但细节非常多很多 LVS 报错都是在这个阶段埋下的。4.1 布线基础与常用快捷键在 Virtuoso 版图编辑器里最常用的连线命令是ppath和rrectangle。Path 适合拉一根连续金属线可以根据你设置的宽度连续走线Rectangle 适合画一个矩形金属块。做电源地主干线时用 Rectangle 大块铺很常见信号连接则主要用 Path。拉 Path 的时候先选到你要用的层次比如 metal1、metal2设置好线宽。注意线宽不是越宽越好太宽了寄生电容大还可能挤占信号通道太窄了 DRC 可能不过或者过电流能力不够。具体线宽要靠电流大小和工艺 DRC 两个因素决定一般 1mA 的电流在小工艺下至少需要 1um 左右的金属宽度增益信号线则尽量用最小宽度的 2~3 倍以上减少压降带来的增益误差。Path 连线的技巧单击起点开始拖动画线Shift单击可以完成一段直线连续拐弯时Virtuoso 会自动帮你在拐角处做 45 度角或方角。默认 DRC 一般喜欢 45 度斜角而不是 90 度尖角尤其是高频、高速走线的场合。每次连线的结束位置最好让 Path 的中心或者边缘正好落在目标 pin 的范围内否则后边 LVS 识别连接会有问题。打完一段金属线之后如果你要从 metal1 跳到 metal2就需要用过孔。过孔快捷键是o选好要连接的 via 类型和层次放在金属线交汇处即可。过孔的数量取决于通过的电流大小小信号线一个 vía 就够电源地线上我习惯打一排乃至一个阵列确保过流能力和阻抗要求。4.2 飞线、net 名与物理连接层的对应Layout XL 生成版图后会显示很多条不同颜色的细线那些就是飞线代表某个 net 需要连接关系的提示。飞线的两种颜色一般表示不同网络你可以利用它们来快速判断哪些 pin 之间是同一个 net。连线之前先大致浏览一遍飞线的走向和密集度优先把高层的电源地和全局信号线布局好再处理器件之间的局部短线。不断线也可以先把每根线的水平大致走向在脑中规划好再落笔避免后边这里一条、那里一条乱糟糟的。如果发现某些 pin 上飞线没有显示你也不用慌很可能是这两个管脚在原理图里属于同一个名字的 net但因为布局移动飞线没有实时刷新。此时你可以选中这条 net使用 Connect 菜单里的 Highlight 功能工具会用高亮颜色显示这个 net 对应的所有 pin 和已走线。我日常离不开这个功能每接完一条关键 net用高亮确认一遍这里是不是真的接上了心理踏实很多。这里有个必须明确的概念物理上接触 ≠ 逻辑上识别。你画了一根金属线如果没接到 pin 的识别层上或者线层不对即使它们视觉上重合了LVS 也可能认为没连上。比如一个 pin 在 metal1 上你却用 metal2 的 path 从它上面“飞过去”没有任何 via 接触那它们当然是开路的。更隐蔽的是有些 pin 实际上定义在一个特定的 pin 层你必须让金属线跟这层发生物理接触或用 via 转进去否则 virtuso 不会认为连接上了。碰到这种问题多看看 pin 的所有层次属性别只盯着金属层。4.3 电源地线与信号线的分层策略模拟版图里电源线和地线的处理永远是重中之重。电源/地线是几乎所有信号的回流路径如果它的阻抗过高或者环路面积过大会产生严重的地弹和电源噪声小信号性能会变得很差。我的做法是电源线和地线尽量用顶层厚金属或比较宽的底层金属来走不跟信号线抢最窄的走线资源。例如在一个两层金属的工艺里我会用顶层金属跑一条宽带 VDD/ VSS 总线每个模块的电源 pin 就近打一排 via 到顶层总线上。底层金属则主要做模块内部的信号互联避免电源信号通道拥堵。主干总线规划在 XL 飞线里一眼就能看出来颜色最粗最集中的地方一般就是电源地。此时用矩形块画出几根主干线放到合适位置然后用 via 阵列填充。这样电源地的连接可靠性高同时也不会影响器件内部的信号走线。5. 常见问题与排查实录把最常见的几个坑都摊开来聊聊。这里边既有原理图环节的坑也有版图连线阶段的坑最后还有 LVS 验证时的“翻车现场”。都是我从实际项目和带人过程中总结出来的高频问题你可以对照排查。5.1 LVS 报错的常见原因和排查思路LVS 报错类型无非几种器件不匹配、节点不匹配、短路/断路、参数不匹配。新手看到一堆英文报错就慌其实大部分问题都有套路可查。器件不匹配往往是 XL 映射关系没建立好或器件属性被手动改过。检查方法打开 LVS 结果报告查看不匹配的器件列表然后回到版图里用 cross probe 功能定位看该器件是否被误删或者改动过属性。有时候很离谱版图里一个电阻的尺寸跟原理图不一样仔细查才发现是 XL 生成时没有读取到原理图里更新的参数所以布局前最好重新 Launch XL 一次确保拿到的就是最新的网表。节点不匹配一般是网络连接标号label放错了位置或者缺失。在版图里每个关键节点最好加上 label比如 vdd、vss、vin、vout。加 label 用l快捷键选择对应的 net 层次放在金属线上。如果某个 top 级 pin 没加 labelLVS 就会报 “missing port” 或者 “extra port”。短路和断路的问题就更实操了。短路一般靠高亮显示也能查到但如果是大面积电源地短在一起你可以利用 LVS 报告里的 shorted net 提示把那两个 net 分别 highlight然后肉眼找它们重叠的位置。很多时候是 via 或者金属线意外搭到了不该连的地方。断路则是明明想连着但因为金属线断口、via 没对齐之类的原因没有形成完整通路。用高亮 net 功能沿着网络一点一点看金属是否连续注意角落和边缘接触情况一般都能找到断点。5.2 版图联接连不上的怪问题有一种很困扰的情况是飞线显示两个 pin 要连我也画了金属线也打了 via为什么 LVS 还是说没连上先说最常见的原因金属线所在层次与 pin 层不对。比如 pin 定义在 metal1你用 metal2 画了线然后没有打过孔直接贴近 metal1 pin 的位置工具会认为 metal2 跟 metal1 之间没有接触。解决办法是在两个层次之间打 via或者直接改用 pin 所在的层。另外有些 pin 需要你接触到的形状至少 overlap 一定面积只是“轻轻碰到一个角”工具可能不认。画线时尽量让线与 pin 的接触长度大于 0.1um 左右这样物理上更稳LVS 也更友好。还有一种情况是实际连接的 net 名不一致。比如原理图里电源叫 vdd版图里你画了一个金属块但忘记打 labelLVS 工具就只能凭形状猜测它是不是 gnd 或别的。为了保证不出岔子我在版图里对电源地至少加一个可见的 label 标记避免后边自己都分不清哪根是主电源。一个更隐蔽的坑重复 net label 造成的意外短路。有时为了标注方便在两条不同信号线上放了同一个名字的 labelLVS 会认为它们是同一个 net于是本不该导通的线路就被“逻辑短路”了。排查时利用 LVS 报告里 shorted net 的提示把该 net 高亮仔细看看是不是有 label 重复的情况。这个问题在层次化设计中更常见子模块内部的局部 label 不小心和外层全局 label 同名就会爆出奇怪的连接关系。5.3 工具与仿真相关的杂症处理除了原理图和版图本身实际工作中还会遇到一些工具使用上的杂症。比如仿真时莫名其妙说找不到 model 库或者跑出来的波形数值明显不对。多半是 ADEL 里 model library 的路径和 section 选择有问题。PDK 更新之后旧的仿真状态文件里存的路径可能失效重新在 ADEL 里加载 model library 文件即可。再有就是工艺角设置之前提过要用 ADE XL 的 corner 功能这里再补一句如果你发现同一电路在不同温度下仿真结果差异巨大先别怀疑电路设计先检查你 corner 里的温度是不是跟模型库里的温度设置一致有时候两个地方都设置温度会互相覆盖导致你看到的根本不是预设的跑点。还有在 Virtuoso 里跑 EMX 仿真电磁仿真常用于电感/变压器模型提取时很多人不知道要把 EMX 的模型格式嵌到 Virtuoso 的仿真流程里。其实流程就是先跑 EMX 提取版图中的电磁参数然后生成对应的子电路模型文件再在 ADEL 的 model library 里添加该文件同时确保模型名字与原理图里用的电感符号名字一致这样 spectre 才能把理想电感替换成带寄生参数的模型。这个过程看似繁琐但习惯之后也就几步操作而且对于射频类电路几乎是必须的。最后一个跟“原理图页面”相关的小坑在 Cadence 里不常见但迁移项目时偶尔会遇到多页原理图或子模块很多的时候自动生成网表报 “page number repeated” 之类的错误。这种情况通常是因为复制页面的过程中title block 的 page number 字段没有自动更新。处理办法很简单搜索所有 schematic 页面把页码改成唯一值再重新 Check and Save 即可。我建议每个页面都在右上角或者 title block 里写清楚模块名和版本号这个习惯能省掉后期很多人力沟通成本。最后再分享几个个人习惯跟 Virtuoso 打了这些年交道我觉得最重要的是心态版图不是原理图的“附属品”而是真正决定芯片能否工作的工程实现。你在原理图上改了 1 欧姆电阻觉得没什么但后边版图可能需要重新布局、重走线所以原理图阶段就要把器件参数定清楚尽量避免不必要的反复。我个人的三个习惯给你们参考第一边画边存边截图每隔一段时间做一个版本的备份或者用 Git 管理设计文件防止手一抖把辛苦画的正交网格全毁了第二每画好一个小模块立刻跑一遍 DRC 和 LVS不要把问题攒到最后一次性处理否则面对几百条报错你会想直接重画第三多用高亮和跨图层搜索定位功能不要用肉眼在海量金属线里找连接断点那是纯浪费时间。这次分享的内容基本都在平时的项目里反复用得到。如果你正好在学 Virtuoso或者正被版图连线折磨按着这篇的思路重新理一遍流程你会发现其实每一步都有套路可循。画图、仿真、版图、验证环环相扣只要每一步都稳扎稳打最后的 LVS 通过并不是什么难事。