上一篇环境搭建写完之后我以为自己已经算是“能用IC617的人”了。真正动手去画一个最普通的反相器原理图时才发现从“软件能启动”到“电路能仿真出正确波形”中间隔着一堆细小但致命的操作坑。这篇是同一个学习系列的续篇我把基于IC617画反相器原理图的完整流程、仿真验证方法以及VTC、噪声容限、转换时间、传播延时这些数字电路基础概念怎么和实操对应起来尽量原原本本还原出来。要是你也在从零啃集成电路设计或者刚打开Virtuoso不知道第一个cell怎么下手这篇应该能帮你少走我走过的弯路。1. 画原理图之前先把反相器的“脾气”摸透1.1 VTC曲线为什么反相器非要“反着来”VTC的全称是Voltage Transfer Characteristic电压传输特性。简单说给反相器输入端一个从0慢慢升到VDD的电压记录输出端电压的变化画出来就是VTC曲线。它是最先要理解的东西因为整条曲线把反相器的直流行为几乎全部讲清楚了。看这条曲线的时候最重要的一点是它不是一条直线而是一条在中间区域剧烈翻转的曲线。输入很低时PMOS强导通、NMOS截止输出接近VDD输入很高时NMOS导通、PMOS截止输出接近0。中间那段陡峭的翻转区域体现了CMOS反相器的高增益特性。曲线上的反相阈值点一般叫VM是VTC上输出电压等于输入电压的那个点。它的物理含义是电路翻转的“分界线”输入低于VM输出判高输入高于VM输出判低。理想情况下我们希望VM落在VDD/2附近这样高低电平余量对称。实际上VM的位置取决于PMOS和NMOS的尺寸比例、阈值电压、电源电压等因素。很多人刚开始看VTC容易把它当成一个“数学曲线”去记其实它是可以亲手仿真出来的。后面我会专门讲怎么在IC617里用DC扫描直接画出自己设计的反相器的VTC。1.2 噪声容限允许系统“不完美”的底气数字电路和模拟电路最大的区别之一是数字信号有“好坏”区间。一个信号只要被判定为高哪怕它不是完美的VDD也能正常工作。这就引出了噪声容限的概念。四个关键电平要先记牢参数含义典型定义VOH输出为高时的最小电压高电平输出的下限VOL输出为低时的最大电压低电平输出的上限VIH输入被判定为高的最小电压高电平输入的下限VIL输入被判定为低的最大电压低电平输入的上限高电平噪声容限NMH VOH - VIH低电平噪声容限NML VIL - VOL。它们表示当一个高电平信号从一级反相器输出经过导线传入下一级时中间能容忍多少噪声干扰而不至于被误判成低电平。为什么这个指标很重要因为真实芯片里没有绝对干净的信号。长走线会有压降相邻信号线之间存在耦合串扰电源地网络还有噪声波动。如果噪声容限很小一级输出的信号到下一级就可能判错整个数字逻辑就崩了。设计反相器时把VTC做陡峭、把VM放在VDD/2附近就是为了让噪声容限尽量大。1.3 转换时间、传播延时与速度的影响因素转换时间描述的是信号“变化得多快”传播延时描述的是信号“从输入到输出滞后多久”。这两个概念很容易混但物理含义完全不同。转换时间一般分上升时间tr和下降时间tf。tr是输出从10%VDD上升到90%VDD所需的时间tf反过来。它衡量的是输出波形边缘的陡峭程度跟输入信号的边沿速度、电路驱动能力、负载电容直接相关。传播延时分两段tpHL是输入变化到输出从高变到低、越过50%VDD之间的时间tpLH是输出从低变到高时对应的时间。平均传播延时tp (tpHL tpLH) / 2。它才是决定电路工作频率的关键指标。那什么东西影响速度我用一张表总结因素对速度的影响原因负载电容CL越大越慢电容充放电需要时间电流一定时电荷量越大越慢晶体管宽度W越宽越快但有上限宽管驱动电流大但栅电容和扩散电容也增大电源电压VDD越高越快栅过驱动电压增大导通电流增大阈值电压VTH越低越快过驱动电压(VGS-VTH)变大但静态功耗上升这背后有一个核心公式的直觉版本就是tp大约正比于CL × VDD / IavgIavg是充放电过程中的平均电流。这个电流由晶体管尺寸、电源电压、阈值电压共同决定。理解这个关系之后你看到任何反相器尺寸调整都能立刻推断它是在牺牲什么换取什么。比如加大PMOS宽度可以让上升沿变快但同时也增加了输入端的栅电容反过来会让前一级的传播延时变大。2. 基于IC617的库与单元准备2.1 建库这一步千万别图省事很多人画原理图就直接在默认库里新建cellview这是新手最常见的问题之一。正式的Virtuoso环境里所有设计都应该放在自己的library里而且要正确挂接工艺技术库。启动virtuoso之后在CIW窗口走File - New - Library给库起个名字。这个库名最好能体现项目或练习内容比如lab_ic617_digital。之后会弹出一个对话框问是否attach to existing technology library一定要选“是”然后选择你使用的PDK比如gpdk090或者其他工艺库。技术库挂接的意思是让你的设计库继承工艺文件里的器件模型、版图层次、设计规则等信息。没有这一步后面调用的晶体管没有模型定义仿真器直接报错版图阶段更是寸步难行。所以建库这一步宁可按部就班也别跳过。2.2 从PDK里把晶体管“请”出来在Library Manager里定位到刚建好的库右键新建Cell View。Cell Name我建议就叫invView Name选schematic工具选Schematic Editor。这里有一个命名习惯问题cell名是电路的“身份证”后面symbol、layout都会挂在这个cell名下取一个有意义且统一风格的名字非常重要。打开原理图编辑器之后按快捷键i或者菜单Create - Instance弹出添加器件窗口。在Library一栏选你的PDK库Cell一栏选PMOS和NMOS管。以常见的教学PDK为例可能会有nmos1v、pmos1v这类名字对应的就是1V供电的标准阈值器件有的PDK里叫nch、pch。不同PDK命名差异很大但有一点是通用的反相器里的N管和P管必须是同一个电压等级、同一种器件类型否则仿真结果会非常怪异。添加实例时还有一个容易忽略的点PDK里的晶体管通常是四端器件带衬底端B。后面连线时绝对不能漏掉它。如果你用的是五端模型读取模型参数时也要确认一下阈值类型和源漏是否区分。2.3 从第一张图就建立层次化思维原理图上器件一多就容易乱。反相器只有两个管子还看不出什么但一旦做门电路、触发器、加法器层次化设计会极大影响效率。标准的做法是一个子功能做成一个cell生成symbol在上一级只调用symbol不去直接堆晶体管。这个意识要从画反相器就开始培养。也就是说这个inv cell除了有schematic视图之外最终还必须生成symbol视图。后面搭testbench、做更高层电路时都用inv symbol来调用而不是重新摆两个管子。这样既能复用也让原理图保持简洁。3. 反相器原理图从零到完整一步步连线3.1 先摆管子再想连线打开空白的schematic编辑器后先按i把PMOS和NMOS放上来。个人经验是PMOS放在上方NMOS放在下方两者稍微拉开一点距离留出连线和打pin的空间。放置时可以用快捷键r旋转器件方向让它符合自己习惯的布局。为什么PMOS在上、NMOS在下从电气原理来说PMOS的源端接VDDNMOS的源端接GND上下布局最直观从衬底连接和后续版图的角度看这也是标准CMOS工艺里well区和substrate区的自然分布。虽然原理图阶段不对版图负责但从一开始就按这个习惯画后面转版图时会省掉大量调整工作。3.2 连线顺序先把“骨架”搭稳放置好两个管子后我建议按下面的顺序连线而不是想到哪连到哪先把PMOS的源端接到VDDPMOS的衬底B也接到VDD。把NMOS的源端接到GNDNMOS的衬底B也接到GND。把PMOS和NMOS的栅极用一根线连起来作为输入端。把PMOS和NMOS的漏极用一根线连起来作为输出端。这个顺序的价值在于先把“电源骨地骨”搭好再走信号线。信号线是最需要看清的路径如果一开始就乱糟糟地连信号后面加电源地线时很容易压住或者绕弯。连线时按w键画wire从一个pin端点出发到目标pin端点结束连线头会显示小方块的连接标记。这一步看似简单但连接标记是否出现直接决定你是否真的连上而不是“看起来连上了”。3.3 衬底接线的深层原因很多跟我同期学习的同学第一次画反相器会把B端留在那里不管。我后来才彻底理解为什么不接不行。MOS管的衬底和源极之间是一个PN结。在正常工作状态下衬底必须接到一个确定的电位保证这个PN结反偏从而让晶体管真正工作在截止/导通受栅压控制的状态。PMOS的衬底接最高电位VDDNMOS的衬底接最低电位GND就是为了保证体二极管始终反偏。如果不接仿真器会认为衬底浮空体效应偏置不确定轻则波形不对重则直接报错或者电流异常。这一点在原理图阶段就养成习惯后面画版图时理解guard ring的意义也会更顺。3.4 电源地的两种连接方式在原理图里表示电源和地常见做法有两种一种是放置analogLib里的vdd和gnd符号另一种是直接用Wire Name给网络命名。我的做法是在反相器cell内部直接用VDD!和GND这种全局命名来标记不放置具体的电源地符号。这样做的原因是反相器本身是一个子模块具体电源电压值应该在testbench里给。全局标号的好处是跨层次引用时不需要额外物理连线大大简化了层次化设计。不过需要提醒全局标号的命名要统一规范否则一个拼写错误就会导致网络没有正确连接而这种错误在检查时非常难发现。在testbench那一层我会放真正的电源和地符号或者用vdc电压源来提供电源电压。两种方式最终在仿真器里效果是一样的区别只是使用习惯。3.5 检查保存从第一次连线就开始画完连线后按快捷键x执行Check and Save。Virtuoso会检查原理图的电气连接是否完整并把错误显示在CIW窗口和原理图上。这一步千万别偷懒每画一个阶段就检查一次不要等到全部画完才查。常见的错误包括实例的某个pin没有连接报unconnected pin连线只是搭在pin旁边但没吸附报open connection创建pin时方向设置错导致输出方向没有避开输入方向网络名重复或冲突我看到过一些新手画完直接生成symbol结果symbol里的输入输出方向全乱了。原因就是在原理图阶段pin的direction没有设置正确。检查工作做得越勤后面返工越少。3.6 生成Symbol让反相器变成可复用的黑盒子原理图检查无误后走Design - Create Cellview - From CellviewVirtuoso会根据当前schematic生成一个默认的symbol视图。弹出的窗口里可以调整pin的位置和方向。默认情况下输入输出pin会被自动摆出来但位置可能需要手动调整。我个人习惯做这些调整输入pin放左侧输出pin放右侧VDD放上方GND放下方。这样做出来的symbol一眼就能看出信号流向后续画testbench或者更顶层电路时不需要反复对照cell内部结构。symbol的图形本身也可以改比如把边框画成标准反相器的三角形加小圆圈但这属于锦上添花功能上不影响。生成symbol之后一定要记得保存。这时inv cell名下就有了schematic和symbol两个视图。4. 仿真验证让画好的反相器“开口说话”4.1 搭一个最小测试台画完反相器不仿真等于没画。接下来要新建一个testbench cell我一般命名为inv_tb也建在自己的库下面。在这个schematic里按i添加inv symbol。添加analogLib里的vdc作为输入激励一个vdc作为电源。添加analogLib里的gnd符号。按p打两个pin一个记作vin一个记作vout方便仿真时选择plot点。输入端vdc设置成变量名Vindc值可以先给0.9V如果PDK是1V工艺。电源vdc设1V。这里用变量而不是固定值是因为后面瞬态仿真和DC扫描都需要输入电压发生变化固定值根本没法扫。如果你想做瞬态仿真看翻转过程推荐用vpulse而不是vdc。参数大致可以这样设参数值说明V10低电平V21V高电平Delay0开始延迟Rise time100p上升边沿Fall time100p下降边沿Pulse width5n高电平持续Period10n周期这个参数组能产生一个0-1V、周期10ns的方波。上升沿100ps对1V电源来说足够理想又不会让仿真器因为边沿太陡而疯狂缩短步长。之前我试过把rise time设成1fs结果仿真步长小到离谱半天跑不完后来才学会在理想和可仿真之间找平衡。4.2 瞬态仿真看它是不是真的会“反”testbench准备好之后打开ADE L仿真环境。路径是Launch - ADE L。在ADE L里Setup - Simulator/Directory/Host选择spectre仿真器其他保持默认。Analyses - Choose选择tran瞬态分析Stop time设为20n。Outputs栏里选择要plot的net把vin和vout都选进去。Simulation - Netlist and Run。跑完之后波形窗口会出现输入方波和输出波形。第一眼应该看到输入从0跳到1时输出从1降到0等待一个周期后输入从1跳到0输出又从0升回1。在输入上升沿对应位置输出有一段很短的过渡时间这就是传播延时存在的直观表现。如果波形完全不对比如输出没有翻转或者输出电平只有0.5V大概率不是原理图连线错误就是器件选型错误。可以先回schematic里确认两个管子的源漏栅是否接对了位置再看一下B端是否接好。我遇到过好几次“输出只有半截电平”的问题最后发现是NMOS的源漏接反了。4.3 DC扫描画VTC亲手画出那条曲线瞬态仿真验证了逻辑正确下一步做DC扫描画出VTC曲线。在ADE L里新建一个dc分析扫描源选择输入vdc也就是变量Vin从0扫到1V步长可以设1mV或者0.5mV。选步长时要考虑仿真速度和曲线平滑度的平衡1mV已经足够。跑完之后把vout和vin画在同一张图里横轴是输入电压纵轴是输出电压。你看到的这条翻转曲线就是反相器的电压传输特性。用手动测量的方式读一下关键参数VOH大约在曲线最高点附近VOL在最低点附近。VIH和VIL的定义是两个斜率等于-1的点在波形窗口里可以把光标放到曲线上观察曲线斜率变化找到最陡峭区域两侧的转折位置。粗略估出来之后NMH和NML用前面的公式一算就能得到。实测数据会因工艺不同而有差异但有几个趋势是共通的VTC翻转区越陡噪声容限越大翻转点VM越接近VDD/2高电平噪声容限和低电平噪声容限越均衡。如果你扫描出来的VM明显偏高说明PMOS过强或者NMOS过弱可以调整宽长比重新仿真。这一步就是把第一节的概念和实际设计联系起来的时刻。4.4 用Calculator量传播延时和转换时间瞬态波形已经跑出来了打开Virtuoso Calculator可以精确测量传播延时。在Calculator窗口里Functions菜单下有Delay函数。选择输入net和输出net阈值设置为0.5表示比较波形的50%电平点。跑完之后它会给出一串数字其中就有tphl和tplh。取平均值就是平均传播延时tp。测量转换时间的方法类似用cross函数量输出波形从0.1VDD上升到0.9VDD的时间差得到tr反过来量tf。如果不熟悉Calculator也可以直接在波形窗口里用两点标记工具手动量时间差学习阶段手动量一遍有助于建立数值直觉。这里要提醒一句单一温度点、单一工艺角下的传播延时只是一个孤立的数。实际设计中同一批芯片因为工艺偏差fast corner和slow corner下的延时可能差出两倍以上。学习阶段先会量后面再学corner和温度扫描这才是一个完整的验证意识。4.5 顺手验证一下负载对速度的影响反相器在实际电路里要驱动下一级的栅电容和连接它们的导线电容。这个负载大小直接影响速度。为了直观感受这一点可以在vout节点上加一个电容比如analogLib里的cap容值设为10fF重新跑tran看传播延时变了多少再换成100fF、200fF各跑一次把延时记下来对比。这个实验比任何公式都直观。你会看到负载电容从10fF涨到200fF时传播延时几乎等比例变大。这就是为什么后端版图寄生提取之后关键路径的延时往往比原理图仿真大很多。原理图阶段完全不加负载的仿真只能说明逻辑功能正确不能说明实际电路能跑多快。所以给关键节点加上合理的预估负载再去看时序才比较接近真实情况。5. 原理图阶段就该养成的习惯与避坑清单5.1 我自己踩过的几个具体坑这里把我实际遇到的坑整理出来每一条都是真金白银换来的经验。第一用错PDK管子。有一次我把3.3V的管子当成1V器件用在一级反相器里VTC曲线怎么扫怎么怪输出高电平上不去。后来检查器件属性才发现电压等级选错了。教训是画图前先确认环境变量和PDK版本添加器件时多看一眼Cell参数。第二忘记接B端。这是新手最容易犯的错。现象是仿真报错或者波形看似正常但电流明显不对。原理图检查时应该主动勾选unconnected pin检查。第三vpulse的delay参数设太大导致前面一大段波形平白无故多出一截没用的电平浪费时间。做功能验证时delay设成0就够除非你要测试setup/hold时间。第四DC扫描时忘了把输入vdc设成变量。扫描设置里虽然填了变量名但schematic里那个vdc的dc值还是固定数字结果跑出来是一条直线。这种现象极具迷惑性我当时盯着直线想了半小时才想起去看vdc属性。第五pin的direction设置错误。输入输出pin在schematic里如果方向没设好生成的symbol上就会带错方向顶层调用时wire name很容易连反。这个问题在symbol阶段发现已经算早如果一路带着错pin做到版图返工成本就大了。5.2 画图顺序与标准化意识原理图不是给自己一个人看的。同一张图几周之后自己再看都可能想不起来当初的思路更别说交给别人check。我现在的标准化流程是先画信号主路径也就是输入到输出这条线再连电源地线最后处理衬底连接。画完一小块就按x检查保存不要攒到最后一次性检查。电源和地的命名全局统一坚决不用VDD和vdd这种混写避免工具把它们当成两个不同网络。所有net的label放在相对固定的位置能不用wire name的地方尽量直接连线减少命名带来的歧义。输入放左、输出放右、电源上、地下的习惯从一开始就严格执行。做单级反相器看不出差别可等到画一个八输入与非门、甚至一个寄存器堆时好的图序能让你十分钟找到信号通路乱的图序可能让你盯着屏幕怀疑人生。5.3 原理图到版图的衔接意识这篇虽然只讲原理图但我强烈建议在画图阶段就为版图留好后路。反相器的版图标准做法是PMOS在上、NMOS在下两个管子共用栅极多晶硅走线漏区共用扩散区。原理图构图时如果也按这个逻辑摆放和连线后面画版图时几乎可以一一对应。反之如果原理图里两个管子位置是随意放的、绕线绕得乱七八糟版图阶段就要边看边猜网表LVS报错时也很难对照。另外cell命名在版图阶段同样重要。LVS的网表会包含cell名、pin名和instance名命名越规范比对越轻松。有的工艺还要求特定的电源地命名在设计前查一下PDK文档能省很多事。5.4 给同期入门同学的学习路径建议最后说几句学习节奏上的体会。第一别贪多。反相器是数字电路最底层的积木把这一级吃透比画十个不理解的复杂单元有用。所谓吃透不是画通就行而是要能解释每条曲线的形状、每个参数的变化趋势。第二尺寸扫描一定要亲手做一次。改几次W/L观察VTC和传播延时怎么变再去读教科书里那些公式你会觉得公式突然“活”了。第三每做一步都随手存台账记录参数和现象不用很复杂记下用了什么尺寸、扫描了什么范围、结果怎样后面复盘效率会高很多。第四遇到问题先看CIW报错信息再搜索最后再问人。我在学习过程中发现绝大多数报错都是操作细节问题看几眼报错就明白了把这些搜索过程留在脑子里其实是一个很好的查漏补缺过程。我的体会是反相器虽小但它把数字集成电路里最核心的设计验证流程完整走了一遍。从挂接工艺库开始到调用PDK管子理解了衬底为什么必须接固定电位最后能亲手画出VTC、量出传播延时这整条链路走通之后再往上加逻辑门、触发器都只是在这个骨架上增加复杂度罢了。这篇先记到这里后面我打算整理瞬态仿真不收敛问题的排查过程到时候再继续更新。