蒙特卡洛仿真(Monte Carlo)

蒙特卡洛仿真(Monte Carlo)

Monte Carlo分析是一种器件参数变化分析,使用随机抽样估计来估算数学函数的计算的方法。它需要一个良好的随机数源。这种方法往往包含一些误差,但是随着随机抽取样本数量的增加,结果也会越来越精确。

Monte Carlo 分析和工艺角分析的区别如图1:

图1 Monte Carlo 分析和工艺角分析的区别

矩形框中表示四个不同工艺角的覆盖范围,曲线表示用Monte Carlo分析得到的实际电路工艺偏差(一般满足高斯分布)。从图中可以看出,满足工艺角变化的范围不一定能完全满足覆盖实际工艺变化范围,因此要用Monte Carlo分析得到工艺角变化的概率,以得到电路的良率。

要想详细了解蒙特卡洛可以阅读下面的文章:

pan.baidu.com/s/1bwmSas

  • 蒙特卡洛仿真

我们要进行蒙特卡洛分析首先要明确工艺库是否支持,如果这个工艺库不支持蒙特卡洛仿真,那就要自己写相关的失配模型,而且就算工艺库支持蒙特卡洛仿真,我们也不能完全相信,尽量去仿真验证。这个模型很复杂,尽量找一个现有的模板来写,另外MOS管的 V_{th} 是失配的主要来源,而且有些工艺库对阈值电压的估计过于乐观,我们可以使用拉扎维的 \Delta V_{th}=\frac{0.1t_{ox}}{\sqrt{WL}}t_{ox} 是栅氧厚度,单位是埃,1埃=0.1nm)的阈值电压模型来估计失配,并且用来验证工艺库中失配文件正确性。

下图是对某工艺的蒙特卡洛仿真HSPICE文件,分别对1.8V器件和5V器件在不同的W和L下进行200次蒙特卡洛仿真。

*.Global psub!
*Vpsub   psub!    0    0

.LIB '~/corner.lib' tt_mis

.inc '/hspice/n.sp3'
.inc '~/sim/model/system.l'

.option
*+ ARTIST=2
*+ INGOLD=2
*+ MEASOUT=1
*+ PARHIRE=LOCAL
*+ PSF=2
+ post
*+ runlvl=3
+ accurate=1
*+ method=gear
*+ probe=1
+ captab=1
+ NUMDGT=10
+ INGOLD=2
+ MEASDGT=10
*+ MEASFORM=3
*+ delmax=1n
+ fftout
*+ Seed=1
*Option Seed=x | random
*Where x is a positive integer from 1to 259200. Setting Random allows
*HSPICE to select an integer from the range. 

xnm0 dn0 dn0 0 0 v18 0 xnchdh_tn w=8u l=0.5u m=1 mcmode=1 mult=1 nf=1
xnm1 dn1 dn1 0 0 v18 0 xnchdh_tn w=8u l=0.5u m=1 mcmode=1 mult=1 nf=1
xnm2 dn2 dn2 0 0 v18 0 xnchdh_tn w=8u l=0.5u m=1 mcmode=1 mult=1 nf=4
xnm3 dn3 dn3 0 0 v18 0 xnchdh_tn w=2u l=0.5u m=4 mcmode=1 mult=4 nf=1
xnm4 dn4 dn4 0 0 v18 0 xnchdh_tn w=32u l=0.5u m=1 mcmode=1 mult=1 nf=4
xnm5 dn5 dn5 0 0 v18 0 xnchdh_tn w=8u l=0.5u m=4 mcmode=1 mult=4 nf=1
xpm0 dp0 dp0 v18 v18 0 v18 0 xpchdh_tn w=8u l=0.5u m=1 mcmode=1 mult=1 nf=1
xpm1 dp1 dp1 v18 v18 0 v18 0 xpchdh_tn w=8u l=0.5u m=1 mcmode=1 mult=1 nf=1
xpm2 dp2 dp2 v18 v18 0 v18 0 xpchdh_tn w=8u l=0.5u m=1 mcmode=1 mult=1 nf=4
xpm3 dp3 dp3 v18 v18 0 v18 0 xpchdh_tn w=2u l=0.5u m=4 mcmode=1 mult=4 nf=1
xpm4 dp4 dp4 v18 v18 0 v18 0 xpchdh_tn w=32u l=0.5u m=1 mcmode=1 mult=1 nf=4
xpm5 dp5 dp5 v18 v18 0 v18 0 xpchdh_tn w=8u l=0.5u m=4 mcmode=1 mult=4 nf=1

x5vnm0 dn5v0 dn5v0 0 0 v5 0 xnchdh_tk50_ln w=4u l=1u m=1 mcmode=1 mult=1 nf=1
x5vnm1 dn5v1 dn5v1 0 0 v5 0 xnchdh_tk50_ln w=4u l=1u m=1 mcmode=1 mult=1 nf=1
x5vnm2 dn5v2 dn5v2 0 0 v5 0 xnchdh_tk50_ln w=4u l=1u m=1 mcmode=1 mult=1 nf=4
x5vnm3 dn5v3 dn5v3 0 0 v5 0 xnchdh_tk50_ln w=1u l=1u m=4 mcmode=1 mult=4 nf=1
x5vnm4 dn5v4 dn5v4 0 0 v5 0 xnchdh_tk50_ln w=16u l=1u m=1 mcmode=1 mult=1 nf=4
x5vnm5 dn5v5 dn5v5 0 0 v5 0 xnchdh_tk50_ln w=4u l=1u m=4 mcmode=1 mult=4 nf=1
x5vpm0 dp5v0 dp5v0 v5 v5 0 v5 0 xpchdh_tk50_ln w=4u l=1u m=1 mcmode=1 mult=1 nf=1
x5vpm1 dp5v1 dp5v1 v5 v5 0 v5 0 xpchdh_tk50_ln w=4u l=1u m=1 mcmode=1 mult=1 nf=1
x5vpm2 dp5v2 dp5v2 v5 v5 0 v5 0 xpchdh_tk50_ln w=4u l=1u m=1 mcmode=1 mult=1 nf=4
x5vpm3 dp5v3 dp5v3 v5 v5 0 v5 0 xpchdh_tk50_ln w=1u l=1u m=4 mcmode=1 mult=4 nf=1
x5vpm4 dp5v4 dp5v4 v5 v5 0 v5 0 xpchdh_tk50_ln w=16u l=1u m=1 mcmode=1 mult=1 nf=4
x5vpm5 dp5v5 dp5v5 v5 v5 0 v5 0 xpchdh_tk50_ln w=4u l=1u m=4 mcmode=1 mult=4 nf=1

In0 v18 dn0 dc 2uA
In1 v18 dn1 dc 2uA
In2 v18 dn2 dc 2uA
In3 v18 dn3 dc 2uA
In4 v18 dn4 dc 2uA
In5 v18 dn5 dc 2uA

Ip0 dp0 0 dc 2uA
Ip1 dp1 0 dc 2uA
Ip2 dp2 0 dc 2uA
Ip3 dp3 0 dc 2uA
Ip4 dp4 0 dc 2uA
Ip5 dp5 0 dc 2uA

In5v0 v5 dn5v0 dc 2uA
In5v1 v5 dn5v1 dc 2uA
In5v2 v5 dn5v2 dc 2uA
In5v3 v5 dn5v3 dc 2uA
In5v4 v5 dn5v4 dc 2uA
In5v5 v5 dn5v5 dc 2uA

Ip5v0 dp5v0 0 dc 2uA
Ip5v1 dp5v1 0 dc 2uA
Ip5v2 dp5v2 0 dc 2uA
Ip5v3 dp5v3 0 dc 2uA
Ip5v4 dp5v4 0 dc 2uA
Ip5v5 dp5v5 0 dc 2uA

vv18 v18 dc 1.8v
vv5 v5 dc 5v

.dc sv 1.7 1.9 0.1 sweep monte=200

.meas DC n0 FIND lv9(xnm0.mn) AT=1.8
.meas DC n1 FIND lv9(xnm1.mn) AT=1.8
.meas DC n2 FIND lv9(xnm2.mn) AT=1.8
.meas DC n3 FIND lv9(xnm3.mn) AT=1.8
.meas DC n4 FIND lv9(xnm4.mn) AT=1.8
.meas DC n5 FIND lv9(xnm5.mn) AT=1.8

.meas DC p0 FIND lv9(xpm0.mp) AT=1.8
.meas DC p1 FIND lv9(xpm1.mp) AT=1.8
.meas DC p2 FIND lv9(xpm2.mp) AT=1.8
.meas DC p3 FIND lv9(xpm3.mp) AT=1.8
.meas DC p4 FIND lv9(xpm4.mp) AT=1.8
.meas DC p5 FIND lv9(xpm5.mp) AT=1.8

.meas DC n5v0 FIND lv9(x5vnm0.mn) AT=1.8
.meas DC n5v1 FIND lv9(x5vnm1.mn) AT=1.8
.meas DC n5v2 FIND lv9(x5vnm2.mn) AT=1.8
.meas DC n5v3 FIND lv9(x5vnm3.mn) AT=1.8
.meas DC n5v4 FIND lv9(x5vnm4.mn) AT=1.8
.meas DC n5v5 FIND lv9(x5vnm5.mn) AT=1.8

.meas DC p5v0 FIND lv9(x5vpm0.mp) AT=1.8
.meas DC p5v1 FIND lv9(x5vpm1.mp) AT=1.8
.meas DC p5v2 FIND lv9(x5vpm2.mp) AT=1.8
.meas DC p5v3 FIND lv9(x5vpm3.mp) AT=1.8
.meas DC p5v4 FIND lv9(x5vpm4.mp) AT=1.8
.meas DC p5v5 FIND lv9(x5vpm5.mp) AT=1.8

.end

1.8V NMOS器件的 V_{th} 蒙特卡洛仿真结果

1.8V PMOS器件的 V_{th} 蒙特卡洛仿真结果

5V NMOS器件的 V_{th} 蒙特卡洛仿真结果

5V PMOS器件的 V_{th} 蒙特卡洛仿真结果

编辑于 2019-06-05 09:10