TSMC65nm工艺下Virtuoso仿真gm-id曲线的保姆级教程(含ADE设置详解)
做模拟IC设计的朋友应该都经历过这种场景:拿到一个新的工艺节点,不知道管子该用多长的沟道,不知道电流密度取多少合适,只能翻着别人的论文抄一个宽长比,结果仿真出来增益带宽全都不对劲。几年前我开始接触TSMC 65nm工艺时也是这么干的,直到把gm-id方法真正用起来,才有一种“终于摸到门道”的感觉。这篇教程就从一个实际可复现的流程出发,手把手带你在Cadence Virtuoso里用ADE跑出gm-id曲线,并把这些曲线变成后续设计可以直接查表的数据。
我默认你已经装好了带TSMC65nm PDK的Cadence IC617(或者IC618)、MMSIM仿真器,也知道怎么启动Virtuoso。如果你连PDK的安装都还没搞定,先去把工艺库路径配好,再回来看这篇。因为整个流程涉及大量ADE的设置细节,我尽量把每一步菜单路径、参数取值、容易踩的坑都写清楚。
1. 为什么要用gm-id方法:65nm工艺下传统设计法开始失效
很多教科书讲模拟电路设计,还是沿用人造参数的方式:先定过驱动电压Vov,算出跨导gm,然后反推宽长比W/L。这个方法在180nm甚至更老的工艺里勉强能用,但到了65nm以下,短沟道效应已经很严重,同一根管子在不同的沟道长度L和漏源电压Vds下,gm与Id的关系、本征增益gm/gds的变化,都和长沟道模型的教科书公式对不上。你拿着Vov = 200mV的假设去算宽长比,实际流片回来的管子可能早就进了弱反型区,或者强反型区的行为跟你算的南辕北辙。
我们来看一组典型的65nm数据感受一下:一个最小沟道长度的NMOS(L=60nm),Vgs从0.2V扫到1.0V,如果按教科书公式,gm/Id应该在Vov很小的时候趋近于一个固定的极限值(2/Vov),但实际上Vds不同、L不同,这个比值从接近30(深亚阈值区)一路掉到不到5(强反型区),变化范围非常大。问题是,这个比值恰恰决定了你电路能达到的最高增益、需要的电流大小、以及噪声性能。
gm-id方法的本质就是:把晶体管当作一个查表器件来对待,不再依赖简化公式,而是直接从仿真结果读取( W/L、Vgs、Vds和gm、Id、gm/gds、电容等参数之间的映射关系)。在65nm下做设计,相当于用一张张“实测曲线”替代教科书公式,这也是业界主流模拟设计流程里非常重要的思路。
我自己用下来的体会是,gm-id方法最适合以下几种场景:
- 低功耗设计时需要在最小电流下达到最大跨导;
- 高性能运放设计时需要在给定的gm下选择最优的长度;
- 不同Vds条件下评估管子的工作区域;
- 做工艺角分析时,快速对比不同corner下gm-id曲线漂移多大。
2. 环境准备与工艺库配置:先搞清PDK路径和基础设置
不管你是要画版图、跑前仿还是做gm-id扫描,第一步都要确保PDK能正常加载到Virtuoso里。TSMC65nm的PDK通常在安装目录下有tsmcN65或者类似的库名,不同foundry、不同代理商给的PDK目录名可能略有区别。你在CIW(Command Interpreter Window)里输入:
libraryManager打开Library Manager确认一下有没有tsmcN65这个库,如果没有,在CIW窗口执行:
load "/path/to/your/pdk/init.il"把/path/to/your/pdk/换成你的实际安装路径。建议把这一行写进你的.cdsinit文件里,这样每次启动Virtuoso都会自动加载,不用每次手动敲。如果你拿到的是已经打包好的工艺库,直接检查cds.lib文件里是否包含这行:
DEFINE tsmcN65 /home/yourname/pdk/tsmcN652.1 创建测试库和cellview
工艺库配置好之后,我们需要一个独立的测试库来存放仿真用的schematic。菜单栏选择:
File -> New -> Library输入你想要的库名(比如gm_id_lib),点击OK后会问你是否附加已有techfile,选择“Attach to an existing technology library”,然后在列表里选中tsmcN65。这一步很重要,不attach techfile的话,你新建的库里的器件没有工艺层的定义,仿真也跑不起来。
接着在这个库里新建cell view。仍然在Library Manager里:
File -> New -> CellviewCell Name可以叫test_nmos_gmid,View Name选schematic,Open with选Schematic Editor。进入原理图编辑器后,按快捷键I调出添加器件窗口,在library下拉框里找tsmcN65(也可能叫其他名字,比如analogLib里也有理想开关,但我们要用的是工艺库里的真实模型),在cell里找nch(普通阈值NMOS)或nch_lvt(低阈值NMOS)。如果你用analogLib里的nmos4,就没法用上65nm的工艺参数,这一步不要搞错。
把nch放到原理图里,继续按I添加:
gnd(analogLib里的接地符号,用来给源极和衬底提供参考地);vdc(analogLib里的直流电压源,用来给栅极和漏极提供偏置)。
连线方式:NMOS的源极S和衬底B接地,漏极D接一个vdc(命名为 vdd_sweep),栅极G接另一个vdc(命名为 vg_sweep)。
2.2 器件参数的初始设置
先双击NMOS,把Model name填上nch,如果你在tsmcN65库里看到的model叫别的名字,去PDK文档里查一下,通常为nch、pch、nch_25这种带后缀的变体,对应不同耐压或阈值。本文按nch写。还需要设置:
Width = 1u(单位微米,直接写1u)Length = 60n(强制用最小沟长160n? 不,65nm工艺默认最小沟道一般是60nm,但我们先不追求极限,你可以先用80n或者100n来扫描,避免一开始就撞上各种短沟道效应导致的异常)
双击vdc设置电压值:vdd_sweep设成0V,vg_sweep设成0V,后面用ADE里的变量和扫描来实现。
关于Well连接的问题:如果是nch,衬底电位会直接关系到阈值电压。TSMC 65nm下NMOS衬底默认接全局地gnd,如果你的PDK里有明确的sub!或者bulk端子,也要确保接上了地。很多第一次玩的人漏掉了B端接线,仿真跑出来的结果不管Vgs怎么变,漏极电流都是0,查了半天全都是这个低级错误。
3. ADE L环境下的gm-id扫描设置:从新建到出图的全流程
我们用最常用的ADE L来做DC扫描。打开方式是在原理图窗口点:
Launch -> ADE L3.1 设置仿真类型与变量
在ADE L窗口,菜单栏选:
Simulation -> Convergent -> Analyses -> dc或者直接点工具栏上的dc图标。弹出来的DC Analysis窗口里,勾选Save DC Operating Point。TSMC65nm PDK如果带了 spectre 模型,这一步不用特别改;如果你用的是APS(Advanced Parallel Simulator),后续会更快,但这里我们按标准spectre流程走。
在ADE L里需要把原理图中的电压值参数化。点击Variables -> Edit(或者工具栏里的Edit Variables),Category选All,把vdd_sweep和vg_sweep加入变量列表。如果没有自动读取,可以手动添加,值的类型选single。
扫描方式有两种,看你想得到什么:
- 固定Vds,将Vgs作为自变量扫描:这是最常见的gm-id曲线画法。例如固定 Vdd=0.2V,扫描 Vg=0V 到 1.0V,步长 5mV。这样能得到一族曲线。
- 同时扫描Vds和Vgs:
Design Variables里把vdd_sweep选为Sweep,值范围可以设0.1V到1.2V,例如步长0.1V。vg_sweep也可以设为Sweep,范围0V到1.0V。两个变量一起扫,会形成二维扫描,适合生成查找表数据。
3.2 DC Analysis对话框里的关键参数
如果要在DC窗里设置双变量扫描,注意两个变量的Sweep顺序。一般把外层Sweep设为Vds,内层Sweep设为Vgs,这样出图时同一个Vgs下可以看到不同Vds的曲线族。
- 扫描变量1:
vdd_sweep(Vds),Sweep Range:0.1到1.2,步长:0.1 - 扫描变量2:
vg_sweep(Vgs),Sweep Range:0到1.0,步长:0.01
注意:TSMC65nm标准器件的最高工作电压一般为1.2V(或者1.0V,取决于你用的哪种管子),最好确认PDK文档。超过额定电压不一定会报错,但仿真结果以及后续流片会有可靠性风险,这里就按标准工作电压来做。
设置完DC Analysis窗口后,点击OK退出,回到ADE L。
3.3 输出变量的设置
要画gm-id曲线,本质上需要计算:
[ \frac{g_m}{I_D} ]
在ADE L里直接输出这个比值,可以有两种方式:
用输出表达式: 先添加输出。菜单
Outputs -> Setup,在窗口的Outputs列表双击空白行,输入表达式:gm_over_id((V0 "/D"))但是注意,这里我们最好直接算:
deriv((V0 "/D") (V0 "/G")) / (V0 "/D")或者用计算器 “Calculator”,打开方式在ADE L窗口的工具栏里有个计算机图标(可能叫Calculator或Results->Calculator)。
更简单的方式:在波形窗口(Waveform Window)里用
Calculator的gmid按钮。老版本Virtuoso的计算器有专门针对gm-id设计的函数按钮,新版本IC618里直接输入gmid((V0 "/D"))应该也能识别。如果你用的是IC617,可以用deriv函数:deriv((V0 "/D") vg_sweep) / (V0 "/D")这里
(V0 "/D")表示NMOS漏极节点电流,源极是接地,所以直接取D端电流即可。也可以取(V0 "/M0/D"),如果菜单里没认出器件名,就先跑一次仿真,让output reference自动更新。
我个人更推荐在Outputs里加两个输出:
(V0 "/D")—— 直接看漏极电流Id;deriv((V0 "/D") vg_sweep) / (V0 "/D")—— 这个就是gm/Id。
跑完之后分别出图,再叠加到一起看。这样你既能确定工作电流,又能查到对应的效率。
3.4 运行仿真并确认结果
点ADE L工具栏上的绿色运行按钮(或者按F6),等待仿真结束。如果电路连接正确且变量范围设置合理,应该很快出结果。仿真结束后,在Results -> Direct Plot -> Main Form里可以点dc,然后到原理图里点NMOS的D端(或者直接在Outputs里用波形窗口查看)。
出波形时,一个常见问题:如果同时扫了Vds和Vgs,波形窗口默认会用外层变量作为曲线族的分组,内层变量作为x轴。你要确认:
- x轴是Vgs:选中曲线后,Waveform窗口里右键 -> Properties,查看Trace Expression和X Axis变量名。如果x轴变成Vds,而曲线族是Vgs,那gm-id曲线看起来会奇怪,横坐标对不上,分析时容易误判。
- 坐标轴选择正确的显示模式:如果Vds有0.1、0.2、0.4、0.8、1.2好几个值,波形窗口会画出多条曲线。你内心要清楚当前看的是哪一根,或者直接在Expression里把Vds固定成某个值重新跑一个单变量的扫描,这样图形更清晰。
我们核心目标是得到gm-id曲线图。当窗口里显示了gm/Id vs Vgs的曲线族后,我们可以在同一个x轴下叠加Id曲线族。这样你在设计时:给定目标gm/Id,就能读到一个Vgs;标准工作电流下,也能看到一个Vgs。这个“双图对照”是使用gm-id流的核心习惯,后面设计放大器、比较器、LDO误差放大器都用得上。
4. 从曲线到设计参数:用输出表达式和Calculator查表
跑出曲线还不算完,gm-id方法的延展性在于“查表”,所以你要把仿真数据和设计指标衔接起来。
4.1 用Calculator计算gm、gds和本征增益
除了gm/Id,我们在设计时经常要看的是本征增益 ( A_{v0} = g_m / g_{ds} ),以及器件的寄生电容 ( C_{gg} )、( C_{gd} )。这些值在DC仿真里也能直接输出。
在你已经跑完DC扫描之后,打开Calculator,依次输入以下表达式,然后送进Outputs或者直接在波形窗口看:
gm((V0 "/D")) // 跨导,单位S gds((V0 "/D")) // 输出电导,单位S gm_over_id((V0 "/D")) // gm/Id (gm((V0 "/D")))/(gds((V0 "/D"))) // 本征增益如果你的Virtuoso版本没有内置gm_over_id函数,就写成:
deriv((V0 "/D") vg_sweep) / (V0 "/D")注意,这里的导数是用内层扫描变量vg_sweep来微分的,如果当前波形窗口的x轴不是vg_sweep,波浪线就会出错。一定要先确认内层变量是Vgs,或者直接在表达式中显式指定对vg_sweep求导。
4.2 把二维扫描结果变成查找表(LUT)
跑二维扫描得到整个gm-id曲面之后,下一步是导出数据。这里我推荐用Ocean脚本一键导出表格式文本,方便后续用Python、MATLAB或者单纯的Excel做设计查表。
在ADE L的菜单栏:
File -> Save Script可以把当前设置和输出全部保存成一个ocean脚本。下面是我常用的一个模板,在你自己的环境里改一下输出路径和变量名就能直接用:
; 导出gm-id查找表 simulator( 'spectre ) design( "/home/yourname/gm_id_lib/test_nmos_gmid/schematic" ) analysis( 'dc ?param "vdd_sweep" ?from 0.1 ?to 1.2 ?step 0.1 ?param "vg_sweep" ?from 0.0 ?to 1.0 ?step 0.01 ) desVar( "vdd_sweep" 0.2 ) desVar( "vg_sweep" 0.0 ) temp( 27 ) run() selectResult( 'dc ) exportData( ?output " /home/yourname/gmid_lut.csv" ?type "csv" ?expr '( (V0 "/D") (deriv((V0 "/D") vg_sweep)) ) ?number 1 )注意里面exportData的?expr可以写多个表达式,CSV里会一次输出多列。我个人习惯是把每个L长度都跑一遍这个脚本,然后在文件名里标记L=60n、L=80n、L=100n、L=200n。因为gm-id方法最强的应用场景就是对不同长度做横向比较:同样 gm/Id=15的时候,L=60n的管子能达到的最高本征增益可能是几十倍,而L=300n可能增益高一个数量级,但速度会慢很多。做运放时你常常要根据速度要求选一个合适的L,再围绕这个L去查电流密度和版图尺寸。
4.3 从LUT反推W和偏置
假设你的设计指标是:需要gm = 1mS,且希望功耗尽量低。你提前定好L=100n,查L=100n这组曲线,发现:
- 当gm/Id=15时,对应的 Id/(W/L) 大约在25uA附近(这张曲线可以帮你看电流密度,而不是绝对电流);
- 如果要Id=20uA,那么W/L = 20u / 25u = 0.8,即W=0.8×L=80n,W取整到80n或100n都行;
- 对应的Vgs大约在0.45V。
这里关键点就是,用gm-id法能保持“先定效率和尺寸,再反推电压和电流”的思路,而不是反过来先猜一个Vov。当你需要快速检查一个运放的第一级是否处于合适的效率点,直接在输出列表里查看gm/Id,比翻教科书快多了。
5. 从单点仿真到设计参数观察:典型参数检查
一旦扫出了gm-id曲线,我们还可以通过改变沟道长度来画一组完整的设计参考图,这个思路非常实用。
5.1 固定Vds,扫不同L
在原理图里把NMOS的Length参数改成变量,比如设成Lvar(初始值先给100n),然后在ADE L里把Lvar也加入设计变量。为了得到完整的曲线家族,你可以手动把Lvar设为一组固定值,分别跑仿真并记录。
- 变量:
vg_sweep从0到1.0V,步长0.005; vdd_sweep固定为0.9V;Lvar取一组值:60n、80n、120n、200n、400n、1u。
每次跑完,用同一套输出表达式gm_over_id画曲线,你可以直接把不同Lvar的结果叠加到同一个波形窗口。设置方法是:在ADE L里点Tools -> Waveform可以打开波形窗口,再把每一轮的曲线用Append加进去。如果你每跑一次Lvar都在Outputs里选中同一根表达式,再点绿色的绿色“添加曲线到当前波形”,就能实现叠加。
叠加结果会让你看到几个非常直观的现象:
- 同样是Vgs=0.5V,L越小,gm/Id通常越低(短沟道器件效率下降);
- L越大,达到同样gm/Id需要的Vgs更低(近似于更接近长沟道行为);
- 强反型区(gm/Id小于10)时,不同L的差异变小,说明强反型下调gm/Id主要由Vgs决定,沟长影响减弱。
5.2 查看不同Vds下的gm-id曲线族
将vdd_sweep设为外层扫描,vg_sweep设为内层扫描之后,你会看到不同Vds下gm-id曲线有一定平移。记住这几个趋势,实际设计很有用:
- Vds越低,管子进入饱和区越勉强,gm/Id最大值通常会下降;
- 深三极管区(Vds < Vov)时,gm/Id会迅速衰减,设计时要注意是否真的工作在饱和区。
所以以后做低压设计,不能只看某一个Vds下的曲线,要用工作点附近的Vds值去查表。以我自己做过的65nm LDO误差放大器为例,输出支路Vds本来就压得很低,如果用0.6V的曲线去查表,设计出来的输入对管工作点明显偏乐观,实际仿真出来后增益比预期低不少。换成0.3V的曲线重新选型,问题一下解决。
6. 关键工艺角与corner检查怎么做
模拟设计不可能只跑tt corner,gm-id曲线在ss、ff、sf、fs下差异很大。在64nm下,ff和ss的阈值电压挪动可能达到80~100mV,gm/Id同样位置差个5~10是很常见的。所以你要把ADE设置里的corner切换掌握好。
6.1 在ADE里切换工艺角
不同PDK设置corner的方法略有不同。TSMC65nm的PDK通常提供一组model library,在ADE L中:
Setup -> Model Libraries在弹出窗口里能看到类似model.xxx的列表,每行可能有section字段。如果你找不到section列,检查Spectre选项下的Model Library File路径,看看是否有statistics文件,或者在netlist里生成的语句是否包含section=。
比较通用的做法是在Model Libraries窗口选中相应工艺库后,修改Section为ss、ff、sf、fs。例如:
tt:典型NMOS典型PMOSss:慢NMOS慢PMOS(阈值高、驱动弱)ff:快NMOS快PMOS(阈值低、驱动强)fs:快NMOS慢PMOS
改完section后,重新运行DC扫描。你会发现gm-id曲线整体右移或左移。这个信息很重要,尤其是做低功耗设计时,ss corner下的最小可用gm/Id往往限制了你的功耗预算。
6.2 如何对比多个corner的gm-id曲线
建议先把tt corner的曲线跑完,导出一个CSV;然后切corner再跑,导出一份。用Python画在一起,或者直接在Virtuoso里用Direct Plot叠加。个人经验:你至少要对比tt和ss两个corner,因为ss下阈值电压高、过驱动电压变小,同样的Vgs偏置下gm/Id更高还是更低并不完全直觉——阈值高了,管子进入强反型更晚,但Vgs-Vth变相同值时电流变小,所以效率反而有可能更高。要自己看数据才能下结论。
这里有一个更省力的做法:如果PDK支持statistics文件,直接在ADE XL里设置corner列表,一次跑完所有corner并自动产生所有曲线。但本文默认你还在用ADE L入门,就先手动切换corner,弄懂原理之后再迁到ADE XL做批量。如果你手头有Ocean脚本,也可以写一个循环自动跑corner并保存所有结果,这样就不用手动切了。
7. 常见问题排查:仿真发散、波形红线、电阻不显示阻值的应对
实际跑仿真的时候,不会像教程这么顺。以下是我遇到过且比较有代表性的几个问题,集中列给你参考。
7.1 仿真发散或“Direct Newton iteration failed”
原因很多,最常见的三个:
- Vgs扫到负值或Vds扫到负值,某些模型在负压下极容易不收敛。TSMC65nm的耗尽管较少见,但如果你的nch库里有特殊器件,对负压特别敏感。解决办法:把扫描范围控制在合理正压之间(0~1.2V),别为了图方便扫到负的。
- 变量跨度太大,步长太粗。如果你Vds从0到5V跨度很大的话,直接把DC sweep的步长改成自适应或者分段。通常65nm器件超过1.2V后模型行为变得复杂,容易不收敛。
- 浮空节点。回到原理图看B端有没有接地,看sub端子是否接好。以前我遇到过衬底和源极各接了一个地符号,但实际上B端悬空,这个问题最好是通过Check and Save(快捷键X,或者菜单
Design -> Check and Save)检查,看看有没有未连接pin的warning。
如果你已经排除了以上三项,可以在ADE L里改仿真器的迭代选项:
Simulation -> Options -> Simulation在Iteration栏目里把gmin调大到1e-12,或者把iabstol(电流绝对精度)放松到1e-12,通常能缓解。也可以用Spectre的homotopy设置,先跑一个gmin步进,再把gmin收敛回来。基本原理就是给每个节点并联一个小的电导,帮助Newton迭代稳定。
7.2 波形显示是红线(表示异常值)
如果在波形窗口看到的是一条条竖直或乱七八糟的红线,首先不要慌。通常原因是表达式里选择了对错误的变量求导,比如你输出的是deriv((V0 "/D") vg_sweep)但当前x轴变量是vdd_sweep。这时求导会对Vds求,结果可能在每个Vds阶梯处出现巨大尖峰,画出来就是红线。解决:在波形窗口重新把x轴改成vg_sweep,或者重新添加输出表达式,让它显式映射到正确变量。
7.3 Virtuoso里电阻不显示阻值仿真的问题
标题热搜词里有一条:“virtuoso中电阻不显示阻值怎么办”。虽然和gm-id没有直接关系,但如果你在同一个schematic里放了多晶硅电阻,跑完DC后想看它的阻值却显示0,通常是因为TSMC65nm PDK的多晶硅电阻模型需要额外的corner或者model section支持,也可能因为你没有在device property里给电阻设segments或series参数。打开电阻的property,看看r值是否是从PDK自动算出来的。如果显示0,手动填一个合理的方块电阻值或者检查电阻类型是不是rppolywo_rf这类的。不过这是另一个主题,这里点到为止,出问题记得先去PDK文档里查电阻model name。
7.4 瞬态仿真不收敛与PWL波形导入
虽然gm-id是DC分析,但后续验证需要瞬态。如果你在瞬态仿真中遇到不收敛,常见原因之一是输入信号边沿过陡,或者是电容初始值没设好。TSMC65nm库里的管子速度很快,如果信号源上升时间设成0.1ps,很容易让瞬态仿真发散。解决办法:给输入信号设置至少1ns的上升沿,或者在瞬态选项里开启cmin给节点加一点电容。另外如果你需要导入PWL波形文件(比如从DAC输出抓到的实际信号),菜单路径是:
Setup -> Stimuli -> File选PWL文件并设为对应的激励源类型。如果导入后波形出现异常,多半是文件里的时间序列和电压序列格式不对(中间有注释行、多列数据),用文本编辑器清理成time value两列标准格式再导入。
8. 从gm-id到完整设计的进阶扩展:一个实操案例
讲了这么多设置和避坑,最后用一个具体的小案例把这些内容串联一遍。假设我要设计一个65nm下用于低功耗比较器的输入差分对,指标是总电流25uA,要求输入对管的gm/Id在12左右,并且希望速度尽量快,该如何选尺寸?
8.1 确定L
先取一组常见的L值(80n、120n、200n),在Vds=1.0V下扫gm-id曲线。假设从L=120n的曲线上看,当gm/Id=12时,对应的电流密度是约30uA per (W/L)。现在我们每个管子分配12.5uA(差分对总电流25uA,每边一半),所以:
[ \frac{W}{L} = \frac{I_D}{J_{gm/id=12}} = \frac{12.5u}{30u} = 0.417 ]
取整到 ( W=50n, L=120n )。但这步比较激进,因为W/L小于1,版图匹配性会变差。通常取 ( W/L \ge 1 ) 更合适,所以我们下调gm/Id目标到10,再查表,假设得到电流密度为40u,则:
[ W/L = 12.5u / 40u = 0.3125 ]
反而更小,这说明在弱反型区电流上去了但效率在降。看来在低电流下想同时保持高速和效率不容易,我们得要么接受更小的W、增加一些面积,要么提高电流预算。这个“来回查表、评估取舍”的过程就是gm-id方法的价值:它逼着你在设计早期就明确知道电流-速度-增益三者之间的数值关系,而不是靠手感。
我用同样的流程做过一个高速运放的第一级,最后是:总电流50uA,每边25uA,L=150n,gm/Id=10,这样既保证了足够的GBW,又控制了输入管的面积。整个调整过程只花了大约半天,而以前用Vov迭代法折腾了至少两天。
8.2 验证选型
选定尺寸后,打开原理图,把W改成50n,L改成150n,重新跑一次DC。如果仿真得到的gm/Id在9.5~10.5之间,那就算达标。如果不达标,扫描一下Vgs看看你实际偏置点落在了哪个区域。很多新手做完gm-id曲线后不回头验证,结果用错了偏置。记住:gm-id曲线是“查到了什么,设计就用什么”的强一致流程,选完尺寸后务必再仿真一次DC,确认工作点符合目标。
8.3 全corner复核
确定tt下的尺寸后,切到ss、ff两个corner再跑一遍DC,重点看gm/Id是否还在合理范围内。比如ss下,因为阈值高、电流小,为了保持总电流25uA,你可能需要把Vgs往上抬一点,或者接受gm/Id稍微偏大。如果在ss corner下gm/Id变成了15,而ff corner下变成了8,说明这个设计在工作点附近对工艺特别敏感,后续要加偏置电路来稳定电流,否则直接流片会翻车。
9. 给新手的三个实用建议
到此,gm-id曲线的仿真、查表和设计扩展就完整地跑通了一遍。最后分享三个我的个人经验,希望能帮你少走弯路。
第一,曲线不是为了画而画。如果你跑完曲线只是存个图,然后继续用老办法设计,等于白干。真正有效的做法是把曲线导出成查找表,或者写一个小的计算脚本,让以后每次设计新电路时都能快速调用这些数据。我一般会把CSV文件按corner和温度组织好,项目里所有电路共享一套查找表,效率高很多。
第二,多跟ADS/HFSS等仿真工具的输入输出打交道。流片前你很可能还要在Virtuoso里做后仿、EMX或电磁仿真验证高频寄生。gm-id设计方法给出的尺寸和偏置,往往可以被这些工具直接调用,不会出现尺寸、工作点相互矛盾的情况。所以前期花点时间把gm-id曲线弄扎实,后面在信号完整性、电磁仿真环节会省很多力气。
第三,不要忽略版图预期的寄生效应。65nm工艺下,版图上的栅电阻、接触孔电阻、金属互连寄生对gm-id曲线的影响虽然在原理图仿真里看不见,但你在查表时最好给L和W留一点设计余量。尤其是射频或者高速数字接口电路,前仿和后仿的gm/Id可能差20%以上,这时你至少知道gm-id设计点到底靠近哪个工作区,做后仿调试时才不会一头雾水。
做模拟IC设计的人都知道,design skill往往是“练出来的”,而非“看出来的”。gm-id这个方法,你已经拿到了完整的Virtuoso操作路径和ADE设置细节,接下来要做的就是在自己的PDK上亲手跑一遍,再把不同工艺角的数据存成自己的专属库。这个过程可能一开始会踩到一些连文档里都没写全的小坑,但走出这一步之后,你再看65nm甚至更先进工艺的模拟电路设计,就不再觉得它是个黑盒了。