首页 / 资讯中心 / 文章详情

PDK电阻模型从查表到SPICE仿真:方块电阻与温度电压系数避坑

PDK电阻模型从查表到SPICE仿真:方块电阻与温度电压系数避坑 ★ FEATURED ARTICLE
简介面向集成电路设计、版图与工艺工程师的TSMC MIM电容技术资料围绕MIM电容性能评估与设计规则参考展开适合模拟/RF电路设计及器件建模人员查阅。压缩包仅含1份PDF文件约2.2MB便于集中检索与离线阅读目前已有1853人学习下载具备一定参考热度。内容覆盖测量结果、Sheet Resistance Table、Film Parameters及RF电阻模型详细列出Rp、Rint、Rgrain等参数并给出P poly、N poly、P/N diff等film类型的阻值差异与温度、电压系数同时说明电阻计算公式及-40℃~125℃、-3.3~3.3V等有效范围。读者可据此理解MIM电容相关建模参数、核对设计规则并辅助电路仿真与版图评估。1. 一份标题写着 MIM 电容、正文却全是电阻模型的工艺附录翻 PDK 的时候最容易碰到这种情况文件名叫 MIM 电容介绍点进去第 30 页开始讲的却是 RF 电阻模型——方块电阻表、Rp/Rint/Rgrain 三参数、温度电压二阶系数、等效电路图一直写到第 34 页的接触电阻分解。这不是文档写错了而是工艺厂把无源器件电容、电阻、变容管塞进同一份附录里前面讲电容结构后面顺手把薄膜电阻的建模数据一起给了。对做模拟前端、偏置网络、匹配网络的人来说这份东西的价值恰恰在后半段它告诉你版图上画一个 10µm×1µm 的多晶硅电阻在 -40°C 到 125°C、-3.3V 到 3.3V 之间到底会漂多少。下面按“先读表、再写公式、最后落到仿真”的顺序把它拆一遍顺带说说我踩过的坑。2. 先读表再动手四种膜的方块电阻与 Rp/Rint/Rgrain 三参数这份附录给的不是一个“典型值”而是一整套带容差、带温度电压修正的模型参数。它把薄膜分成四类带硅化物的 P 多晶硅、带硅化物的 N 多晶硅、无硅化物的 N 扩散、无硅化物的 P 扩散另外单列了无硅化物多晶硅的 Rp/Rint/Rgrain 三项。读表之前先搞清楚这三项各自对应版图上哪一段物理结构否则后面套公式必然对不上号。2.1 三参数分别对应版图上的哪一段无硅化物多晶硅电阻的横截面是这样的两端是硅化物CoSi2做接触中间一段是多晶硅本体本体上面盖着 RPO电阻保护层挡住硅化防止整条都变成低阻。电流从左边硅化物进、穿过一小段界面、走过多晶硅本体、再穿过右边界面、从右边硅化物出。所以总电阻拆成四块Rp多晶硅本体贡献按方块电阻算随 L/W 变单位 Ω/sqRint硅化物与多晶硅之间的界面电阻物理上是电流从二维接触面挤进一维沟道时的扩散电阻量纲是 Ω·µm所以要做 1/(W-dW) 的归一化Rgrain晶粒边界散射带来的附加电阻跟宽度无关是个固定串联项单位 ΩRcon接触孔电阻文档写 Rcon Rc/ncnc 是接触孔个数默认 2。对应的等效式是 R 2·Rcon 2·Rend Rp而 Rend Rint/(W-dW) Rgrain。注意这里 Rint 和 Rgrain 被合并进了“端电阻”Rend再乘 2左右各一份。很多人在建模时直接把 Rint 当成一个固定电阻加进去忘了它要除以有效宽度结果窄器件误差能到 30% 以上——这是最典型的翻车点。带硅化物的多晶硅和扩散电阻就简单得多只有 Rp 一项R R0·[1VC1·dVVC2·dV²]·[1TC1·dTTC2·dT²]其中 R0 Rsh·(L-deltaL)/(W-deltaW)。这类电阻阻值低个位数 Ω/sq主要用在做小电阻、ESD 限流、电源走线上的寄生建模。2.2 表里的 ± 与 W 分档精度到底落在哪原始测量表给的容差不是装饰。P 多晶硅无硅化物是 311±65 Ω/sq算下来 ±21%N 是 292±66±23%。这个量级意味着你按典型值算出来的偏置电流在 worst case 下可能差两成。带硅化物的膜分了两档宽度膜类型有效宽度Rsh (Ω/sq)TC1TC2VC1VC2deltaW (µm)P poly 带硅化物W≥2.07.8±2.52.88e-35.01e-7-7.89e-46.19e-3-0.051P poly 带硅化物0.18≤W2.06.7±3.52.88e-35.01e-7-7.89e-46.19e-3-0.051N poly 带硅化物W≥2.07.4±2.02.92e-32.66e-71.35e-37.15e-3-0.065N poly 带硅化物0.18≤W2.05.7±4.22.92e-32.66e-71.35e-37.15e-3-0.065N diff 无硅化物—59±5.81.47e-38.32e-77.55e-41.97e-4—P diff 无硅化物—133±191.43e-37.82e-7-1.19e-3-1.80e-4—这张表里藏了两个必须注意的点。第一W 跨过 2.0µm 时 Rsh 会跳变7.8→6.7、7.4→5.7而且窄档的容差更大±3.5、±4.2原因是窄线条的侧壁耗尽和微负载效应更明显。第二带硅化物膜的 deltaW 是负值-0.051、-0.065无硅化物多晶硅的 deltaW 是正值0.06061、0.08333。符号方向相反抄错一位有效宽度就从“加宽”变成“收窄”5µm 宽的器件能差出 2%。无硅化物那组的独立参数表是这样参数P poly 无硅化物N poly 无硅化物单位Rp311±65292±66Ω/sqRint66.9814.84Ω·µmRgrain39.3937.22ΩdeltaL0.046960.07616µmdeltaW0.060610.08333µmP 的 Rint 是 N 的四倍多这不是笔误是硼在界面处的偏析行为跟磷不一样接触势垒更高。做对称负载的电流镜时如果一边用 P 一边用 N两边的端电阻差几十欧匹配会直接崩掉。2.3 把表落成一份可查询的参数文件抄表不如建表。我一般会把这几页做成一个 Python 字典字段名跟文档一一对应后面算 R0、生成网表都从这里取避免手抄出错。# res_params.py # 键名规则: 膜类型_是否带硅化物, 值全部照抄附录表格 RES { ppoly_sil_wide: dict(rsh7.8, tol2.5, tc12.88e-3, tc25.01e-7, vc1-7.89e-4, vc26.19e-3, dw-0.051, wmin2.0), ppoly_sil_narrow:dict(rsh6.7, tol3.5, tc12.88e-3, tc25.01e-7, vc1-7.89e-4, vc26.19e-3, dw-0.051, wmin0.18), nploy_sil_wide: dict(rsh7.4, tol2.0, tc12.92e-3, tc22.66e-7, vc11.35e-3, vc27.15e-3, dw-0.065, wmin2.0), nploy_sil_narrow:dict(rsh5.7, tol4.2, tc12.92e-3, tc22.66e-7, vc11.35e-3, vc27.15e-3, dw-0.065, wmin0.18), ndiff_nosil: dict(rsh59.0, tol5.8, tc11.47e-3, tc28.32e-7, vc17.55e-4, vc21.97e-4, dw0.0, wminNone), pdiff_nosil: dict(rsh133.0, tol19.0, tc11.43e-3, tc27.82e-7, vc1-1.19e-3, vc2-1.80e-4, dw0.0, wminNone), } # 无硅化物多晶硅的分布参数, 单独一张表 DIST { ppoly_nosil: dict(rp311.0, rint66.98, rgrain39.39, dl0.04696, dw0.06061), nploy_nosil: dict(rp292.0, rint14.84, rgrain37.22, dl0.07616, dw0.08333), } def pick(ftype, w): 按宽度自动选档, 这是最容易漏的一步 if ftype.endswith(_sil_wide) or ftype.endswith(_sil_narrow): base ftype.rsplit(_, 1)[0] return RES[base (_sil_wide if w 2.0 else _sil_narrow)] return RES[ftype]pick这个函数解决的是 W 跨档问题调用方只报膜类型和宽度取参数时自动判断落在哪一档。实际项目里我见过有人把 1.5µm 宽的电阻按 7.8 Ω/sq 算仿真出来的压降比实测小 14%回头查了两天才发现是没换档。参数名里的wmin字段留着是为了做 DRC 前的合法性检查宽度低于 0.18µm 就该报错而不是硬算。3. 把公式拆成可执行代码R0、delta 修正与二阶温度电压系数表格只是离散的锚点真正决定精度的是那几个公式怎么落地。文档给的两组公式形式不同带硅化物的器件是 R0 × 两个归一化修正因子无硅化物的器件是 2·Rcon 2·Rend Rp 的物理分解。分开写不要硬凑成一个函数。3.1 R0 Rsh·(L-deltaL)/(W-deltaW) 的实际偏差这个式子里 deltaL 和 deltaW 是光刻与刻蚀带来的有效尺寸偏移。L 是画出来的长度减去 deltaL 才是真正导电的长度W 是画出来的宽度减去 deltaW 才是真正导电的宽度。带硅化物那两档只给了 deltaW没给 deltaL——这意味着文档默认长方向的修正可以忽略或者已经折算进 Rsh 里了。那就老老实实按 deltaL0 处理。def r0_sil(ftype, L_um, W_um, T25.0, dV0.0): p pick(ftype, W_um) dl 0.0 # 表中未给带硅化物膜的 deltaL r0 p[rsh] * (L_um - dl) / (W_um - p[dw]) dT T - 25.0 # 基准是 25°C, 不是 0°C return r0 * (1 p[vc1]*dV p[vc2]*dV**2) \ * (1 p[tc1]*dT p[tc2]*dT**2) def r0_nosil(ftype, L_um, W_um, T25.0, dV0.0, nc2, rcNone): p DIST[ftype] weff W_um - p[dw] # 有效宽度, 正值修正 rend p[rint] / weff p[rgrain] rp p[rp] * (L_um - p[dl]) / weff rcon 0.0 if rc is None else rc / nc # Rc 绝对值文档未给 return 2*rcon 2*rend rp拿 P 带硅化物、L10µm、W1µm 试一下取窄档 Rsh6.7dw-0.051R0 6.7×10/(10.051) 63.75 Ω。如果误用宽档 7.8得到 74.2 Ω差 16%。再叠加 125°C 的温漂dT100温度因子 1 2.88e-3×100 5.01e-7×10000 1.293整体从 63.75 变成 82.4 Ω温度带来的正向漂移接近 30%。这个数字在做高精度偏置时必须留在预算里。电压项更有意思。同一器件加 3.3V1 (-7.89e-4×3.3) 6.19e-3×10.89 1.0648电阻反而变大 6.5%。原因是 VC2 是个正的大系数二次项在高偏压下压过了一次项。而 N 扩散的 VC2 只有 1.97e-4几乎不随电压变。这一条在低压差线性稳压的反馈分压里影响不大但在 RF 开关的偏置路上会直接影响插损。3.2 二阶系数的量级100°C 温漂到底几个百分点把六个膜的 TC1/TC2 摊开看TC1 都在 1.4e-3 到 2.9e-3 之间也就是每升温 1°C 电阻涨 0.14%~0.29%。二阶项 TC2 在 1e-7 到 8e-7 量级只有在 dT 超过 60°C 之后才开始有 0.1% 以上的贡献。所以在 25°C 到 85°C 的常规工业温区一阶近似够用要做车规或者 -40°C 冷启动二阶必须带上。def temp_sweep(ftype, L_um, W_um, ts(-40, 25, 85, 125)): for t in ts: r r0_nosil(ftype, L_um, W_um, Tt) if nosil in ftype \ else r0_sil(ftype, L_um, W_um, Tt) print(f{ftype:18s} T{t:4}°C R{r:9.3f} Ω)跑一遍temp_sweep(ppoly_nosil, 10, 1)会看到端电阻项 Rgrain 是固定值不随温度变只有 Rp 和 Rint 跟着 TC 走所以整体温度系数比理论值低一点。这一点在写网表时要注意不能把整个电阻乘一个温度因子得按项分别算。3.3 无硅化物电阻的分布模型与两处公式不一致文档第 34 页给了两个版本的等效式一处写 R 2·Rc 2·Rint 2·Rgrain Rp另一处写 R 2·Rcon 2·Rend Rp且 Rcon Rc/nc、Rend Rint/(W-dW) Rgrain。这两式不是等价写法前者把 Rint 和 Rgrain 当成固定电阻直接串联后者把它们并入端电阻并做了宽度归一化。正确的物理理解是后者。Rint 是 Ω·µm 量纲必须除以有效宽度才是欧姆Rgrain 是固定欧姆值跟宽度无关所以它加在 Rint/Weff 后面而不是前面。前一种写法只在 W 恰好等于某个归一化宽度的特殊情况下才对得上。我一般按 Rend 版本建模然后在注释里标一句“原文第 34 页两式并存取分布模型”。还有 Rc 的问题文档只给了 Rcon Rc/nc 和 nc 默认 2没给 Rc 的绝对值。长电阻L/W 10时 Rcon 占比不到 1%忽略无妨短粗电阻L/W 2时 Rcon 能占到 5% 以上这时候必须向工艺厂要 Rc或者干脆在版图上把接触孔数量加到 4 个以上再用 nc 折算。凭空猜一个 Rc 塞进模型是最隐蔽的误差来源。4. 从参数到仿真写一个能扫温度和偏压的电阻 subckt参数算对了不等于仿真对。网表里的电阻要么是固定值前仿要么是行为级表达式后仿/ corner 扫描写法不同踩的坑也不同。4.1 用 Python 生成 subckt 骨架手写几十个阻值的网表容易错位我一般用脚本生成。下面这段按参数表输出 SPICE 子电路带 L/W 参数化、带温度和端电压依赖。TPL .subckt {name} n1 n2 l10u w1u .param dT TEMP - 25 .param dV V(n1,n2) .param weff w - ({dw}) .param r0 {rsh}*(l-{dl})/weff R1 n1 n2 Rr0*(1{vc1}*dV{vc2}*dV*dV)*(1{tc1}*dT{tc2}*dT*dT) .ends {name} def gen_subckt(name, ftype, w_um): p pick(ftype, w_um) return TPL.format(namename, dwp[dw], rshp[rsh], dl0.0, vc1p[vc1], vc2p[vc2], tc1p[tc1], tc2p[tc2]) print(gen_subckt(rppoly_hr_1u, ppoly_sil_narrow, 1.0))生成的weff已经带了符号dw 是 -0.051w - (-0.051)就是w 0.051展开后网表里是加号。这样写的好处是符号只在一个地方出现改参数表就全改不会出现“这个文件加、那个文件减”的不一致。dV V(n1,n2)让电阻自己感知端电压corner 扫描时不用改网表。仿真器层面这种写法要求支持表达式电阻多数商用 SPICE 和 Spectre 都支持R...并且TEMP是内置变量。如果仿真器不认TEMP就退化成在脚本里对每个温度点生成一份固定值网表扫五个温度点也就五次循环。4.2 偏置边界-3.3~3.3V 与 0.5mA/um 的物理含义文档明确给了有效区间带硅化物的多晶硅 -3.3V 到 3.3VN 扩散 0 到 3.3VP 扩散 -3.3V 到 0V无硅化物多晶硅的偏置上限是 0.5mA/µm。这些不是随便写的扩散电阻的区间是单边的因为 N 在 P 衬底上形成一个反偏 PN 结加反向电压时只有结漏电加正向电压会导通模型立即失效无硅化物多晶硅用电流密度而不是电压因为它的阻值高几百 Ω/sq同样的电压下电流差异很大用电流密度约束更合理温度上限 125°C 对应的是模型提取时的测试范围超出后二阶多项式外推没有物理依据。实际仿真里我一般会在 subckt 外面套一层保护if(abs(dV) 3.3) ...但 SPICE 语法里这么写不通用所以更常见的做法是在测试台里加钳位二极管或者把扫描范围直接限定住。做 corner 时把电压扫到 ±4V 去看趋势可以但结论不能当真。4.3 结果校验三点抽查法模型跑通之后必须回算三个点跟手算对得上才算数25°C/0V、125°C/0V、25°C/3.3V。第一点验证 R0 和尺寸修正第二点验证温度系数第三点验证电压系数。三个点都对中间插值基本不会出问题。# 三点抽查: 与网表仿真结果逐点对比 for t, v in [(25, 0.0), (125, 0.0), (25, 3.3)]: calc r0_sil(ppoly_sil_narrow, 10, 1.0, Tt, dVv) print(fT{t}°C V{v}V - 手算 {calc:.3f} Ω)如果某一点偏差超过 2%先怀疑三件事单位L/W 是 µm 还是 m、符号deltaW 正负、基准温度25 还是 0。九成的对不上都是这三条之一。5. 避坑与排查五条把仿真做翻车的现场记录5.1 现象窄电阻仿出来比实测高 15%原因在 Rsh 没换档现象是 1.5µm 宽的多晶硅电阻仿真值稳定偏高换了几组 L 都一样。查下来是取参数时按 W≥2.0 那档拿了 7.8 Ω/sq而实际应该用 6.7。解决办法是把选档逻辑封进pick()函数调用方只传宽度不允许直接引用 Rsh 常量。改完之后偏差回到 1% 以内。这类错误最阴的地方是它只在小尺寸上显形大电阻上看不出来。5.2 现象宽器件电阻偏小原因在 deltaW 符号抄反某次换工艺我把 deltaW 从 0.06061 改成 0.051忘了带符号结果 5µm 宽的电阻仿真值比实测小 2%。原因是带硅化物膜的 deltaW 是负值减负数等于加有效宽度变大、电阻变小无硅化物膜是正值减正数等于收窄、电阻变大。两种膜的符号方向完全相反。解决方式是在参数表里保留原始符号公式统一写成W - dw绝不在填表阶段就先取绝对值。5.3 现象室温下电阻凭空多 7%原因在温度基准用错有一版网表用dT TEMP跑 25°C 时 dT25温度因子算成 12.88e-3×251.072电阻凭空高 7.2%。文档写得很清楚 dT T - TnominalTnominal 25°C。这个错误在 25°C 下最明显在 0°C 时反而碰巧接近正确所以做低温 corner 的人常常发现不了。解决办法是把dT TEMP - 25写死在 subckt 模板里任何人改不了。5.4 现象P 扩散加正偏压后仿真不收敛原因在越界外推现象是给 P 扩散电阻加 1V仿真报收敛失败或者算出负阻。查文档P 扩散的有效偏置区间是 -3.3V 到 0V加正压等于让衬底结正偏模型里的多项式已经没有意义。同理 N 扩散只能加 0 到 3.3V。解决办法是在测试台里用理想二极管把偏置钳在合法区间或者干脆分两段扫描中间断开。5.5 现象短粗电阻误差 20%原因在端电阻项漏了 1/W现象是 L1µm、W5µm 的电阻仿真值比实测低两成。原因有两个叠加一是端电阻 Rend 里的 Rint 项必须除以有效宽度宽器件这一项变小但 Rgrain 是固定的占比反而上升二是接触电阻 Rcon 没算进去短电阻里它能占 5% 以上。解决办法是按R 2·Rc/nc 2·(Rint/Weff Rgrain) Rp完整写Rc 向工艺厂确认nc 按版图实际孔数填别用默认的 2 蒙混。6. 进阶把这几页做成自己的器件卡片文档给的是通用参数落到具体项目还得再压一层。我的习惯是给每个用到的电阻建一张“器件卡片”把几何尺寸、选档结果、三个抽查点的值、以及允许的偏置范围写在一张表里和网表放在同一个目录。这样下次别人接手不用回头翻 PDF 第 30 页。卡片字段示例值来源器件名rppoly_hr_1u自定义膜类型/选档P poly 带硅化物窄档W1.0 2.0L / W10 / 1.0 µm版图R0 25°C63.75 ΩRsh·(L-dL)/(W-dW)R 125°C82.4 Ω温度因子 1.293R 3.3V67.9 Ω电压因子 1.065允许偏置±3.3V文档容差±52%窄档 ±3.5/6.7表格窄档的容差达到 ±52%这个数字第一次看到会吓一跳但它就是工艺给出的真实分布。做匹配对的时候不能只看典型值得把蒙特卡洛的 sigma 也带进去两个同尺寸电阻的失配大致按容差的 1/√2 估再叠加版图上的梯度方向才是能拿去流片的结论。最后一个技巧把温度扫描写成一行命令每次改完网表跑一遍把 -40/25/85/125 四个点的值打到日志里。# 批量扫四个温度点, 结果直接落到 csv for t in -40 25 85 125; do echo T$t spectre -f nutmeg -temp $t rload.scs 21 | grep -i r_top done sweep.csv不要小看这一行。我曾经因为改了一个 deltaW 的符号只跑了 25°C 单点觉得对上了就交了结果 125°C 下偏了 18%返工重做了整版偏置。从那以后我每次改电阻参数都强制把 -40°C 和 125°C 两个端点跑一遍哪怕只是改个注释。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站