ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Cadence与Matlab协同实现GM-ID曲线自动化提取与可视化流程

Cadence与Matlab协同实现GM-ID曲线自动化提取与可视化流程 1. 从 GM-ID 说起为什么这套流程值得单独拎出来讲做模拟/混合信号电路设计的朋友对 GM-ID 这套方法论应该不陌生。它的核心思想是把 MOS 管的直流特性从“过驱动电压”这个维度切换到“跨导效率”这个维度来看。说白了以前我们习惯用 Vov 来定偏置但先进工艺下 Vov 能压的空间越来越小而 gm/ID 这个无量纲比值直接关联了器件的弱反型、中等反型和强反型区域用它来选工作点功耗和增益的折中会直观得多。但问题来了GM-ID 曲线不是仿真器里点一下就能出来的。它需要你扫一遍器件的直流特性把 gm、ID、gds、cgs 这些参数全部提取出来再归一化处理最后画成曲线。整个过程如果纯手工操作一个工艺角跑下来少说半天要是再算上不同沟长、不同温度那基本就是体力活了。我这次要分享的就是怎么把这条链路打通从 Cadence 里把原始数据导出来用 Matlab 做后处理和可视化形成一套可复用的 GM-ID 设计流程。这套东西适合正在做模拟电路设计、需要快速评估工艺特性的朋友也适合刚接触 GM-ID 方法论、想自己动手跑一遍看看效果的人。不管你用的是 IC617 还是 IC23只要 Cadence 的 ADE 能出波形这套流程就能跑通。2. 整体设计思路为什么选 Cadence Matlab 这条链路2.1 方案选型的几个考量市面上做 GM-ID 的工具其实不少有专门的商用工具也有开源脚本。我选 Cadence Matlab 这条链路主要基于几个现实原因。第一Cadence 是大多数模拟设计团队的标准环境工艺库、模型文件、仿真器都是现成的不需要额外搭建。你不可能为了画一条 GM-ID 曲线去换一套设计流程那成本太高了。第二Matlab 在数据处理和可视化上的灵活性是无可替代的。Cadence 自带的波形工具看单条曲线还行但要做参数扫描、多曲线对比、拟合分析就力不从心了。Matlab 的矩阵运算和绘图能力正好补上这一环。第三这条链路是可脚本化的。Cadence 的 Ocean 脚本可以批量跑仿真Matlab 的脚本可以批量处理数据两者一结合整个流程就能自动化。今天跑一个 NMOS明天跑一个 PMOS后天换个工艺角改几个参数就行不用重复劳动。2.2 数据流的整体架构整个流程分三段仿真段、导出段、处理段。仿真段在 Cadence 里完成。核心是搭一个测试电路对目标器件做 DC 扫描同时用表达式把 gm、ID、gds 这些参数算出来。这里有个关键点gm 和 gds 不是仿真器直接输出的需要用导数函数从 I-V 曲线里算。Cadence 的 ADE 里可以用deriv()函数但要注意扫描步长和精度的问题。导出段是把仿真结果从 Cadence 的波形数据库里拿出来存成 Matlab 能读的格式。最稳妥的方式是导出 CSV虽然文件大一点但兼容性好不会出现二进制格式读不出来的情况。导出的时候要注意列名和单位不然后面处理起来容易乱。处理段在 Matlab 里完成。核心工作包括数据清洗、归一化、计算 gm/ID 和 fT、绘图。这里面的坑不少比如数据里可能有重复点、有 NaN、有量纲不一致的问题都需要处理。2.3 为什么不用直接截图或者手动记录有人可能觉得跑几条曲线手动记几个点画个图不就完了。我一开始也这么想但实际做下来发现根本不可行。首先GM-ID 曲线需要的数据点很多。一条完整的 gm/ID vs gm/gds 曲线少说几百个点手动记录不现实。其次不同沟长、不同温度、不同工艺角的数据要放在一起对比手动整理的工作量是指数级增长的。最后手动操作容易出错一个数据抄错整条曲线就废了而且很难排查。所以自动化这条链路是必须的。前期花点时间搭好流程后面就是改参数、跑脚本、看结果效率提升不是一点半点。3. Cadence 侧的核心操作从原理图到数据导出3.1 测试电路的搭建要点GM-ID 仿真的测试电路很简单但有几个细节要注意。器件本身要单独拿出来不要放在复杂的电路里。栅极加直流电压漏极加固定电压源极接地。对于 NMOS通常把 VDS 设在饱和区中间值比如 VDD/2对于 PMOSVDS 设负值。体端接正确的电位NMOS 接最低电位PMOS 接最高电位。扫描变量是 VGS。扫描范围要覆盖从关断到强反型的整个区域。对于 1.8V 工艺的 NMOSVGS 从 0 扫到 1.8V 就够了对于 0.9V 工艺扫到 0.9V。步长建议设小一点比如 1mV 或者 5mV这样 gm 的导数计算才准确。步长太大gm 曲线会有明显的台阶。沟长和宽度也要参数化。我一般把 L 和 W 设成变量方便后面批量扫描。W 通常固定L 取几个典型值比如最小沟长、2 倍最小沟长、4 倍最小沟长。这样能看出短沟道效应对 GM-ID 曲线的影响。3.2 用表达式提取 gm 和 gdsCadence 的 ADE 里可以直接写表达式。gm 的定义是 dID/dVGS在 ADE 里可以写成deriv(ID VGS)。但这里有个坑deriv()函数对扫描步长很敏感步长太大结果不准步长太小又会放大数值噪声。我的经验是扫描步长设在 1mV 到 5mV 之间比较合适。如果发现 gm 曲线毛刺很多可以先用smooth()函数做一次平滑再做导数。另外deriv()出来的单位是 A/V也就是 S后面在 Matlab 里要统一量纲。gds 的定义是 dID/dVDS但 GM-ID 方法里通常不需要单独扫 VDS。因为 gm/ID 和 gm/gds 这两个指标前者只跟 VGS 有关后者需要 gds。gds 可以从输出特性曲线里提取也可以近似用 Early 电压来估算。如果要做完整的 GM-ID 曲线建议单独跑一个 VDS 扫描把 gds 也算出来。还有一个参数是 cgs也就是栅源电容。这个在 AC 仿真里才能拿到DC 仿真出不来。如果要做 fT 曲线需要额外跑一个 AC 仿真提取 Y 参数再算 cgs。这一步稍微麻烦一点但也不是必须的看你的设计需求。3.3 批量仿真的 Ocean 脚本如果只跑一个器件手动点几下就行了。但要跑多个沟长、多个温度、多个工艺角就必须用脚本。Ocean 脚本的基本结构是这样的先打开仿真器设置模型库和温度然后循环遍历沟长和 VGS每次仿真后把结果存下来。关键是要把每次仿真的结果存成独立的文件文件名里带上沟长和温度的标识方便后面 Matlab 读取。脚本里要注意几点一是仿真器的收敛问题DC 扫描有时候会不收敛可以加一些收敛选项比如convergencemoderate二是结果文件的路径要统一管理不要散落在各个目录里三是脚本要能断点续跑万一中间挂了不用从头再来。我一般会把脚本分成两个部分一个主脚本负责循环和调度一个子脚本负责单次仿真和数据导出。这样结构清晰调试也方便。3.4 数据导出的格式选择Cadence 导出数据有几种格式CSV、PSF、MAT。PSF 是 Cadence 的私有格式Matlab 读起来麻烦MAT 是 Matlab 的格式但 Cadence 导出的 MAT 文件版本可能跟你的 Matlab 不兼容CSV 最通用虽然文件大一点但基本不会出问题。导出 CSV 的时候要注意列名和单位。我一般会把 VGS、ID、gm、gds 这几列都导出来列名用英文单位在列名里标清楚比如VGS_V、ID_A、gm_S、gds_S。这样在 Matlab 里读进来不用再猜单位。还有一个细节Cadence 导出的 CSV 有时候会有表头行有时候没有取决于你的导出设置。我建议统一加上表头这样 Matlab 用readtable读的时候能自动识别列名。4. Matlab 侧的数据处理与可视化4.1 数据清洗与预处理从 Cadence 导出的 CSV 读进 Matlab 之后第一件事是检查数据质量。常见的问题有几个一是重复点DC 扫描有时候会在某些点重复采样导致数据里有重复的 VGS 值二是 NaN仿真不收敛或者表达式计算出错的时候会出现三是量纲不一致比如 ID 是 A但 gm 是 mA/V需要统一。处理重复点的方法很简单用unique函数去重就行。但要注意去重的时候要保留对应的 ID 和 gm 值不能只去重 VGS。我一般用unique的stable选项保持原始顺序。NaN 的处理要小心。如果是仿真不收敛导致的 NaN直接删掉可能会丢失关键数据点。我的做法是先把 NaN 标记出来看看它们出现在什么位置。如果是在扫描范围的边缘删掉问题不大如果是在中间可能需要重新跑仿真。量纲统一是个体力活但必须做。我一般把所有的电流统一成 A所有的电压统一成 V所有的电容统一成 F。这样后面计算 gm/ID 的时候单位自然就是 1/V不用再换算。4.2 计算 gm/ID 和 gm/gds数据清洗完之后就可以算核心指标了。gm/ID 是最关键的指标它直接反映了器件的工作区域。gm/ID 的值越大说明器件越靠近弱反型区功耗越低但速度越慢gm/ID 越小说明器件越靠近强反型区速度越快但功耗越高。对于典型的 CMOS 工艺gm/ID 的范围大概在 5 到 25 之间。计算 gm/ID 很简单就是 gm 除以 ID。但要注意ID 在关断区域接近零这时候 gm/ID 会趋向无穷大需要把这部分数据剔除掉。我一般只保留 ID 大于某个阈值的点比如 1nA 或者 10nA。gm/gds 是另一个重要指标它反映了器件的本征增益。gm/gds 越大增益越高。计算的时候同样要注意 gds 在关断区域接近零的问题。还有一个指标是 fT也就是单位电流增益频率。fT 跟 gm 和 cgs 有关公式是 fT gm / (2picgs)。如果做了 AC 仿真可以把 cgs 提取出来算 fT 曲线。如果没有 AC 数据可以先用 gm/ID 和 gm/gds 这两个指标做设计。4.3 绘图与曲线拟合Matlab 的绘图能力很强但画 GM-ID 曲线有几个细节要注意。首先是坐标轴。GM-ID 曲线通常画成 gm/ID vs gm/gds 的形式横轴是 gm/gds纵轴是 gm/ID。有时候也会画成 gm/ID vs ID/(W/L) 的形式横轴是归一化电流纵轴是 gm/ID。两种画法各有用途前者看增益后者看功耗。其次是多条曲线的对比。不同沟长的曲线要放在同一张图里用不同的颜色和线型区分。Matlab 的plot函数支持一次画多条曲线但要注意图例的标注要清晰。曲线拟合是可选步骤。如果要做设计优化可以把 GM-ID 曲线拟合成解析表达式方便后面求解。常用的拟合方法有多项式拟合和样条插值。多项式拟合简单但精度有限样条插值精度高但可能过拟合。我一般先用样条插值看看趋势再用低阶多项式做近似。4.4 自动化脚本的组织Matlab 脚本的组织方式直接影响复用性。我一般把脚本分成几个模块数据读取模块、数据清洗模块、指标计算模块、绘图模块。数据读取模块负责从 CSV 文件里读数据支持批量读取多个文件。数据清洗模块负责去重、去 NaN、统一量纲。指标计算模块负责算 gm/ID、gm/gds、fT。绘图模块负责画曲线、加标注、存图。每个模块写成独立的函数主脚本负责调用。这样改起来方便比如想换一种清洗方法只改清洗模块就行不用动其他部分。还有一个技巧把常用的参数比如阈值、颜色、线型放在脚本开头用变量定义。这样后面调整的时候改一处就行不用满脚本找。5. 实操过程中踩过的坑与排查技巧5.1 Cadence 导出数据时的常见问题问题一导出的 CSV 文件里列名乱码。这个通常是因为 Cadence 的导出设置里编码格式不对。解决办法是在导出的时候选择 UTF-8 编码或者在 Matlab 读取的时候指定编码格式。问题二导出的数据点数量跟仿真设置不一致。比如设了 1000 个扫描点但导出来只有 500 个。这个通常是因为仿真器自动插值了或者有些点不收敛被跳过了。解决办法是在 ADE 里关掉自动插值强制输出所有扫描点。问题三gm 曲线毛刺很多。这个前面提过主要是扫描步长和数值噪声的问题。解决办法是减小步长或者在 Matlab 里做平滑处理。问题四不同工艺角的数据混在一起。这个是因为导出的时候没有区分文件名。解决办法是在 Ocean 脚本里把工艺角的名字加到文件名里比如nmos_tt.csv、nmos_ff.csv。5.2 Matlab 处理数据时的常见问题问题一readtable读进来的数据列名不对。这个通常是因为 CSV 文件的表头行格式不标准。解决办法是用readtable的HeaderLines选项指定表头行数或者用readmatrix直接读数值矩阵。问题二gm/ID 曲线在低电流区域跳变。这个是因为 ID 接近零的时候gm/ID 对 ID 的微小变化非常敏感。解决办法是设置一个 ID 阈值低于阈值的点不参与计算。问题三多条曲线的颜色区分度不够。这个是因为 Matlab 默认的颜色循环只有几种。解决办法是手动指定颜色用lines或者parula色图生成足够的颜色。问题四保存的图片分辨率不够。这个是因为默认的导出分辨率是 150dpi。解决办法是用print函数指定分辨率比如print(-dpng, -r300, filename.png)。5.3 常见问题速查表问题现象可能原因排查方法解决办法CSV 列名乱码编码格式不对用文本编辑器打开看导出时选 UTF-8数据点数量不对自动插值或跳过对比仿真设置关掉自动插值gm 曲线毛刺多步长太大或噪声看原始 ID 曲线减小步长或平滑gm/ID 低电流跳变ID 接近零看 ID 量级设 ID 阈值图片分辨率低默认 150dpi看图片属性用 print 指定 dpi多曲线颜色不够默认色循环少看曲线数量手动指定颜色6. 这套流程的扩展用法与个人体会6.1 扩展到其他器件类型这套流程不只适用于 MOS 管。BJT 的 GM-ID 分析、FinFET 的 GM-ID 分析思路是一样的只是提取的参数不同。BJT 关注的是 gm/IC 和 betaFinFET 关注的是 gm/ID 和 gm/gds 的短沟道效应。只要 Cadence 能仿真Matlab 能处理流程就能复用。6.2 结合优化算法做自动设计GM-ID 曲线出来之后可以结合优化算法做自动设计。比如给定 gm/ID 的目标值反推需要的 W/L 和偏置电流。Matlab 的优化工具箱里有现成的函数比如fmincon或者ga可以直接用。我试过用fmincon做一个简单的偏置优化目标是在满足 gm/ID 约束的前提下最小化功耗。效果还不错收敛速度也快。当然实际设计里还要考虑很多其他约束比如输出摆幅、噪声、匹配这些都可以加到优化目标里。6.3 数据管理的小技巧数据文件多了之后管理是个问题。我的做法是按工艺角建文件夹每个文件夹里放对应的 CSV 和 Matlab 脚本。文件名里带上器件类型、沟长、温度这些信息比如nmos_L180nm_T27C_tt.csv。这样找起来方便也不容易搞混。还有一个技巧把每次仿真的参数和结果记在一个日志文件里。比如用了什么模型库、什么温度、什么扫描范围都记下来。后面回头看的时候不用猜当时是怎么设置的。6.4 一些个人体会这套流程我用了大概两年最大的感受是前期投入的时间是值得的。一开始搭脚本、调格式、处理各种异常确实花了不少功夫。但一旦跑通后面就是改参数、跑脚本、看结果效率提升非常明显。另一个感受是数据质量比什么都重要。Cadence 导出的数据如果有问题后面 Matlab 处理得再漂亮也没用。所以导出的时候一定要仔细检查列名、单位、数据点数量都要确认无误。最后一点不要过度追求自动化。有些步骤手动做反而更快比如调整扫描范围、检查异常点。自动化适合重复性高的任务不适合需要判断的任务。找到平衡点效率最高。提示Cadence 的 Ocean 脚本在不同版本里语法可能有差异建议先在交互模式下测试几条命令确认没问题再写成脚本。注意Matlab 读取 CSV 的时候如果文件里有中文路径可能会出问题。建议把数据文件放在纯英文路径下。提示GM-ID 曲线的形状跟温度关系很大做设计的时候一定要看多个温度下的曲线不能只看常温。
返回列表