
这系列笔记写到第二篇上一篇把IC617也就是Cadence IC 6.1.7平时大家更习惯叫它virtuoso的库管理、环境准备这些琐碎活儿理顺了。今天做一件看起来基础、但能把整条设计链路串起来的正事在virtuoso里完成一个CMOS反相器inverter的原理图绘制顺带把配套的symbol生成出来。反相器是数字集成电路最底层的单元结构上就两个管子可噪声容限、VTC曲线、传播延时这些数字设计里的核心概念全压在它身上。对刚开始用IC617接触全定制设计的同学来说走一遍调管子、连线、查错、生成symbol这个流程比直接去啃复杂电路有用得多也是后面画各种门电路和运放的必经之路。我在实际带新人的时候发现一个规律很多人卡住的地方根本不是电路原理而是对virtuoso这套工具的各种反直觉操作不熟。所以这篇笔记会把我的操作路径、踩过的坑、工具层面的注意点都写清楚尽量让第一次打开Schematic Editor的人也能顺着走完。1. 动手画图之前先把反相器这几个概念在脑子里过一遍1.1 反相器的结构两个管子的“推挽”关系CMOS反相器简单到可以用一句话讲完上拉PMOS下拉NMOS两个栅极接一起做输入两个漏极接一起做输出。输入低电平的时候PMOS导通、NMOS截止输出被上拉到VDD输入高电平的时候NMOS导通、PMOS截止输出被拉到GND。这里有一个非常关键的属性稳定状态下VDD到GND之间不存在直流通路总有一个管子是截止的所以静态功耗几乎是零。这个性质是整个CMOS数字电路能取代双极型电路成为主流的根本原因画反相器的时候应该对这个推挽关系有直觉。真正容易忽略的是过渡区。输入电平从低到高变化会经过一个两个管子同时导通的状态这时候VDD到GND会有短暂的灌电流输出也处于一个既不高也不低的中间电平。这个中间区在数字电路里平时是被避开的但反相器作为一个模拟放大器时恰恰在这个区域工作。所以别把反相器只当成开关它在中间区域是一个增益很高的放大器这一点理解透了后面看VTC曲线会觉得非常顺。1.2 VTC与翻转阈值反相器的“灵魂曲线”VTC就是电压传输特性即把输入从0扫到VDD记录输出电平的变化曲线。一副典型的CMOS反相器VTC在中间有一段特别陡峭的过渡区几乎是从VDD直落GND。这个陡峭程度就是电压增益理想情况下可以达到几十倍甚至上百倍。为什么数字电路能容忍输入信号上叠加了许多噪声靠的就是这一段高增益区域——输入只要稍微偏离翻转点输出就会立刻被拉到确定的逻辑电平。翻转阈值VM定义为VTC上Vin Vout的点。设计反相器时通常希望VM落在VDD/2附近这样高低电平的噪声容限对称且上升和下降延迟也比较均衡。想要VM等于VDD/2本质上是让NMOS和PMOS在过渡区贡献电流的能力对等。空穴迁移率只有电子的二分之一到三分之一所以PMOS通常要做宽一些来补偿。比如在180nm工艺下电源电压1.8V我一般初始值给N管L180n、W1µmP管L180n、W2µm先按这个比例画后面通过仿真再微调。1.3 噪声容限冗余度到底从哪来噪声容限衡量的是输入信号被污染到什么程度输出仍然能被下一级正确判读。它由四个电压定义VOH是输出高电平的最小值VOL是输出低电平的最大值VIH是仍能被识别为高电平的输入最小值VIL是仍能被识别为低电平的输入最大值。更严格的定义会要求在VTC上斜率为-1的位置取这四个点。于是高电平噪声容限 NMH VOH - VIH低电平噪声容限 NML VIL - VOL这个逻辑想明白之后你会发现噪声容限本质上是增益换来的余量。VTC过渡区越陡单位增益点越靠近翻转阈值噪声容限就越大。所以反相器的设计指标从来不是孤立看的VM、VTC的斜率、噪声容限三者是绑在一起的。仿真验证时DC扫描出来的VTC可以直接读出这四个电压值。1.4 转换时间与传播延时速度由什么决定速度和功耗、噪声一起是数字电路三大设计维度。反相器层面涉及两个速度指标转换时间和传播延时。转换时间描述的是边沿本身的缓急通常用输出从10%VDD上升到90%VDD的时间作为上升时间从90%VDD下降到10%VDD作为下降时间。传播延时描述的是信号穿过这个门到底滞后了多少在50%VDD点测量分为tpHL和tpLH平均传播延时tp (tpHL tpLH) / 2。这两个指标的物理来源都是电容充放电。输出节点上挂着的电容包括下一级的栅电容、自身两个管子漏端的扩散电容、以及连线寄生电容。驱动这些电容的电流来自PMOS上拉或NMOS下拉。所以影响速度的因素就很清楚了管子宽度越大驱动电流越强延时越小但宽度越大栅电容和扩散电容也越大这个矛盾决定了不能盲目加宽。还有电源电压VDD越高过驱动电压越大管子导通越快代价是动态功耗以平方关系上升。最后是PMOS和NMOS的迁移率差异它直接导致上拉比下拉慢这也是为什么标准反相器里P管宽度普遍要做成N管的2到3倍。2. IC617环境准备建库和工艺绑定别上来就画2.1 启动virtuoso与Library Manager先确认工具活着在终端里启动virtuoso之前先确认环境变量已经source好不同服务器上这一步差异很大有的是一个setup脚本有的写在.cshrc里。我第一次接触IC617的时候因为环境变量路径不对折腾了快一个小时后来才发现是PDK的路径少点了一个目录。启动命令很简单virtuoso 几秒钟后CIW窗口会弹出来里面刷的是一些工具初始化信息。如果你第一次用可能会误以为CIW只是个日志窗口其实它底部有一个可以输入命令的行很多快捷操作可以在那里敲。Library Manager窗口一般会跟着打开如果没有在CIW菜单Tools → Library Manager里手动打开。启动到能正常建库才算是具备开工条件。2.2 新建设计库并attach工艺库为什么不能跳过原理图本身是不带任何物理信息的里面只有器件的几何尺寸和模型名。要让这些尺寸真正对应到某个工艺的电气特性必须依赖工艺库PDK提供的模型和规则。所以在IC617里一般会建一个自己的设计库比如叫my_lib然后把它attach到一个工艺库上。这一步相当于是给设计库声明我用的是这个工艺的画图规则、显示颜色和器件模型。操作路径是Library Manager → File → New → Library填库名选择Attach to existing technology library然后选中你已经加载的工艺库。如果是教学环境很常见的是Cadence官方提供的通用PDK比如gpdk180180nm工艺模型完整用来做反相器练习完全够用。这里强烈建议初学者直接attach而不要选择Create techfile后者需要手动处理一大堆显示文件和规则文件很容易踩坑。2.3 原理图编辑器里最常用的几个快捷键virtuoso的bindkey非常多背下来当然好但刚开始只需要掌握几个高频的就够了菜单点选也不会慢多少。我在画原理图时最常用的是i放置实例instancew连线wirep添加引脚pinc复制m移动f居中全览fitu撤销还有一个经常被忽略的设置Options → Display打开Display Grid选项让编辑区显示格点。画原理图不强制要求对齐格点但后面某些检查、DRC阶段会要求器件在grid上所以一开始就把格点开出来好处比坏处多。如果画完发现器件或线偏了可以用Edit → Advanced → Snap to Grid整体对齐。3. 反相器原理图绘制从调管子到生成symbol一步步来3.1 新建cellviewSchematic Editor的打开方式在刚刚建好的设计库里右键选择New Cellview或者先选中库再执行菜单File → New → Cellview。Cell Name填invTool选Schematic Editor然后点OK就会进入原理图编辑界面。这里建议把Cell Name和后面要生成的symbol保持一致省去后续层层改名的心智负担。进到Schematic Editor之后界面乍一看有点空左边是工具图标下方有ADS输入行顶部是菜单。不要慌画这个反相器只需要三步放器件、连线、加引脚。一个habits建议先放管子再连电源地最后统一加pin。3.2 调取PMOS与NMOSPDK器件和analogLib器件的区别按快捷键i打开Create Instance窗口同时会弹出一个Library Browser。这里有个新手常踩的坑默认库列表里会看到一个analogLib里面有nmos4、pmos4这类通用模型器件。这些器件本身不绑定任何工艺仿真的时候需要手动填Model name比如填上PDK里的nch、pch模型名如果填错或者不填仿真基本跑不起来。所以教学里我建议直接用工艺PDK库里的管子比如gpdk180库里的nmos1v和pmos1v它们自带模型名和工艺参数能省掉很多隐藏问题。放置器件时注意几个参数Length沟道长度、Width沟道宽度、Fingers、Multiplier。以180nm工艺为例Length先取工艺允许的最小值180nWidth按照第一节说的初值N管取1µmP管取2µm。Fingers和Multiplier是并联器件的等效写法多个finger可以得到大宽度的同时减小栅电阻但现在先不用管保持默认就好。摆放位置养成习惯PMOS放上面NMOS放下面栅极在垂直方向对齐。这样画出来一眼看过去就是很清晰的反相器结构后面加电源地和连线也顺手。3.3 连线、引脚与衬底电位别把线画得“看起来连上了”放好管子后按w进入连线模式。连接关系如下PMOS的栅极和NMOS的栅极连到一起引到输入端PMOS的漏极和NMOS的漏极连到一起引到输出端PMOS的源极接VDDNMOS的源极接GNDNMOS的衬底B端接GNDPMOS的衬底B端接VDD很多人在这一步出过问题线画过去了但放大看其实没有真正吸附到instance的pin上。virtuoso在连线靠近pin的时候会显示一个方块形的连接标记如果你没看到这个标记说明它只是视觉上连在一起实际是断开的。另外一个容易忽略的点是衬底连接。四端器件的B端如果不接有些情况下仿真器会默认body和source短接有些情况会因为浮空而报错所以别偷懒B端主动连到正确的电位上。接下来加引脚。按p打开Create Pin窗口输入端A设置方向为input输出端Y设置方向为output电源VDD和地GND建议设置成inputOutput方向。这里的方向设置会影响后面symbol生成时的引脚类型和连接规则。如果不打算把电源地引出到symbol上也可以把它们设置为全局net但初学阶段我还是建议把VDD和GND都做成pin在教程级的testbench里明确接上电源地能把整个电路的电平关系看得清清楚楚。3.4 属性编辑与Check and Save保存前把隐患扫掉全部连好之后双击每个器件检查属性。确认instance name没有重名model name正确Width和Length符合预期。然后执行菜单Design → Check and Save。第一次检查往往会弹出一堆warning常见的有off-grid、悬空节点、pin放置方向问题。Warning不致命但最好是逐步清掉毕竟后面仿真报错时干净的检查结果能帮你快速定位问题。Check如果有error那就必须处理掉比如有节点没连好、pin重名、短路等。这里补充一个操作习惯每完成一个关键步骤就按ctrlS保存别等全部画完再存。virtuoso虽然是成熟工具但偶尔异常崩溃会让你欲哭无泪随手保存是最便宜的保护。3.5 生成symbol为下一层调用做准备原理图画完并检查通过后接下来要生成symbol。在Schematic Editor的菜单里找到Design → Create Symbol部分版本在Create → Cellview → From Cellview弹出窗口会让你选择哪些pin要保留。建议把A、Y、VDD、GND全部选上这样在testbench里调用inv这个symbol时可以显式连接所有电位。生成symbol后会自动打开symbol编辑界面。virtuoso会按默认方式把所有引脚排好并给一个简单的框。你可以用左下角的pin工具调整引脚位置用画线工具在框内部画一个反相器的小三角符号最后保存。symbol的cellname和原理图一致都是inv生成后这个cell下面就会同时有schematic和symbol两个view上层电路才能像调用普通器件一样调用它。4. 绘制过程中的典型问题与排查记录4.1 器件调出来了但仿真不认model name的那点事这是我见过最普遍的新手问题症状是原理图画得漂亮ADEL仿真一跑就报model not found。根源多半是使用了analogLib里的nmos4、pmos4却没有在属性里填Model name或者填了PDK文档里不存在的名字。解决方法是确认你用的是什么工艺库去PDK文档里查准确的模型名。如果用的是gpdk180最省事的方法是直接调gpdk180里的nmos1v/pmos1v从根源上避开这个问题。我自己的习惯是画教学例子的原理图也坚持用PDK里的器件因为越是习惯用真实工艺器件后面做后仿、LVS相关的操作越不容易懵。4.2 引脚类型选错带来的CheckSave警告引脚方向看起来只是小问题实际影响不小。如果你把所有pin都设成inputOutputCheck时会看到一堆pin is bidirectional possible之类的warning在生成symbol时引脚排列顺序也会很乱。更麻烦的是后续如果你做连接检查或者形式验证pin方向混乱会让人非常头大。所以从一开始就按规范设置信号输入用input信号输出用output电源和地用inputOutput或者干脆用全局电源地保持全库一致。4.3 off-grid问题画图时看不见的坑当Check报告off-grid warning时说明某个器件或者线的坐标和工艺允许的格点不一致。这个问题在原理图阶段不痛不痒但到了版图阶段器件如果不在格点上DRC会报错甚至导致LVS不通过。所以画原理图时就应该把格点打开放置器件时让virtuoso自动snap到grid。如果真的出现了off-grid选中器件后用Edit → Advanced → Snap to Grid处理一般都能救回来。老工程师常挂在嘴边的那句电路设计在高一层的抽象里也要守住底层规则说的就是这类习惯。4.4 未连接节点的检查方法放大看那个小方块线画了一堆怎么确认所有连接都是真的我的方法是先执行Check and Save把error清零然后用菜单Display → Highlight → Net点一条线它会高亮整条电气网络上所有连通的部分。如果高亮的范围和你预期不一致说明连接有问题。另外连线的端点上如果出现一个黄色的小方块通常意味着这个线头悬空没有和任何pin或线相连。这个黄方块是virtuoso的未完成连接标志见到它就要排查。我把常见问题整理成一张速查表方便对照现象可能原因处理方法Check报error找不到具体位置有节点悬空或短路用Highlight Net逐条排查仿真报model not found器件没绑定模型名PDK器件替代analogLib器件引脚变为奇怪形状引脚方向设置不当按input/output/inputOutput规范设置off-grid warning器件或线不在格点上打开格点并执行Snap to Grid线头出现黄色方块连线未吸附到pin放大后重新连接symbol端口缺少VDD/GND生成时未勾选pin重新生成symbol并勾选全部pin其实还有一些更隐蔽的设计习惯问题比如同一层schematic里出现了两个同名wire name。virtuoso默认相同名字的wire name属于同一条net这在层次化设计中是有意特性但如果你不小心给两条不相干的信号取了相同的名字它们就会被自动短接。这种问题最难查因为你肉眼看线没有连在一起实际电气上已经短路了。所以命名规则一定要规范信号名别乱用。5. 画完之后干什么从原理图到仿真验证的链路规划5.1 搭一个最小的testbench反相器画完不仿真等于白画。下一步是在库里再新建一个cell比如叫inv_tb进入Schematic Editor把刚才生成的inv symbol调进来。接着从analogLib里取一个vdc作为电源取一个vpulse作为输入激励给输出挂一个负载电容比如1fF到10fF然后接地、接电源。至此一个最基础的反相器testbench就搭起来了。这里有一个经验之谈testbench的cell和被测电路的cell不要混在同一个cell里设计库的目录会越来越乱。习惯上把被测电路放一个库或者一层目录testbench放另一个目录等以后项目大了这种整理习惯能帮你节省大量时间。5.2 用DC扫描看VTC用瞬态仿真看延时仿真设置里先确认simulator选的是spectre还是AMS再指定model library指向你attach的PDK。接下来最值得做的两个验证第一个是DC扫描把输入从0扫到VDD画出VTC曲线从曲线上读VM、VOH、VOL、VIH、VIL计算出噪声容限。第二个是瞬态仿真给vpulse设置一个合理的周期观察输出波形测量上升时间、下降时间、tpHL和tpLH。我建议第一个反相器的设计目标设成VM在VDD/2附近静态功耗在纳瓦级别传播延时在几十到一百皮秒量级。如果VM偏了就调整PMOS和NMOS的宽度比例如果延时偏大可以在保证VM的前提下适当增大宽度或者减少负载电容。这个过程就是最朴素的电路设计迭代后面所有更复杂的电路其设计方法论也跳不出这个循环。5.3 一些给入门者的实在建议我觉得画反相器原理图这件事最大的收获不是那两条连线而是把工具操作、器件物理和电路思想串在了一起。刚开始你可能会在一个看似简单的连线上卡住半小时这非常正常。virtuoso这套工具的学习曲线又陡又长但只要把反相器这个最小闭环走通后面画各种门、比较器、运放的时候你会发现思路都是通用的先明确结构再设初始尺寸然后仿真迭代最后总结一套属于你自己的设计套路。这比记住一百个快捷键管用得多。