From 336bb3480b6d1cbb8ef6b77f14d3fd3783b0d2e3 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 22 Dec 2020 20:44:07 +0100 Subject: [PATCH] psp102 update to latest available version 102.5.0 --- examples/adms/psp/psp_out.sp | 451 +- examples/adms/psp/psp_tran.sp | 453 +- ...fs.include => Common102_macrodefs.include} | 25 +- .../adms/psp102/admsva/IP_ACKNOWLEDGMENT | 12 + .../admsva/IP_NOTICE_DISCLAIMER_LICENSE | 62 + .../psp102/admsva/JUNCAP200_InitModel.include | 340 +- .../psp102/admsva/JUNCAP200_macrodefs.include | 259 +- .../psp102/admsva/JUNCAP200_parlist.include | 203 +- .../psp102/admsva/JUNCAP200_varlist.include | 67 - .../psp102/admsva/JUNCAP200_varlist1.include | 102 + .../psp102/admsva/JUNCAP200_varlist2.include | 59 + .../psp102/admsva/PSP102_ChargesNQS.include | 309 ++ .../adms/psp102/admsva/PSP102_InitNQS.include | 197 + .../adms/psp102/admsva/PSP102_binning.include | 152 + .../adms/psp102/admsva/PSP102_binpars.include | 287 ++ .../psp102/admsva/PSP102_macrodefs.include | 80 +- .../adms/psp102/admsva/PSP102_module.include | 3700 ++++++++++------- .../admsva/PSP102_nqs_macrodefs.include | 121 + .../devices/adms/psp102/admsva/psp102.va | 29 +- .../devices/adms/psp102/admsva/psp102_nqs.va | 52 + .../devices/adms/psp102/admsva/psp102b.va | 50 + .../devices/adms/psp102/admsva/psp102b_nqs.va | 54 + .../devices/adms/psp102/admsva/psp102e.va | 50 + .../devices/adms/psp102/admsva/psp102e_nqs.va | 54 + .../devices/adms/psp102/admsva/readme.ngspice | 8 - .../devices/adms/psp102/admsva/readme.txt | 120 - .../adms/psp102/admsva/releasenotesPSP102.txt | 102 + 27 files changed, 5134 insertions(+), 2264 deletions(-) rename src/spicelib/devices/adms/psp102/admsva/{SIMKIT_macrodefs.include => Common102_macrodefs.include} (83%) create mode 100644 src/spicelib/devices/adms/psp102/admsva/IP_ACKNOWLEDGMENT create mode 100644 src/spicelib/devices/adms/psp102/admsva/IP_NOTICE_DISCLAIMER_LICENSE delete mode 100644 src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include create mode 100644 src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist1.include create mode 100644 src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist2.include create mode 100644 src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include create mode 100644 src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include create mode 100644 src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include create mode 100644 src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include create mode 100644 src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include create mode 100644 src/spicelib/devices/adms/psp102/admsva/psp102_nqs.va create mode 100644 src/spicelib/devices/adms/psp102/admsva/psp102b.va create mode 100644 src/spicelib/devices/adms/psp102/admsva/psp102b_nqs.va create mode 100644 src/spicelib/devices/adms/psp102/admsva/psp102e.va create mode 100644 src/spicelib/devices/adms/psp102/admsva/psp102e_nqs.va delete mode 100644 src/spicelib/devices/adms/psp102/admsva/readme.ngspice delete mode 100644 src/spicelib/devices/adms/psp102/admsva/readme.txt create mode 100644 src/spicelib/devices/adms/psp102/admsva/releasenotesPSP102.txt diff --git a/examples/adms/psp/psp_out.sp b/examples/adms/psp/psp_out.sp index 60a7147f9..1f175bb6a 100644 --- a/examples/adms/psp/psp_out.sp +++ b/examples/adms/psp/psp_out.sp @@ -1,4 +1,4 @@ -psp nch output +psp102 nch output * vd d 0 dc 0.1 vg g 0 dc 0.0 @@ -25,200 +25,259 @@ plot abs(i(vb)) ylog ylimit 1e-12 1e-03 .endc * .model nch nmos level=45 -+type=1.0e+00 -+tr=21.0e+00 -+swigate=0.0e+00 -+swimpact=1.0e+00 -+swgidl=0.0e+00 -+swjuncap=0.0e+00 -+lvaro=0.0e+00 -+lvarl=0.0e+00 -+lvarw=0.0e+00 -+lap=0.0e+00 -+wvaro=0.0e+00 -+wvarl=0.0e+00 -+wvarw=0.0e+00 -+wot=0.0e+00 -+vfbo=-1.0e+00 -+vfbl=0.0e+00 -+vfbw=0.0e+00 -+vfblw=0.0e+00 -+stvfbo=500.0e-06 -+stvfbl=0.0e+00 -+stvfbw=0.0e+00 -+stvfblw=0.0e+00 -+toxo=2.0e-09 -+nsubo=300.0e+21 -+nsubw=0.0e+00 -+wseg=10.0e-09 -+npck=1.0e+24 -+npckw=0.0e+00 -+wsegp=10.0e-09 -+lpck=10.0e-09 -+lpckw=0.0e+00 -+vnsubo=0.0e+00 -+nslpo=50.0e-03 -+dnsubo=0.0e+00 -+npo=100.0e+24 -+npl=0.0e+00 -+qmc=1.0e+00 -+cto=0.0e+00 -+ctl=0.0e+00 -+ctlexp=1.0e+00 -+ctw=0.0e+00 -+toxovo=2.0e-09 -+lov=0.0e+00 -+novo=50.0e+24 -+fol1=0.0e+00 -+fol2=0.0e+00 -+cfl=0.0e+00 -+cflexp=2.0e+00 -+cfw=0.0e+00 -+cfbo=0.0e+00 -+uo=50.0e-03 -+fbet1=0.0e+00 -+fbet1w=0.0e+00 -+lp1=10.0e-09 -+lp1w=0.0e+00 -+fbet2=0.0e+00 -+lp2=10.0e-09 -+betw1=0.0e+00 -+betw2=0.0e+00 -+wbet=1.0e-09 -+stbeto=1.0e+00 -+stbetl=0.0e+00 -+stbetw=0.0e+00 -+stbetlw=0.0e+00 -+mueo=500.0e-03 -+muew=0.0e+00 -+stmueo=0.0e+00 -+themuo=1.5e+00 -+stthemuo=1.5e+00 -+cso=0.0e+00 -+csw=0.0e+00 -+stcso=0.0e+00 -+xcoro=0.0e+00 -+xcorl=0.0e+00 -+xcorw=0.0e+00 -+xcorlw=0.0e+00 -+stxcoro=0.0e+00 -+rsw1=0.5e+03 -+rsw2=0.0e+00 -+strso=1.0e+00 -+rsbo=0.0e+00 -+rsgo=0.0e+00 -+thesato=0.0e+00 -+thesatl=50.0e-03 -+thesatlexp=1.0e+00 -+thesatw=0.0e+00 -+stthesato=1.0e+00 -+stthesatl=0.0e+00 -+stthesatw=0.0e+00 -+stthesatlw=0.0e+00 -+thesatbo=0.0e+00 -+thesatgo=0.0e+00 -+axo=18.0e+00 -+axl=400.0e-03 -+alpl=500.0e-06 -+alplexp=1.0e+00 -+alpw=0.0e+00 -+alp1l1=0.0e+00 -+alp1lexp=500.0e-03 -+alp1l2=0.0e+00 -+alp1w=0.0e+00 -+alp2l1=0.0e+00 -+alp2lexp=0.5e+00 -+alp2l2=0.0e+00 -+alp2w=0.0e+00 -+vpo=50.0e-03 -+a1o=1.0e+00 -+a1l=0.0e+00 -+a1w=0.0e+00 -+a2o=10.0e+00 -+sta2o=0.0e+00 -+a3o=1.0e+00 -+a3l=0.0e+00 -+a3w=0.0e+00 -+a4o=0.0e+00 -+a4w=0.0e+00 -+gcoo=0.0e+00 -+iginvlw=0.0e+00 -+igovw=0.0e+00 -+stigo=2.0e+00 -+gc2o=375.0e-03 -+gc3o=63.0e-03 -+chibo=3.1e+00 -+agidlw=0.0e+00 -+bgidlo=41.0e+00 -+stbgidlo=0.0e+00 -+cgidlo=0.0e+00 -+cgbovl=0.0e+00 -+cfrw=0.0e+00 -+nfalw=80.0e+21 -+nfblw=30.0e+06 -+nfclw=0.0e+00 -+saref=1.0e-06 -+sbref=1.0e-06 -+wlod=0.0e+00 -+kuo=0.0e+00 -+kvsat=0.0e+00 -+tkuo=0.0e+00 -+lkuo=0.0e+00 -+wkuo=0.0e+00 -+pkuo=0.0e+00 -+llodkuo=0.0e+00 -+wlodkuo=0.0e+00 -+kvtho=0.0e+00 -+lkvtho=0.0e+00 -+wkvtho=0.0e+00 -+pkvtho=0.0e+00 -+llodvth=0.0e+00 -+wlodvth=0.0e+00 -+stetao=0.0e+00 -+lodetao=1.0e+00 -+trj=21.0e+00 -+imax=1.0e+03 -+cjorbot=1.0e-03 -+cjorsti=1.0e-09 -+cjorgat=1.0e-09 -+vbirbot=1.0e+00 -+vbirsti=1.0e+00 -+vbirgat=1.0e+00 -+pbot=500.0e-03 -+psti=500.0e-03 -+pgat=500.0e-03 -+phigbot=1.16e+00 -+phigsti=1.16e+00 -+phiggat=1.16e+00 -+idsatrbot=1.0e-12 -+idsatrsti=1.0e-18 -+idsatrgat=1.0e-18 -+csrhbot=100.0e+00 -+csrhsti=100.0e-06 -+csrhgat=100.0e-06 -+xjunsti=100.0e-09 -+xjungat=100.0e-09 -+ctatbot=100.0e+00 -+ctatsti=100.0e-06 -+ctatgat=100.0e-06 -+mefftatbot=250.0e-03 -+mefftatsti=250.0e-03 -+mefftatgat=250.0e-03 -+cbbtbot=1.0e-12 -+cbbtsti=1.0e-18 -+cbbtgat=1.0e-18 -+fbbtrbot=1.0e+09 -+fbbtrsti=1.0e+09 -+fbbtrgat=1.0e+09 -+stfbbtbot=-1.0e-03 -+stfbbtsti=-1.0e-03 -+stfbbtgat=-1.0e-03 -+vbrbot=10.0e+00 -+vbrsti=10.0e+00 -+vbrgat=10.0e+00 -+pbrbot=4.0e+00 -+pbrsti=4.0e+00 -+pbrgat=4.0e+00 -+dta=0.0e+00 ++TR=27.0 ++swigate=0 ++swimpact=1 ++swgidl=0 ++swjuncap=1 ++DTA=0 ++QMC=1.0 ++LVARO=-10.0E-9 ++LVARL=0 ++LVARW=0 ++LAP=10.0E-9 ++WVARO=10.0E-9 ++WVARL=0 ++WVARW=0 ++WOT=0 ++DLQ=0 ++DWQ=0 ++VFBO=-1.1 ++VFBL=0 ++VFBW=0 ++VFBLW=0 ++STVFBO=5.0E-4 ++STVFBL=0 ++STVFBW=0 ++STVFBLW=0 ++TOXO=1.5E-9 ++EPSROXO=3.9 ++NSUBO=3.0E+23 ++NSUBW=0 ++WSEG=1.5E-10 ++NPCK=1.0E+24 ++NPCKW=0 ++WSEGP=0.9E-8 ++LPCK=5.5E-8 ++LPCKW=0 ++FOL1=2.0E-2 ++FOL2=5.0E-6 ++VNSUBO=0 ++NSLPO=0.05 ++DNSUBO=0 ++DPHIBO=0 ++DPHIBL=0 ++DPHIBLEXP=1.0 ++DPHIBW=0 ++DPHIBLW=0 ++NPO=1.5E+26 ++NPL=10.0E-18 ++CTO=5.0E-15 ++CTL=4.0E-2 ++CTLEXP=0.6 ++CTW=0 ++CTLW=0 ++TOXOVO=1.5E-9 ++TOXOVDO=2.0E-9 ++LOV=10.0E-9 ++LOVD=0 ++NOVO=7.5E+25 ++NOVDO=5.0e+25 ++CFL=3.0E-4 ++CFLEXP=2.0 ++CFW=5.0E-3 ++CFBO=0.3 ++UO=3.5E-2 ++FBET1=-0.3 ++FBET1W=0.15 ++LP1=1.5E-7 ++LP1W=-2.5E-2 ++FBET2=50.0 ++LP2=8.5E-10 ++BETW1=5.0E-2 ++BETW2=-2.0E-2 ++WBET=5.0E-10 ++STBETO=1.75 ++STBETL=-2.0E-2 ++STBETW=-2.0E-3 ++STBETLW=-3.0E-3 ++MUEO=0.6 ++MUEW=-1.2E-2 ++STMUEO=0.5 ++THEMUO=2.75 ++STTHEMUO=-0.1 ++CSO=1.0E-2 ++CSL=0 ++CSLEXP=1 ++CSW=0 ++CSLW=0 ++STCSO=-5.0 ++XCORO=0.15 ++XCORL=2.0E-3 ++XCORW=-3.0E-2 ++XCORLW=-3.5E-3 ++STXCORO=1.25 ++FETAO=1 ++RSW1=50 ++RSW2=5.0E-2 ++STRSO=-2.0 ++RSBO=0 ++RSGO=0 ++THESATO=1.0E-6 ++THESATL=0.6 ++THESATLEXP=0.75 ++THESATW=-1.0E-2 ++THESATLW=0 ++STTHESATO=1.5 ++STTHESATL=-2.5E-2 ++STTHESATW=-2.0E-2 ++STTHESATLW=-5.0E-3 ++THESATBO=0.15 ++THESATGO=0.75 ++AXO=20 ++AXL=0.2 ++ALPL=7.0E-3 ++ALPLEXP=0.6 ++ALPW=5.0E-2 ++ALP1L1=2.5E-2 ++ALP1LEXP=0.4 ++ALP1L2=0.1 ++ALP1W=8.5E-3 ++ALP2L1=0.5 ++ALP2LEXP=0 ++ALP2L2=0.5 ++ALP2W=-0.2 ++VPO=0.25 ++A1O=1.0 ++A1L=0 ++A1W=0 ++A2O=10.0 ++STA2O=-0.5 ++A3O=1.0 ++A3L=0 ++A3W=0 ++A4O=0 ++A4L=0 ++A4W=0 ++GCOO=5.0 ++IGINVLW=50.0 ++IGOVW=10.0 ++IGOVDW=0 ++STIGO=1.5 ++GC2O=1.0 ++GC3O=-1.0 ++CHIBO=3.1 ++AGIDLW=50.0 ++AGIDLDW=0 ++BGIDLO=35.0 ++BGIDLDO=41 ++STBGIDLO=-5.0E-4 ++STBGIDLDO=0 ++CGIDLO=0.15 ++CGIDLDO=0 ++CGBOVL=0 ++CFRW=5.0E-17 ++CFRDW=0 ++FNTO=1 ++NFALW=8.0E+22 ++NFBLW=3.0E7 ++NFCLW=0 ++RGO=0 ++RINT=0 ++RVPOLY=0 ++RSHG=0 ++DLSIL=0 ++RBULKO=0 ++RWELLO=0 ++RJUNDO=0 ++RJUNSO=0 ++TRJ=27.0 ++IMAX=1.0E3 ++VJUNREF=2.5 ++FJUNQ=0.03 ++CJORBOT=1.0E-3 ++CJORSTI=1.0E-9 ++CJORGAT=0.5E-9 ++VBIRBOT=0.75 ++VBIRSTI=1.0 ++VBIRGAT=0.75 ++PBOT=0.35 ++PSTI=0.35 ++PGAT=0.6 ++PHIGBOT=1.16 ++PHIGSTI=1.16 ++PHIGGAT=1.16 ++IDSATRBOT=5.0E-9 ++IDSATRSTI=1.0E-18 ++IDSATRGAT=1.0E-18 ++CSRHBOT=5.0E2 ++CSRHSTI=0 ++CSRHGAT=1.0E3 ++XJUNSTI=1.0E-8 ++XJUNGAT=1.0E-9 ++CTATBOT=5.0E2 ++CTATSTI=0 ++CTATGAT=1.0E3 ++MEFFTATBOT=0.25 ++MEFFTATSTI=0.25 ++MEFFTATGAT=0.25 ++CBBTBOT=1.0E-12 ++CBBTSTI=1.0E-18 ++CBBTGAT=1.0E-18 ++FBBTRBOT=1.0E9 ++FBBTRSTI=1.0E9 ++FBBTRGAT=1.0E9 ++STFBBTBOT=-1.0E-3 ++STFBBTSTI=-1.0E-3 ++STFBBTGAT=-1.0E-2 ++VBRBOT=10.0 ++VBRSTI=10.0 ++VBRGAT=10.0 ++PBRBOT=3 ++PBRSTI=4 ++PBRGAT=3 ++VJUNREFD=2.5 ++FJUNQD=0.03 ++CJORBOTD=1.0E-3 ++CJORSTID=1.0E-9 ++CJORGATD=1.0E-9 ++VBIRBOTD=1.0 ++VBIRSTID=1.0 ++VBIRGATD=1.0 ++PBOTD=0.5 ++PSTID=0.5 ++PGATD=0.5 ++PHIGBOTD=1.16 ++PHIGSTID=1.16 ++PHIGGATD=1.16 ++IDSATRBOTD=1.0E-12 ++IDSATRSTID=1.0E-18 ++IDSATRGATD=1.0E-18 ++CSRHBOTD=1.0E+2 ++CSRHSTID=1.0E-4 ++CSRHGATD=1.0E-4 ++XJUNSTID=1.0E-7 ++XJUNGATD=1.0E-7 ++CTATBOTD=1.0E+2 ++CTATSTID=1.0E-4 ++CTATGATD=1.0E-4 ++MEFFTATBOTD=0.25 ++MEFFTATSTID=0.25 ++MEFFTATGATD=0.25 ++CBBTBOTD=1.0E-12 ++CBBTSTID=1.0E-18 ++CBBTGATD=1.0E-18 ++FBBTRBOTD=1.0E9 ++FBBTRSTID=1.0E9 ++FBBTRGATD=1.0E9 ++STFBBTBOTD=-1.0E-3 ++STFBBTSTID=-1.0E-3 ++STFBBTGATD=-1.0E-3 ++VBRBOTD=10.0 ++VBRSTID=10.0 ++VBRGATD=10.0 ++PBRBOTD=4 ++PBRSTID=4 ++PBRGATD=4 .end diff --git a/examples/adms/psp/psp_tran.sp b/examples/adms/psp/psp_tran.sp index d11deef7b..8bc1c2dde 100644 --- a/examples/adms/psp/psp_tran.sp +++ b/examples/adms/psp/psp_tran.sp @@ -1,4 +1,4 @@ -psp nch transfer +psp102 nch transfer * vd d 0 dc 0.1 vg g 0 dc 0.0 @@ -19,207 +19,266 @@ m1 d g s b nch * .option temp=21 .control -dc vg 0 3.5 0.02 vb -3 0 0.5 +dc vg 0 2.5 0.02 vb -3 0 0.5 plot abs(i(vd)) dc vg 0 1.5 0.01 vb -3 0 0.5 plot abs(i(vd)) ylog ylimit 1e-12 1e-03 .endc * .model nch nmos level=45 -+type=1.0e+00 -+tr=21.0e+00 -+swigate=0.0e+00 -+swimpact=1.0e+00 -+swgidl=0.0e+00 -+swjuncap=0.0e+00 -+lvaro=0.0e+00 -+lvarl=0.0e+00 -+lvarw=0.0e+00 -+lap=0.0e+00 -+wvaro=0.0e+00 -+wvarl=0.0e+00 -+wvarw=0.0e+00 -+wot=0.0e+00 -+vfbo=-1.0e+00 -+vfbl=0.0e+00 -+vfbw=0.0e+00 -+vfblw=0.0e+00 -+stvfbo=500.0e-06 -+stvfbl=0.0e+00 -+stvfbw=0.0e+00 -+stvfblw=0.0e+00 -+toxo=2.0e-09 -+nsubo=300.0e+21 -+nsubw=0.0e+00 -+wseg=10.0e-09 -+npck=1.0e+24 -+npckw=0.0e+00 -+wsegp=10.0e-09 -+lpck=10.0e-09 -+lpckw=0.0e+00 -+vnsubo=0.0e+00 -+nslpo=50.0e-03 -+dnsubo=0.0e+00 -+npo=100.0e+24 -+npl=0.0e+00 -+qmc=1.0e+00 -+cto=0.0e+00 -+ctl=0.0e+00 -+ctlexp=1.0e+00 -+ctw=0.0e+00 -+toxovo=2.0e-09 -+lov=0.0e+00 -+novo=50.0e+24 -+fol1=0.0e+00 -+fol2=0.0e+00 -+cfl=0.0e+00 -+cflexp=2.0e+00 -+cfw=0.0e+00 -+cfbo=0.0e+00 -+uo=50.0e-03 -+fbet1=0.0e+00 -+fbet1w=0.0e+00 -+lp1=10.0e-09 -+lp1w=0.0e+00 -+fbet2=0.0e+00 -+lp2=10.0e-09 -+betw1=0.0e+00 -+betw2=0.0e+00 -+wbet=1.0e-09 -+stbeto=1.0e+00 -+stbetl=0.0e+00 -+stbetw=0.0e+00 -+stbetlw=0.0e+00 -+mueo=500.0e-03 -+muew=0.0e+00 -+stmueo=0.0e+00 -+themuo=1.5e+00 -+stthemuo=1.5e+00 -+cso=0.0e+00 -+csw=0.0e+00 -+stcso=0.0e+00 -+xcoro=0.0e+00 -+xcorl=0.0e+00 -+xcorw=0.0e+00 -+xcorlw=0.0e+00 -+stxcoro=0.0e+00 -+rsw1=2.5e+03 -+rsw2=0.0e+00 -+strso=1.0e+00 -+rsbo=0.0e+00 -+rsgo=0.0e+00 -+thesato=0.0e+00 -+thesatl=50.0e-03 -+thesatlexp=1.0e+00 -+thesatw=0.0e+00 -+stthesato=1.0e+00 -+stthesatl=0.0e+00 -+stthesatw=0.0e+00 -+stthesatlw=0.0e+00 -+thesatbo=0.0e+00 -+thesatgo=0.0e+00 -+axo=18.0e+00 -+axl=400.0e-03 -+alpl=500.0e-06 -+alplexp=1.0e+00 -+alpw=0.0e+00 -+alp1l1=0.0e+00 -+alp1lexp=500.0e-03 -+alp1l2=0.0e+00 -+alp1w=0.0e+00 -+alp2l1=0.0e+00 -+alp2lexp=0.5e+00 -+alp2l2=0.0e+00 -+alp2w=0.0e+00 -+vpo=50.0e-03 -+a1o=1.0e+00 -+a1l=0.0e+00 -+a1w=0.0e+00 -+a2o=10.0e+00 -+sta2o=0.0e+00 -+a3o=1.0e+00 -+a3l=0.0e+00 -+a3w=0.0e+00 -+a4o=0.0e+00 -+a4w=0.0e+00 -+gcoo=0.0e+00 -+iginvlw=0.0e+00 -+igovw=0.0e+00 -+stigo=2.0e+00 -+gc2o=375.0e-03 -+gc3o=63.0e-03 -+chibo=3.1e+00 -+agidlw=0.0e+00 -+bgidlo=41.0e+00 -+stbgidlo=0.0e+00 -+cgidlo=0.0e+00 -+cgbovl=0.0e+00 -+cfrw=0.0e+00 -+nfalw=80.0e+21 -+nfblw=30.0e+06 -+nfclw=0.0e+00 -+saref=1.0e-06 -+sbref=1.0e-06 -+wlod=0.0e+00 -+kuo=0.0e+00 -+kvsat=0.0e+00 -+tkuo=0.0e+00 -+lkuo=0.0e+00 -+wkuo=0.0e+00 -+pkuo=0.0e+00 -+llodkuo=0.0e+00 -+wlodkuo=0.0e+00 -+kvtho=0.0e+00 -+lkvtho=0.0e+00 -+wkvtho=0.0e+00 -+pkvtho=0.0e+00 -+llodvth=0.0e+00 -+wlodvth=0.0e+00 -+stetao=0.0e+00 -+lodetao=1.0e+00 -+trj=21.0e+00 -+imax=1.0e+03 -+cjorbot=1.0e-03 -+cjorsti=1.0e-09 -+cjorgat=1.0e-09 -+vbirbot=1.0e+00 -+vbirsti=1.0e+00 -+vbirgat=1.0e+00 -+pbot=500.0e-03 -+psti=500.0e-03 -+pgat=500.0e-03 -+phigbot=1.16e+00 -+phigsti=1.16e+00 -+phiggat=1.16e+00 -+idsatrbot=1.0e-12 -+idsatrsti=1.0e-18 -+idsatrgat=1.0e-18 -+csrhbot=100.0e+00 -+csrhsti=100.0e-06 -+csrhgat=100.0e-06 -+xjunsti=100.0e-09 -+xjungat=100.0e-09 -+ctatbot=100.0e+00 -+ctatsti=100.0e-06 -+ctatgat=100.0e-06 -+mefftatbot=250.0e-03 -+mefftatsti=250.0e-03 -+mefftatgat=250.0e-03 -+cbbtbot=1.0e-12 -+cbbtsti=1.0e-18 -+cbbtgat=1.0e-18 -+fbbtrbot=1.0e+09 -+fbbtrsti=1.0e+09 -+fbbtrgat=1.0e+09 -+stfbbtbot=-1.0e-03 -+stfbbtsti=-1.0e-03 -+stfbbtgat=-1.0e-03 -+vbrbot=10.0e+00 -+vbrsti=10.0e+00 -+vbrgat=10.0e+00 -+pbrbot=4.0e+00 -+pbrsti=4.0e+00 -+pbrgat=4.0e+00 -+dta=0.0e+00 ++TR=27.0 ++swigate=0 ++swimpact=1 ++swgidl=0 ++swjuncap=1 ++DTA=0 ++QMC=1.0 ++LVARO=-10.0E-9 ++LVARL=0 ++LVARW=0 ++LAP=10.0E-9 ++WVARO=10.0E-9 ++WVARL=0 ++WVARW=0 ++WOT=0 ++DLQ=0 ++DWQ=0 ++VFBO=-1.1 ++VFBL=0 ++VFBW=0 ++VFBLW=0 ++STVFBO=5.0E-4 ++STVFBL=0 ++STVFBW=0 ++STVFBLW=0 ++TOXO=1.5E-9 ++EPSROXO=3.9 ++NSUBO=3.0E+23 ++NSUBW=0 ++WSEG=1.5E-10 ++NPCK=1.0E+24 ++NPCKW=0 ++WSEGP=0.9E-8 ++LPCK=5.5E-8 ++LPCKW=0 ++FOL1=2.0E-2 ++FOL2=5.0E-6 ++VNSUBO=0 ++NSLPO=0.05 ++DNSUBO=0 ++DPHIBO=0 ++DPHIBL=0 ++DPHIBLEXP=1.0 ++DPHIBW=0 ++DPHIBLW=0 ++NPO=1.5E+26 ++NPL=10.0E-18 ++CTO=5.0E-15 ++CTL=4.0E-2 ++CTLEXP=0.6 ++CTW=0 ++CTLW=0 ++TOXOVO=1.5E-9 ++TOXOVDO=2.0E-9 ++LOV=10.0E-9 ++LOVD=0 ++NOVO=7.5E+25 ++NOVDO=5.0e+25 ++CFL=3.0E-4 ++CFLEXP=2.0 ++CFW=5.0E-3 ++CFBO=0.3 ++UO=3.5E-2 ++FBET1=-0.3 ++FBET1W=0.15 ++LP1=1.5E-7 ++LP1W=-2.5E-2 ++FBET2=50.0 ++LP2=8.5E-10 ++BETW1=5.0E-2 ++BETW2=-2.0E-2 ++WBET=5.0E-10 ++STBETO=1.75 ++STBETL=-2.0E-2 ++STBETW=-2.0E-3 ++STBETLW=-3.0E-3 ++MUEO=0.6 ++MUEW=-1.2E-2 ++STMUEO=0.5 ++THEMUO=2.75 ++STTHEMUO=-0.1 ++CSO=1.0E-2 ++CSL=0 ++CSLEXP=1 ++CSW=0 ++CSLW=0 ++STCSO=-5.0 ++XCORO=0.15 ++XCORL=2.0E-3 ++XCORW=-3.0E-2 ++XCORLW=-3.5E-3 ++STXCORO=1.25 ++FETAO=1 ++RSW1=50 ++RSW2=5.0E-2 ++STRSO=-2.0 ++RSBO=0 ++RSGO=0 ++THESATO=1.0E-6 ++THESATL=0.6 ++THESATLEXP=0.75 ++THESATW=-1.0E-2 ++THESATLW=0 ++STTHESATO=1.5 ++STTHESATL=-2.5E-2 ++STTHESATW=-2.0E-2 ++STTHESATLW=-5.0E-3 ++THESATBO=0.15 ++THESATGO=0.75 ++AXO=20 ++AXL=0.2 ++ALPL=7.0E-3 ++ALPLEXP=0.6 ++ALPW=5.0E-2 ++ALP1L1=2.5E-2 ++ALP1LEXP=0.4 ++ALP1L2=0.1 ++ALP1W=8.5E-3 ++ALP2L1=0.5 ++ALP2LEXP=0 ++ALP2L2=0.5 ++ALP2W=-0.2 ++VPO=0.25 ++A1O=1.0 ++A1L=0 ++A1W=0 ++A2O=10.0 ++STA2O=-0.5 ++A3O=1.0 ++A3L=0 ++A3W=0 ++A4O=0 ++A4L=0 ++A4W=0 ++GCOO=5.0 ++IGINVLW=50.0 ++IGOVW=10.0 ++IGOVDW=0 ++STIGO=1.5 ++GC2O=1.0 ++GC3O=-1.0 ++CHIBO=3.1 ++AGIDLW=50.0 ++AGIDLDW=0 ++BGIDLO=35.0 ++BGIDLDO=41 ++STBGIDLO=-5.0E-4 ++STBGIDLDO=0 ++CGIDLO=0.15 ++CGIDLDO=0 ++CGBOVL=0 ++CFRW=5.0E-17 ++CFRDW=0 ++FNTO=1 ++NFALW=8.0E+22 ++NFBLW=3.0E7 ++NFCLW=0 ++RGO=0 ++RINT=0 ++RVPOLY=0 ++RSHG=0 ++DLSIL=0 ++RBULKO=0 ++RWELLO=0 ++RJUNDO=0 ++RJUNSO=0 ++TRJ=27.0 ++IMAX=1.0E3 ++VJUNREF=2.5 ++FJUNQ=0.03 ++CJORBOT=1.0E-3 ++CJORSTI=1.0E-9 ++CJORGAT=0.5E-9 ++VBIRBOT=0.75 ++VBIRSTI=1.0 ++VBIRGAT=0.75 ++PBOT=0.35 ++PSTI=0.35 ++PGAT=0.6 ++PHIGBOT=1.16 ++PHIGSTI=1.16 ++PHIGGAT=1.16 ++IDSATRBOT=5.0E-9 ++IDSATRSTI=1.0E-18 ++IDSATRGAT=1.0E-18 ++CSRHBOT=5.0E2 ++CSRHSTI=0 ++CSRHGAT=1.0E3 ++XJUNSTI=1.0E-8 ++XJUNGAT=1.0E-9 ++CTATBOT=5.0E2 ++CTATSTI=0 ++CTATGAT=1.0E3 ++MEFFTATBOT=0.25 ++MEFFTATSTI=0.25 ++MEFFTATGAT=0.25 ++CBBTBOT=1.0E-12 ++CBBTSTI=1.0E-18 ++CBBTGAT=1.0E-18 ++FBBTRBOT=1.0E9 ++FBBTRSTI=1.0E9 ++FBBTRGAT=1.0E9 ++STFBBTBOT=-1.0E-3 ++STFBBTSTI=-1.0E-3 ++STFBBTGAT=-1.0E-2 ++VBRBOT=10.0 ++VBRSTI=10.0 ++VBRGAT=10.0 ++PBRBOT=3 ++PBRSTI=4 ++PBRGAT=3 ++VJUNREFD=2.5 ++FJUNQD=0.03 ++CJORBOTD=1.0E-3 ++CJORSTID=1.0E-9 ++CJORGATD=1.0E-9 ++VBIRBOTD=1.0 ++VBIRSTID=1.0 ++VBIRGATD=1.0 ++PBOTD=0.5 ++PSTID=0.5 ++PGATD=0.5 ++PHIGBOTD=1.16 ++PHIGSTID=1.16 ++PHIGGATD=1.16 ++IDSATRBOTD=1.0E-12 ++IDSATRSTID=1.0E-18 ++IDSATRGATD=1.0E-18 ++CSRHBOTD=1.0E+2 ++CSRHSTID=1.0E-4 ++CSRHGATD=1.0E-4 ++XJUNSTID=1.0E-7 ++XJUNGATD=1.0E-7 ++CTATBOTD=1.0E+2 ++CTATSTID=1.0E-4 ++CTATGATD=1.0E-4 ++MEFFTATBOTD=0.25 ++MEFFTATSTID=0.25 ++MEFFTATGATD=0.25 ++CBBTBOTD=1.0E-12 ++CBBTSTID=1.0E-18 ++CBBTGATD=1.0E-18 ++FBBTRBOTD=1.0E9 ++FBBTRSTID=1.0E9 ++FBBTRGATD=1.0E9 ++STFBBTBOTD=-1.0E-3 ++STFBBTSTID=-1.0E-3 ++STFBBTGATD=-1.0E-3 ++VBRBOTD=10.0 ++VBRSTID=10.0 ++VBRGATD=10.0 ++PBRBOTD=4 ++PBRSTID=4 ++PBRGATD=4 .end diff --git a/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/Common102_macrodefs.include similarity index 83% rename from src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include rename to src/spicelib/devices/adms/psp102/admsva/Common102_macrodefs.include index d4475afe3..5159e9f34 100644 --- a/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include +++ b/src/spicelib/devices/adms/psp102/admsva/Common102_macrodefs.include @@ -1,18 +1,25 @@ //====================================================================================== //====================================================================================== -// Filename: SIMKIT_macrodefs.include +// Filename: Common102_macrodefs.include //====================================================================================== //====================================================================================== // -// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. // // -// Version: 102.1, April 2007 (Simkit 2.5) +// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 // //====================================================================================== //====================================================================================== // -// Further information can be found in the file readme.txt +// Further information can be found in the file releasenotesPSP102.txt // ////////////////////////////////////////////////////////////// @@ -36,15 +43,16 @@ // Note 2: In this va-code, the "from" keyword in the parameter // list is not used. Silent clipping is used instead. One could enable // the Verilog-A range checking by redefining the `from-macro below. -`define P(txt) `ifdef insideADMS - `define from(lower,upper) from[lower:upper] + `define P(txt) (*txt*) `define INITIAL_MODEL @(initial_model) `define INITIAL_INSTANCE @(initial_instance) + `define from(lower,upper) from [lower:upper] `else - `define from(lower,upper) + `define P(txt) `define INITIAL_MODEL `define INITIAL_INSTANCE + `define from(lower,upper) `endif // Some functions @@ -61,7 +69,8 @@ `define QELE 1.6021918E-19 `define HBAR 1.05457168E-34 `define MELE 9.1093826E-31 -`define EPSSI 1.045E-10 +`define EPSO 8.8541878176E-12 +`define EPSRSI 11.8 // Other constants `define oneThird 3.3333333333333333e-01 diff --git a/src/spicelib/devices/adms/psp102/admsva/IP_ACKNOWLEDGMENT b/src/spicelib/devices/adms/psp102/admsva/IP_ACKNOWLEDGMENT new file mode 100644 index 000000000..b6c9b96d6 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/IP_ACKNOWLEDGMENT @@ -0,0 +1,12 @@ +PSP Acknowledgement and Copyright Notice +======================================== + +Copyrights of PSP are with NXP Semiconductors, Delft University of +Technology (since 2012) and Arizona State University (until and +including 2011). + +Since 2012 until today PSP has been co-developed by NXP Semiconductors +and Delft University of Technology. Until and including 2011 PSP has +been co-developed by NXP Semiconductors and Arizona State University. + +See also: http://psp.ewi.tudelft.nl/page_Copyright_Disclaimer.php diff --git a/src/spicelib/devices/adms/psp102/admsva/IP_NOTICE_DISCLAIMER_LICENSE b/src/spicelib/devices/adms/psp102/admsva/IP_NOTICE_DISCLAIMER_LICENSE new file mode 100644 index 000000000..093caf280 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/IP_NOTICE_DISCLAIMER_LICENSE @@ -0,0 +1,62 @@ +INTELLECTUAL PROPERTY NOTICE, DISCLAIMER AND LICENSE + +The compact model software and documentation presented at this website +form a whole that will henceforth be denoted as the "Model". + +The Model presented at this website has been co-developed by NXP +Semiconductors and Arizona State University until and including 2011. +For this part of the Model, NXP Semiconductors claims undivided +ownership and copyrights. + +Since 2012 until today the Model has been co-developed by +NXP Semiconductors and Delft University of Technology and +for this part each claim undivided ownership and copyrights. + + +DISCLAIMER + +The owners are fully free to further develop, adapt and extend the +Model as they judge necessary or desirable. + +The Model is distributed as is, completely without any express or +implied warranty, or service support. The owners and their employees +are not liable in any way for the condition or performance of the +Model. The owners hereby disclaim all implied warranties. + + +LICENSE + + +NXP Semiconductors and Delft University of Technology hereby grant +users a perpetual, irrevocable, worldwide, non-exclusive, royalty-free +license with respect to Versions of the Model which have been released +through this website http://psp.ewi.tudelft.nl. + +NXP Semiconductors and Delft University of Technology grant the users +the right to modify, copy and redistribute the Model, both within the +user's organization and externally, subject to the following +restrictions. + + +RESTRICTIONS + +1. The users agree not to charge for the Model itself but may +charge for additions, extensions, or support. + +2. In any product based on the Model, the users agree to acknowledge +the owners as developers of the Model. This acknowledgment shall +appear in the product documentation. + +3. The users agree to only use the name of CMC standard models to +identify implementations of the CMC standard models which produce the +same outputs as Standard code for the same inputs passing all CMC QA +tests. + +4. The users agree to obey all government restrictions governing +redistribution or export of the software. + +5. The users agree to reproduce any copyright notice which appears on +the software and documentation on any copy or modification of such +made available to others. + + diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include index 4a3c219b4..af095a22b 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include @@ -4,58 +4,179 @@ //====================================================================================== //====================================================================================== // -// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. // // -// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5) +// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 // //====================================================================================== //====================================================================================== // -// Further information can be found in the file readme.txt +// Further information can be found in the file releasenotesPSP102.txt // ////////////////////////////////////////////////////////////// // -// Calculation of internal paramters which are independent +// Calculation of internal parameters which are independent // on instance parameters // ////////////////////////////////////////////////////////////// -TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow); -IMAX_i = `CLIP_LOW( IMAX , `IMAX_cliplow); -CJORBOT_i = `CLIP_LOW( CJORBOT , `CJORBOT_cliplow); -CJORSTI_i = `CLIP_LOW( CJORSTI , `CJORSTI_cliplow); -CJORGAT_i = `CLIP_LOW( CJORGAT , `CJORGAT_cliplow); -VBIRBOT_i = `CLIP_LOW( VBIRBOT , `VBIR_cliplow); -VBIRSTI_i = `CLIP_LOW( VBIRSTI , `VBIR_cliplow); -VBIRGAT_i = `CLIP_LOW( VBIRGAT , `VBIR_cliplow); -PBOT_i = `CLIP_BOTH(PBOT , `P_cliplow,`P_cliphigh); -PSTI_i = `CLIP_BOTH(PSTI , `P_cliplow,`P_cliphigh); -PGAT_i = `CLIP_BOTH(PGAT , `P_cliplow,`P_cliphigh); -IDSATRBOT_i = `CLIP_LOW( IDSATRBOT , `IDSATR_cliplow); -IDSATRSTI_i = `CLIP_LOW( IDSATRSTI , `IDSATR_cliplow); -IDSATRGAT_i = `CLIP_LOW( IDSATRGAT , `IDSATR_cliplow); -CSRHBOT_i = `CLIP_LOW( CSRHBOT , `CSRH_cliplow); -CSRHSTI_i = `CLIP_LOW( CSRHSTI , `CSRH_cliplow); -CSRHGAT_i = `CLIP_LOW( CSRHGAT , `CSRH_cliplow); -XJUNSTI_i = `CLIP_LOW( XJUNSTI , `XJUN_cliplow); -XJUNGAT_i = `CLIP_LOW( XJUNGAT , `XJUN_cliplow); -CTATBOT_i = `CLIP_LOW( CTATBOT , `CTAT_cliplow); -CTATSTI_i = `CLIP_LOW( CTATSTI , `CTAT_cliplow); -CTATGAT_i = `CLIP_LOW( CTATGAT , `CTAT_cliplow); -MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT, `MEFFTAT_cliplow); -MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI, `MEFFTAT_cliplow); -MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT, `MEFFTAT_cliplow); -CBBTBOT_i = `CLIP_LOW( CBBTBOT , `CBBT_cliplow); -CBBTSTI_i = `CLIP_LOW( CBBTSTI , `CBBT_cliplow); -CBBTGAT_i = `CLIP_LOW( CBBTGAT , `CBBT_cliplow); -VBRBOT_i = `CLIP_LOW( VBRBOT , `VBR_cliplow); -VBRSTI_i = `CLIP_LOW( VBRSTI , `VBR_cliplow); -VBRGAT_i = `CLIP_LOW( VBRGAT , `VBR_cliplow); -PBRBOT_i = `CLIP_LOW( PBRBOT , `PBR_cliplow); -PBRSTI_i = `CLIP_LOW( PBRSTI , `PBR_cliplow); -PBRGAT_i = `CLIP_LOW( PBRGAT , `PBR_cliplow); +TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow); +IMAX_i = `CLIP_LOW( IMAX , `IMAX_cliplow); + +CJORBOT_i = `CLIP_LOW( CJORBOT , `CJORBOT_cliplow); +CJORSTI_i = `CLIP_LOW( CJORSTI , `CJORSTI_cliplow); +CJORGAT_i = `CLIP_LOW( CJORGAT , `CJORGAT_cliplow); +VBIRBOT_i = `CLIP_LOW( VBIRBOT , `VBIR_cliplow); +VBIRSTI_i = `CLIP_LOW( VBIRSTI , `VBIR_cliplow); +VBIRGAT_i = `CLIP_LOW( VBIRGAT , `VBIR_cliplow); +PBOT_i = `CLIP_BOTH(PBOT , `P_cliplow,`P_cliphigh); +PSTI_i = `CLIP_BOTH(PSTI , `P_cliplow,`P_cliphigh); +PGAT_i = `CLIP_BOTH(PGAT , `P_cliplow,`P_cliphigh); +PHIGBOT_i = PHIGBOT; +PHIGSTI_i = PHIGSTI; +PHIGGAT_i = PHIGGAT; +IDSATRBOT_i = `CLIP_LOW( IDSATRBOT , `IDSATR_cliplow); +IDSATRSTI_i = `CLIP_LOW( IDSATRSTI , `IDSATR_cliplow); +IDSATRGAT_i = `CLIP_LOW( IDSATRGAT , `IDSATR_cliplow); +CSRHBOT_i = `CLIP_LOW( CSRHBOT , `CSRH_cliplow); +CSRHSTI_i = `CLIP_LOW( CSRHSTI , `CSRH_cliplow); +CSRHGAT_i = `CLIP_LOW( CSRHGAT , `CSRH_cliplow); +XJUNSTI_i = `CLIP_LOW( XJUNSTI , `XJUN_cliplow); +XJUNGAT_i = `CLIP_LOW( XJUNGAT , `XJUN_cliplow); +CTATBOT_i = `CLIP_LOW( CTATBOT , `CTAT_cliplow); +CTATSTI_i = `CLIP_LOW( CTATSTI , `CTAT_cliplow); +CTATGAT_i = `CLIP_LOW( CTATGAT , `CTAT_cliplow); +MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT , `MEFFTAT_cliplow); +MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI , `MEFFTAT_cliplow); +MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT , `MEFFTAT_cliplow); +CBBTBOT_i = `CLIP_LOW( CBBTBOT , `CBBT_cliplow); +CBBTSTI_i = `CLIP_LOW( CBBTSTI , `CBBT_cliplow); +CBBTGAT_i = `CLIP_LOW( CBBTGAT , `CBBT_cliplow); +FBBTRBOT_i = FBBTRBOT; +FBBTRSTI_i = FBBTRSTI; +FBBTRGAT_i = FBBTRGAT; +STFBBTBOT_i = STFBBTBOT; +STFBBTSTI_i = STFBBTSTI; +STFBBTGAT_i = STFBBTGAT; +VBRBOT_i = `CLIP_LOW( VBRBOT , `VBR_cliplow); +VBRSTI_i = `CLIP_LOW( VBRSTI , `VBR_cliplow); +VBRGAT_i = `CLIP_LOW( VBRGAT , `VBR_cliplow); +PBRBOT_i = `CLIP_LOW( PBRBOT , `PBR_cliplow); +PBRSTI_i = `CLIP_LOW( PBRSTI , `PBR_cliplow); +PBRGAT_i = `CLIP_LOW( PBRGAT , `PBR_cliplow); + +SWJUNEXP_i = 0.0; +if (SWJUNEXP > 0.5) begin + SWJUNEXP_i = 1.0; +end else begin + SWJUNEXP_i = 0.0; +end + +VJUNREF_i = `CLIP_LOW( VJUNREF , `VJUNREF_cliplow); +FJUNQ_i = `CLIP_LOW( FJUNQ , `FJUNQ_cliplow); + +`ifdef JUNCAP_StandAlone + // do nothing +`else // JUNCAP_StandAlone + if (SWJUNASYM == 0.0) begin + CJORBOTD_i = CJORBOT_i; + CJORSTID_i = CJORSTI_i; + CJORGATD_i = CJORGAT_i; + VBIRBOTD_i = VBIRBOT_i; + VBIRSTID_i = VBIRSTI_i; + VBIRGATD_i = VBIRGAT_i; + PBOTD_i = PBOT_i; + PSTID_i = PSTI_i; + PGATD_i = PGAT_i; + PHIGBOTD_i = PHIGBOT_i; + PHIGSTID_i = PHIGSTI_i; + PHIGGATD_i = PHIGGAT_i; + IDSATRBOTD_i = IDSATRBOT_i; + IDSATRSTID_i = IDSATRSTI_i; + IDSATRGATD_i = IDSATRGAT_i; + CSRHBOTD_i = CSRHBOT_i; + CSRHSTID_i = CSRHSTI_i; + CSRHGATD_i = CSRHGAT_i; + XJUNSTID_i = XJUNSTI_i; + XJUNGATD_i = XJUNGAT_i; + CTATBOTD_i = CTATBOT_i; + CTATSTID_i = CTATSTI_i; + CTATGATD_i = CTATGAT_i; + MEFFTATBOTD_i = MEFFTATBOT_i; + MEFFTATSTID_i = MEFFTATSTI_i; + MEFFTATGATD_i = MEFFTATGAT_i; + CBBTBOTD_i = CBBTBOT_i; + CBBTSTID_i = CBBTSTI_i; + CBBTGATD_i = CBBTGAT_i; + FBBTRBOTD_i = FBBTRBOT_i; + FBBTRSTID_i = FBBTRSTI_i; + FBBTRGATD_i = FBBTRGAT_i; + STFBBTBOTD_i = STFBBTBOT_i; + STFBBTSTID_i = STFBBTSTI_i; + STFBBTGATD_i = STFBBTGAT_i; + VBRBOTD_i = VBRBOT_i; + VBRSTID_i = VBRSTI_i; + VBRGATD_i = VBRGAT_i; + PBRBOTD_i = PBRBOT_i; + PBRSTID_i = PBRSTI_i; + PBRGATD_i = PBRGAT_i; + VJUNREFD_i = VJUNREF_i; + FJUNQD_i = FJUNQ_i; + end else begin + CJORBOTD_i = `CLIP_LOW( CJORBOTD , `CJORBOT_cliplow); + CJORSTID_i = `CLIP_LOW( CJORSTID , `CJORSTI_cliplow); + CJORGATD_i = `CLIP_LOW( CJORGATD , `CJORGAT_cliplow); + VBIRBOTD_i = `CLIP_LOW( VBIRBOTD , `VBIR_cliplow); + VBIRSTID_i = `CLIP_LOW( VBIRSTID , `VBIR_cliplow); + VBIRGATD_i = `CLIP_LOW( VBIRGATD , `VBIR_cliplow); + PBOTD_i = `CLIP_BOTH(PBOTD , `P_cliplow,`P_cliphigh); + PSTID_i = `CLIP_BOTH(PSTID , `P_cliplow,`P_cliphigh); + PGATD_i = `CLIP_BOTH(PGATD , `P_cliplow,`P_cliphigh); + PHIGBOTD_i = PHIGBOTD; + PHIGSTID_i = PHIGSTID; + PHIGGATD_i = PHIGGATD; + IDSATRBOTD_i = `CLIP_LOW( IDSATRBOTD , `IDSATR_cliplow); + IDSATRSTID_i = `CLIP_LOW( IDSATRSTID , `IDSATR_cliplow); + IDSATRGATD_i = `CLIP_LOW( IDSATRGATD , `IDSATR_cliplow); + CSRHBOTD_i = `CLIP_LOW( CSRHBOTD , `CSRH_cliplow); + CSRHSTID_i = `CLIP_LOW( CSRHSTID , `CSRH_cliplow); + CSRHGATD_i = `CLIP_LOW( CSRHGATD , `CSRH_cliplow); + XJUNSTID_i = `CLIP_LOW( XJUNSTID , `XJUN_cliplow); + XJUNGATD_i = `CLIP_LOW( XJUNGATD , `XJUN_cliplow); + CTATBOTD_i = `CLIP_LOW( CTATBOTD , `CTAT_cliplow); + CTATSTID_i = `CLIP_LOW( CTATSTID , `CTAT_cliplow); + CTATGATD_i = `CLIP_LOW( CTATGATD , `CTAT_cliplow); + MEFFTATBOTD_i = `CLIP_LOW( MEFFTATBOTD, `MEFFTAT_cliplow); + MEFFTATSTID_i = `CLIP_LOW( MEFFTATSTID, `MEFFTAT_cliplow); + MEFFTATGATD_i = `CLIP_LOW( MEFFTATGATD, `MEFFTAT_cliplow); + CBBTBOTD_i = `CLIP_LOW( CBBTBOTD , `CBBT_cliplow); + CBBTSTID_i = `CLIP_LOW( CBBTSTID , `CBBT_cliplow); + CBBTGATD_i = `CLIP_LOW( CBBTGATD , `CBBT_cliplow); + FBBTRBOTD_i = FBBTRBOTD; + FBBTRSTID_i = FBBTRSTID; + FBBTRGATD_i = FBBTRGATD; + STFBBTBOTD_i = STFBBTBOTD; + STFBBTSTID_i = STFBBTSTID; + STFBBTGATD_i = STFBBTGATD; + VBRBOTD_i = `CLIP_LOW( VBRBOTD , `VBR_cliplow); + VBRSTID_i = `CLIP_LOW( VBRSTID , `VBR_cliplow); + VBRGATD_i = `CLIP_LOW( VBRGATD , `VBR_cliplow); + PBRBOTD_i = `CLIP_LOW( PBRBOTD , `PBR_cliplow); + PBRSTID_i = `CLIP_LOW( PBRSTID , `PBR_cliplow); + PBRGATD_i = `CLIP_LOW( PBRGATD , `PBR_cliplow); + VJUNREFD_i = `CLIP_LOW( VJUNREFD , `VJUNREF_cliplow); + FJUNQD_i = `CLIP_LOW( FJUNQD , `FJUNQ_cliplow); + end +`endif // JUNCAP_StandAlone tkr = `KELVINCONVERSION + TRJ_i; tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP); @@ -67,26 +188,26 @@ phitd = KBOL_over_QELE * tkd; phitdinv = 1.0 / phitd; // bandgap voltages at reference temperature -deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr); -phigrbot = PHIGBOT + deltaphigr; -phigrsti = PHIGSTI + deltaphigr; -phigrgat = PHIGGAT + deltaphigr; +deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr); +phigrbot = PHIGBOT_i + deltaphigr; +phigrsti = PHIGSTI_i + deltaphigr; +phigrgat = PHIGGAT_i + deltaphigr; // bandgap voltages at device temperature -deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd); -phigdbot = PHIGBOT + deltaphigd; -phigdsti = PHIGSTI + deltaphigd; -phigdgat = PHIGGAT + deltaphigd; +deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd); +phigdbot = PHIGBOT_i + deltaphigd; +phigdsti = PHIGSTI_i + deltaphigd; +phigdgat = PHIGGAT_i + deltaphigd; // factors ftd for ideal-current model -ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv))); -ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv))); -ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv))); +ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv))); +ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv))); +ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv))); // temperature-scaled saturation current for ideal-current model -idsatbot = IDSATRBOT_i * ftdbot * ftdbot; -idsatsti = IDSATRSTI_i * ftdsti * ftdsti; -idsatgat = IDSATRGAT_i * ftdgat * ftdgat; +idsatbot = IDSATRBOT_i * ftdbot * ftdbot; +idsatsti = IDSATRSTI_i * ftdsti * ftdsti; +idsatgat = IDSATRGAT_i * ftdgat * ftdgat; // built-in voltages before limiting ubibot = VBIRBOT_i * auxt - 2 * phitd * ln(ftdbot); @@ -129,9 +250,9 @@ qpref2sti = `a * cjosti; qpref2gat = `a * cjogat; // zero-bias depletion widths at reference temperature, needed in SRH and TAT model -wdepnulrbot = `EPSSI / CJORBOT_i; -wdepnulrsti = XJUNSTI_i * `EPSSI / CJORSTI_i; -wdepnulrgat = XJUNGAT_i * `EPSSI / CJORGAT_i; +wdepnulrbot = EPSSI / CJORBOT_i; +wdepnulrsti = XJUNSTI_i * EPSSI / CJORSTI_i; +wdepnulrgat = XJUNGAT_i * EPSSI / CJORGAT_i; // inverse values of "wdepnulr", used in BBT model wdepnulrinvbot = 1 / wdepnulrbot; @@ -145,7 +266,7 @@ VBIRGATinv = 1 / VBIRGAT_i; // some constants needed in erfc-approximation, needed in TAT model perfc = (`SQRTPI * `aerfc); -berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3); +berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3.0); cerfc = (1.0 - (`aerfc) - (berfc)); // half the bandgap energy, limited to values > phitd, needed in TAT model @@ -164,9 +285,12 @@ btatpartsti = sqrt(32 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti btatpartgat = sqrt(32 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3 * `HBAR); // temperature-scaled values of FBBT, needed in BBT model -fbbtbot = FBBTRBOT * (1 + STFBBTBOT * (tkd - tkr)); -fbbtsti = FBBTRSTI * (1 + STFBBTSTI * (tkd - tkr)); -fbbtgat = FBBTRGAT * (1 + STFBBTGAT * (tkd - tkr)); +fbbtbot = FBBTRBOT_i * (1 + STFBBTBOT_i * (tkd - tkr)); +fbbtsti = FBBTRSTI_i * (1 + STFBBTSTI_i * (tkd - tkr)); +fbbtgat = FBBTRGAT_i * (1 + STFBBTGAT_i * (tkd - tkr)); +fbbtbot = `CLIP_LOW(fbbtbot, 0); +fbbtsti = `CLIP_LOW(fbbtsti, 0); +fbbtgat = `CLIP_LOW(fbbtgat, 0); // values of fstop, needed in avalanche/breakdown model fstopbot = 1 / (1 - pow(`alphaav, PBRBOT_i)); @@ -178,7 +302,103 @@ VBRinvbot = 1 / VBRBOT_i; VBRinvsti = 1 / VBRSTI_i; VBRinvgat = 1 / VBRGAT_i; -// slopes for linear extraploation close to and beyond breakdown, needed in avalanche/breakdown model +// slopes for linear extrapolation close to and beyond breakdown, needed in avalanche/breakdown model slopebot = -(fstopbot * fstopbot * pow(`alphaav, (PBRBOT_i - 1))) * PBRBOT_i * VBRinvbot; slopesti = -(fstopsti * fstopsti * pow(`alphaav, (PBRSTI_i - 1))) * PBRSTI_i * VBRinvsti; slopegat = -(fstopgat * fstopgat * pow(`alphaav, (PBRGAT_i - 1))) * PBRGAT_i * VBRinvgat; + + +`ifdef JUNCAP_StandAlone + // do nothing +`else // JUNCAP_StandAlone + phigrbot_d = PHIGBOTD_i + deltaphigr; + phigrsti_d = PHIGSTID_i + deltaphigr; + phigrgat_d = PHIGGATD_i + deltaphigr; + + phigdbot_d = PHIGBOTD_i + deltaphigd; + phigdsti_d = PHIGSTID_i + deltaphigd; + phigdgat_d = PHIGGATD_i + deltaphigd; + + ftdbot_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot_d * phitrinv) - (phigdbot_d * phitdinv))); + ftdsti_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti_d * phitrinv) - (phigdsti_d * phitdinv))); + ftdgat_d = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat_d * phitrinv) - (phigdgat_d * phitdinv))); + + idsatbot_d = IDSATRBOTD_i * ftdbot_d * ftdbot_d; + idsatsti_d = IDSATRSTID_i * ftdsti_d * ftdsti_d; + idsatgat_d = IDSATRGATD_i * ftdgat_d * ftdgat_d; + + ubibot_d = VBIRBOTD_i * auxt - 2 * phitd * ln(ftdbot_d); + ubisti_d = VBIRSTID_i * auxt - 2 * phitd * ln(ftdsti_d); + ubigat_d = VBIRGATD_i * auxt - 2 * phitd * ln(ftdgat_d); + + vbibot_d = ubibot_d + phitd * ln(1 + exp((`vbilow - ubibot_d) * phitdinv)); + vbisti_d = ubisti_d + phitd * ln(1 + exp((`vbilow - ubisti_d) * phitdinv)); + vbigat_d = ubigat_d + phitd * ln(1 + exp((`vbilow - ubigat_d) * phitdinv)); + + vbiinvbot_d = 1.0 / vbibot_d; + vbiinvsti_d = 1.0 / vbisti_d; + vbiinvgat_d = 1.0 / vbigat_d; + + one_minus_PBOT_d = 1 - PBOTD_i; + one_minus_PSTI_d = 1 - PSTID_i; + one_minus_PGAT_d = 1 - PGATD_i; + + one_over_one_minus_PBOT_d = 1 / one_minus_PBOT_d; + one_over_one_minus_PSTI_d = 1 / one_minus_PSTI_d; + one_over_one_minus_PGAT_d = 1 / one_minus_PGAT_d; + + cjobot_d = CJORBOTD_i * pow((VBIRBOTD_i * vbiinvbot_d), PBOTD_i); + cjosti_d = CJORSTID_i * pow((VBIRSTID_i * vbiinvsti_d), PSTID_i); + cjogat_d = CJORGATD_i * pow((VBIRGATD_i * vbiinvgat_d), PGATD_i); + + qprefbot_d = cjobot_d * vbibot_d * one_over_one_minus_PBOT_d; + qprefsti_d = cjosti_d * vbisti_d * one_over_one_minus_PSTI_d; + qprefgat_d = cjogat_d * vbigat_d * one_over_one_minus_PGAT_d; + + qpref2bot_d = `a * cjobot_d; + qpref2sti_d = `a * cjosti_d; + qpref2gat_d = `a * cjogat_d; + + wdepnulrbot_d= EPSSI / CJORBOTD_i; + wdepnulrsti_d= XJUNSTID_i * EPSSI / CJORSTID_i; + wdepnulrgat_d= XJUNGATD_i * EPSSI / CJORGATD_i; + + wdepnulrinvbot_d = 1 / wdepnulrbot_d; + wdepnulrinvsti_d = 1 / wdepnulrsti_d; + wdepnulrinvgat_d = 1 / wdepnulrgat_d; + + VBIRBOTinv_d = 1 / VBIRBOTD_i; + VBIRSTIinv_d = 1 / VBIRSTID_i; + VBIRGATinv_d = 1 / VBIRGATD_i; + + deltaEbot_d = max(0.5 * phigdbot_d, phitd); + deltaEsti_d = max(0.5 * phigdsti_d, phitd); + deltaEgat_d = max(0.5 * phigdgat_d, phitd); + + atatbot_d = deltaEbot_d * phitdinv; + atatsti_d = deltaEsti_d * phitdinv; + atatgat_d = deltaEgat_d * phitdinv; + + btatpartbot_d= sqrt(32 * MEFFTATBOTD_i * `MELE * `QELE * (deltaEbot_d * deltaEbot_d * deltaEbot_d)) / (3 * `HBAR); + btatpartsti_d= sqrt(32 * MEFFTATSTID_i * `MELE * `QELE * (deltaEsti_d * deltaEsti_d * deltaEsti_d)) / (3 * `HBAR); + btatpartgat_d= sqrt(32 * MEFFTATGATD_i * `MELE * `QELE * (deltaEgat_d * deltaEgat_d * deltaEgat_d)) / (3 * `HBAR); + + fbbtbot_d = FBBTRBOTD_i * (1 + STFBBTBOTD_i * (tkd - tkr)); + fbbtsti_d = FBBTRSTID_i * (1 + STFBBTSTID_i * (tkd - tkr)); + fbbtgat_d = FBBTRGATD_i * (1 + STFBBTGATD_i * (tkd - tkr)); + fbbtbot_d = `CLIP_LOW(fbbtbot_d, 0); + fbbtsti_d = `CLIP_LOW(fbbtsti_d, 0); + fbbtgat_d = `CLIP_LOW(fbbtgat_d, 0); + + fstopbot_d = 1 / (1 - pow(`alphaav, PBRBOTD_i)); + fstopsti_d = 1 / (1 - pow(`alphaav, PBRSTID_i)); + fstopgat_d = 1 / (1 - pow(`alphaav, PBRGATD_i)); + + VBRinvbot_d = 1 / VBRBOTD_i; + VBRinvsti_d = 1 / VBRSTID_i; + VBRinvgat_d = 1 / VBRGATD_i; + + slopebot_d = -(fstopbot_d * fstopbot_d * pow(`alphaav, (PBRBOTD_i - 1))) * PBRBOTD_i * VBRinvbot_d; + slopesti_d = -(fstopsti_d * fstopsti_d * pow(`alphaav, (PBRSTID_i - 1))) * PBRSTID_i * VBRinvsti_d; + slopegat_d = -(fstopgat_d * fstopgat_d * pow(`alphaav, (PBRGATD_i - 1))) * PBRGATD_i * VBRinvgat_d; +`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include index c5afcd4a1..e26f0a821 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include @@ -4,15 +4,22 @@ //====================================================================================== //====================================================================================== // -// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. // // -// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5) +// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 // //====================================================================================== //====================================================================================== // -// Further information can be found in the file readme.txt +// Further information can be found in the file releasenotesPSP102.txt // /////////////////////////////////////////// @@ -34,7 +41,6 @@ `define aerfc 0.29214664 `define twothirds 0.666666666666667 - // Clipping values `define levelnumber 200 `define AB_cliplow 0 @@ -57,6 +63,8 @@ `define CBBT_cliplow 0 `define VBR_cliplow 0.1 `define PBR_cliplow 0.1 +`define VJUNREF_cliplow 0.5 +`define FJUNQ_cliplow 0.0 ///////////////////////////////////////////////////////////////////////////// @@ -70,9 +78,30 @@ // ///////////////////////////////////////////////////////////////////////////// +// Variable declarations of variables that need to be *local* in juncap-express initialization + +`define LocalGlobalVars \ + /* declaration of variables needed in macro "calcerfcexpmtat" */ \ + real ysq, terfc, erfcpos; \ + \ + /* declaration of variables needed in hypfunction 5 */ \ + real h1, h2, h2d, h3, h4, h5; \ + \ + /* declaration of variables calculated outside macro "juncapfunction", voltage-dependent part */ \ + real idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; \ + \ + /* declaration of variables used within macro "juncapfunction" */ \ + real tmp, id; \ + real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; \ + real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; \ + real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; \ + real ibbt, Fmaxr; \ + real fbreakdown; + + // Instance parameter dependent initialization -`define JuncapInitInstance(AB_i, LS_i, LG_i, VMAX, vbimin, vch, vfmin, vbbtlim) \ +`define JuncapInitInstance(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ if (idsatbot * AB_i > 0) begin \ vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1); \ end else begin \ @@ -89,28 +118,39 @@ vmaxgat = `vmaxlarge; \ end \ VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \ + `expl(VMAX * phitdinv, exp_VMAX_over_phitd) \ \ /* determination of minimum value of the relevant built-in voltages */ \ + /* and determination of limiting value of conditioned voltage for BBT calculation */ \ vbibot2 = vbibot; \ vbisti2 = vbisti; \ vbigat2 = vbigat; \ - if (AB_i == 0) begin vbibot2 = vbisti + vbigat; end \ - if (LS_i == 0) begin vbisti2 = vbibot + vbigat; end \ - if (LG_i == 0) begin vbigat2 = vbibot + vbisti; end \ - vbimin = min(min(vbibot2, vbisti2), vbigat2); \ - vch = vbimin * `epsch; \ - if (vbimin == vbibot) begin vfmin = vbibot * (1 - (pow(`a, (-1.0 / PBOT_i)))); end \ - if (vbimin == vbisti) begin vfmin = vbisti * (1 - (pow(`a, (-1.0 / PSTI_i)))); end \ - if (vbimin == vbigat) begin vfmin = vbigat * (1 - (pow(`a, (-1.0 / PGAT_i)))); end \ - \ - /* determination of limiting value of conditioned voltage for BBT calculation */ \ + pbot2 = PBOT_i; \ + psti2 = PSTI_i; \ + pgat2 = PGAT_i; \ vbibot2r = VBIRBOT_i; \ vbisti2r = VBIRSTI_i; \ vbigat2r = VBIRGAT_i; \ - if (AB_i == 0) begin vbibot2r = VBIRSTI_i + VBIRGAT_i; end \ - if (LS_i == 0) begin vbisti2r = VBIRBOT_i + VBIRGAT_i; end \ - if (LG_i == 0) begin vbigat2r = VBIRBOT_i + VBIRSTI_i; end \ - vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi; \ + if (AB_i == 0) begin \ + vbibot2 = vbisti + vbigat; \ + pbot2 = 0.9 * min(PSTI_i, PGAT_i); \ + vbibot2r = VBIRSTI_i + VBIRGAT_i; \ + end \ + if (LS_i == 0) begin \ + vbisti2 = vbibot + vbigat; \ + psti2 = 0.9 * min(PBOT_i, PGAT_i); \ + vbisti2r = VBIRBOT_i + VBIRGAT_i; \ + end \ + if (LG_i == 0) begin \ + vbigat2 = vbibot + vbisti; \ + pgat2 = 0.9 * min(PBOT_i, PSTI_i); \ + vbigat2r = VBIRBOT_i + VBIRSTI_i; \ + end \ + vbimin = min(min(vbibot2, vbisti2), vbigat2); \ + vch = vbimin * `epsch; \ + pmax = max(max(pbot2, psti2), pgat2); \ + vfmin = vbimin * (1 - (pow(`a, (-1.0 / (pmax))))); \ + vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi; // Special power-functions @@ -175,7 +215,7 @@ // This is the main function of the JUNCAP2-model. It returns the current and charge // for a single diode -`define juncapfunction(qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \ +`define juncapfunction(VAK,qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \ `mypower((1 - vj * vbiinv), one_minus_P, tmp) \ Qjprime = qpref * (1 - tmp) + qpref2 * (VAK - vj); \ id = idsat * idmult; \ @@ -240,46 +280,197 @@ // ABSOURCE, LSSOURCE, LGSOURCE for source junction in PSP and ABDRAIN, LSDRAIN, LGDRAIN for // drain junction in PSP -`define juncapcommon(AB_i,LS_i,LG_i,ijunbot,qjunbot,ijunsti,qjunsti,ijungat,qjungat) \ +`define juncapcommon(V, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ vbbt = 0.0; \ two_psistar = 0.0; \ if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ - `hypfunction5(VAK, vfmin, vch, vj) \ - if (VAK < VMAX) begin \ - `expl(0.5 * (VAK * phitdinv), zinv) \ + `hypfunction5(V, vfmin, vch, vj) \ + if (V < VMAX) begin \ + `expl(0.5 * (V * phitdinv), zinv) \ idmult = zinv * zinv; \ end else begin \ - `expl(VMAX * phitdinv, exp_VMAX_over_phitd) \ - idmult = (1 + (VAK - VMAX) * phitdinv) * exp_VMAX_over_phitd; \ + idmult = (1 + (V - VMAX) * phitdinv) * exp_VMAX_over_phitd; \ zinv = sqrt(idmult); \ end \ idmult = idmult - 1.0; \ z = 1 / zinv; \ - if (VAK > 0) begin \ + if (V > 0) begin \ two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \ end else begin \ - two_psistar = -VAK + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \ + two_psistar = -V + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \ end \ vjlim = vbimin - two_psistar; \ - `hypfunction2(VAK, vjlim, phitd, vjsrh) \ - `hypfunction2(VAK, vbbtlim, phitr, vbbt) \ - `hypfunction2(VAK, 0, `epsav, vav) \ + `hypfunction2(V, vjlim, phitd, vjsrh) \ + `hypfunction2(V, vbbtlim, phitr, vbbt) \ + `hypfunction2(V, 0, `epsav, vav) \ end \ if ((AB_i) == 0) begin \ ijunbot = 0; \ qjunbot = 0; \ end else begin \ - `juncapfunction(qprefbot,qpref2bot,vbiinvbot,one_minus_PBOT,idsatbot,CSRHBOT_i,CTATBOT_i,vbibot,wdepnulrbot,VBIRBOTinv,PBOT_i,ftdbot,btatpartbot,atatbot,one_over_one_minus_PBOT,CBBTBOT_i,VBIRBOT_i,wdepnulrinvbot,fbbtbot,VBRBOT_i,VBRinvbot,PBRBOT_i,fstopbot,slopebot,ijunbot, qjunbot) \ + `juncapfunction(V, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, ijunbot, qjunbot) \ end \ if ((LS_i) == 0) begin \ ijunsti = 0; \ qjunsti = 0; \ end else begin \ - `juncapfunction(qprefsti,qpref2sti,vbiinvsti,one_minus_PSTI,idsatsti,CSRHSTI_i,CTATSTI_i,vbisti,wdepnulrsti,VBIRSTIinv,PSTI_i,ftdsti,btatpartsti,atatsti,one_over_one_minus_PSTI,CBBTSTI_i,VBIRSTI_i,wdepnulrinvsti,fbbtsti,VBRSTI_i,VBRinvsti,PBRSTI_i,fstopsti,slopesti,ijunsti, qjunsti) \ + `juncapfunction(V, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, ijunsti, qjunsti) \ end \ if ((LG_i) == 0) begin \ ijungat = 0; \ qjungat = 0; \ end else begin \ - `juncapfunction(qprefgat,qpref2gat,vbiinvgat,one_minus_PGAT,idsatgat,CSRHGAT_i,CTATGAT_i,vbigat,wdepnulrgat,VBIRGATinv,PGAT_i,ftdgat,btatpartgat,atatgat,one_over_one_minus_PGAT,CBBTGAT_i,VBIRGAT_i,wdepnulrinvgat,fbbtgat,VBRGAT_i,VBRinvgat,PBRGAT_i,fstopgat,slopegat,ijungat, qjungat) \ + `juncapfunction(V, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, ijungat, qjungat) \ end + + +//============================================================================================================ +// JUNCAP-express +// +// The macros below are used in the express-version of JUNCAP2 +//============================================================================================================ + +`define relerr 0.001 + +`define P1(x) ((x) + 1) + +`define expll(x, xlow, expxlow, xhigh, expxhigh) \ + ((x) < (xlow)) ? (expxlow) / `P1((xlow) - (x)) : (((x) > (xhigh)) ? (expxhigh) * `P1((x) - (xhigh)) : exp(x)) + + +// The "JuncapExpressInit"-macro below is split into three parts, as some verilog-A compilers cannot handle +// macros beyond a certain size. Moreover, it is useful to limit the list of input and output variables. + +// Part 1 +`define JuncapExpressInit1(AB_i, LS_i, LG_i, VJUNREF_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ + FRACNA = 0.4; \ + FRACNB = 0.65; \ + FRACI = 0.8; \ + /* Sample voltages */ \ + V1 = -FRACNA * VJUNREF_i; \ + V2 = -FRACNB * VJUNREF_i; \ + V3 = -FRACI * VJUNREF_i; \ + V4 = 0.1; \ + V5 = 0.2; \ + /* evaluate full JUNCAP-model at five voltages */ \ + `juncapcommon(V1, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ + I1 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ + `juncapcommon(V2, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ + I2 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ + `juncapcommon(V3, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ + I3 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; + +// Part 2 +`define JuncapExpressInit2(AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim) \ + /* forward currents */ \ + `juncapcommon(V4, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ + I4 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; \ + `juncapcommon(V5, AB_i, LS_i, LG_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim, ijunbot, qjunbot, ijunsti, qjunsti, ijungat, qjungat) \ + I5 = AB_i * ijunbot + LS_i * ijunsti + LG_i * ijungat; + +// Part 3 +`define JuncapExpressInit3(AB_i, LS_i, LG_i, idsatbot, idsatsti, idsatgat, ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag) \ + /* compute internal parameters from these five (I,V)-values */ \ + ISATFOR1 = AB_i * idsatbot + LS_i * idsatsti + LG_i * idsatgat; \ + I4_cor = I4 - ISATFOR1 * (exp(V4 * phitdinv * MFOR1) - 1.0); \ + I5_cor = I5 - ISATFOR1 * (exp(V5 * phitdinv * MFOR1) - 1.0); \ + if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ + if ((I4 > 0) && (I5 > 0)) begin \ + if ((((I4_cor / I4) > `relerr) || ((I5_cor / I5) > `relerr)) && (I4_cor > 0) && (I5_cor > 0)) begin \ + alphaje = I4_cor / I5_cor; \ + MFOR2 = phitd * ln(alphaje) / (V4 - V5); \ + ISATFOR2 = I4_cor / (exp(V4 * phitdinv * MFOR2) - 1); \ + end \ + end \ + I1_cor = I1 - ISATFOR1 * (exp(V1 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V1 * phitdinv * MFOR2) - 1.0); \ + I2_cor = I2 - ISATFOR1 * (exp(V2 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V2 * phitdinv * MFOR2) - 1.0); \ + I3_cor = I3 - ISATFOR1 * (exp(V3 * phitdinv * MFOR1) - 1.0) - ISATFOR2 * (exp(V3 * phitdinv * MFOR2) - 1.0); \ + if ((I1 < 0) && (I2 < 0) && (I3 < 0)) begin \ + if ((((I1_cor / I1) > `relerr) || ((I2_cor / I2) > `relerr) || ((I3_cor / I3) > `relerr)) \ + && (I1_cor < 0) && (I2_cor < 0) && (I3_cor < 0)) begin \ + alphaje = I1_cor / I2_cor; \ + m0_rev = -phitd * ln(alphaje) / (V1 - V2); /* zeroth order approximation */ \ + tt0 = V2 / (V2 - V1); \ + tt1 = phitd * (alphaje - 1) * (pow(alphaje, tt0) - 1); \ + tt0 = V1 / (V1 - V2); \ + tt2 = pow(alphaje, tt0) * (V2 - V1) + alphaje * V1 - V2; \ + mcor_rev = tt1 / tt2; /* first order Newton correction */ \ + MREV = m0_rev + mcor_rev; \ + if (abs(V3 * phitdinv * MREV) < 1e-6) begin \ + /* Taylor approximation needed */ \ + /* Note: ISATREV and MREV have different meaning in this situation!! */ \ + m0flag = 1.0; \ + ISATREV = I3_cor * (1 / V3 + 0.5 * phitdinv * MREV); \ + MREV = -0.5 * I3_cor * MREV * phitdinv / V3; \ + end else begin \ + m0flag = 0.0; \ + ISATREV = -I3_cor / (exp(-V3 * phitdinv * MREV) - 1); \ + end \ + end \ + end \ + end + +// Part 4 +`define JuncapExpressInit4(AB_i, LS_i, LG_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot, zflagsti, zflaggat) \ + /* charge model initialization */ \ + zfrac = FJUNQ_i * (AB_i * cjobot + LS_i * cjosti + LG_i * cjogat); \ + if ((AB_i * cjobot) <= zfrac) begin \ + zflagbot = 0.0; \ + end \ + if ((LS_i * cjosti) <= zfrac) begin \ + zflagsti = 0.0; \ + end \ + if ((LG_i * cjogat) <= zfrac) begin \ + zflaggat = 0.0; \ + end + +// Part 5 +`define JuncapExpressInit5(AB_i, LS_i, LG_i, ISATFOR1, ISATFOR2, ISATREV, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr) \ + /* calculate limits beyond which exponentials are linearly extrapolated */ \ + if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ + xhighf1 = ln(0.5 * IMAX_i / (ISATFOR1 + 1e-21)); \ + xhighf2 = ln(0.5 * IMAX_i / (ISATFOR2 + 1e-21)); \ + xhighr = ln(0.5 * IMAX_i / (abs(ISATREV) + 1e-21)); \ + end \ + xhighf1 = min(xhighf1, `se05); \ + expxhf1 = exp(xhighf1); \ + xhighf2 = min(xhighf2, `se05); \ + expxhf2 = exp(xhighf2); \ + xhighr = min(xhighr, `se05); \ + expxhr = exp(xhighr); + +`define JuncapExpressCurrent(V, MFOR1, ISATFOR1, MFOR2, ISATFOR2, MREV, ISATREV, m0flag, xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr, ijun) \ + tm0 = V * phitdinv * MFOR1; \ + tm1 = `expll(tm0, -`se05, `ke05, xhighf1, expxhf1); \ + ijunfor1 = ISATFOR1 * (tm1 - 1.0); \ + tm0 = V * phitdinv * MFOR2; \ + tm1 = `expll(tm0, -`se05, `ke05, xhighf2, expxhf2); \ + ijunfor2 = ISATFOR2 * (tm1 - 1.0); \ + ijunrev = 0.0; \ + if (m0flag > 0) begin \ + ijunrev = V * (ISATREV + V * MREV); \ + end else begin \ + tm0 = -V * phitdinv * MREV; \ + tm1 = `expll(tm0, -`se05, `ke05, xhighr, expxhr); \ + ijunrev = -ISATREV * (tm1 - 1.0); \ + end \ + ijun = ijunfor1 + ijunfor2 + ijunrev; + + +`define JuncapExpressCharge(V, AB_i, LS_i, LG_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin, vch, zflagbot, zflagsti, zflaggat, qjunbot, qjunsti, qjungat) \ + tmpv = 0.0; \ + vjv = 0.0; \ + `hypfunction5(V, vfmin, vch, vjv) \ + if (zflagbot > 0.5) begin \ + `mypower((1 - vjv * vbiinvbot), one_minus_PBOT, tmpv) \ + qjunbot = qprefbot * (1 - tmpv) + qpref2bot * (V - vjv); \ + end \ + if (zflagsti > 0.5) begin \ + `mypower((1 - vjv * vbiinvsti), one_minus_PSTI, tmpv) \ + qjunsti = qprefsti * (1 - tmpv) + qpref2sti * (V - vjv); \ + end \ + if (zflaggat > 0.5) begin \ + `mypower((1 - vjv * vbiinvgat), one_minus_PGAT, tmpv) \ + qjungat = qprefgat * (1 - tmpv) + qpref2gat * (V - vjv); \ + end + diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include index a207a1217..c9f2f685b 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include @@ -4,15 +4,22 @@ //====================================================================================== //====================================================================================== // -// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. // // -// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5) +// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 // //====================================================================================== //====================================================================================== // -// Further information can be found in the file readme.txt +// Further information can be found in the file releasenotesPSP102.txt // ////////////////////////////////////////// @@ -21,45 +28,151 @@ // ////////////////////////////////////////// -parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(info="Maximum current up to which forward current behaves exponentially" unit="A" ); -parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2" ); -parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1" ); -parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1" ); -parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component" unit="V" ); -parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component" unit="V" ); -parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component" unit="V" ); -parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component" unit="" ); -parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component" unit="" ); -parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component" unit="" ); -parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component" unit="V" ); -parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component" unit="V" ); -parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component" unit="V" ); -parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component" unit="Am^-2" ); -parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1" ); -parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1" ); -parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3" ); -parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2" ); -parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2" ); -parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component" unit="m" ); -parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component" unit="m" ); -parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3" ); -parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2" ); -parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2" ); -parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit="" ); -parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component" unit="" ); -parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component" unit="" ); -parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component" unit="AV^-3" ); -parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m" ); -parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m" ); -parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1" ); -parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1" ); -parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1" ); -parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1" ); -parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1" ); -parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1" ); -parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component" unit="V" ); -parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component" unit="V" ); -parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component" unit="V" ); -parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component" unit="V" ); -parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component" unit="V" ); -parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component" unit="V" ); +parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(info="Maximum current up to which forward current behaves exponentially" unit="A"); +parameter real TRJ = 21 `from(`TRJ_cliplow ,inf ) `P(info="reference temperature" unit="C"); + +// Parameters for source-bulk junction +`ifdef JUNCAP_StandAlone + parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2"); + parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1"); + parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1"); + parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component" unit="V"); + parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component" unit="V"); + parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component" unit="V"); + parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component" unit=""); + parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component" unit=""); + parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component" unit=""); + parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component" unit="V"); + parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component" unit="V"); + parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component" unit="V"); + parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component" unit="Am^-2"); + parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1"); + parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1"); + parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3"); + parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2"); + parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2"); + parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component" unit="m"); + parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component" unit="m"); + parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3"); + parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2"); + parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2"); + parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit=""); + parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component" unit=""); + parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component" unit=""); + parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component" unit="AV^-3"); + parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m"); + parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m"); + parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1"); + parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1"); + parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1"); + parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1"); + parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1"); + parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1"); + parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component" unit="V"); + parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component" unit="V"); + parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component" unit="V"); + parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component" unit="V"); + parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component" unit="V"); + parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component" unit="V"); +`else // JUNCAP_StandAlone + parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component for source-bulk junction" unit="Fm^-2"); + parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component for source-bulk junction" unit="Fm^-1"); + parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component for source-bulk junction" unit="Fm^-1"); + parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component for source-bulk junction" unit="V"); + parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component for source-bulk junction" unit="V"); + parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component for source-bulk junction" unit="V"); + parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component for source-bulk junction" unit=""); + parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component for source-bulk junction" unit=""); + parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component for source-bulk junction" unit=""); + parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component for source-bulk junction" unit="V"); + parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component for source-bulk junction" unit="V"); + parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component for source-bulk junction" unit="V"); + parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component for source-bulk junction" unit="Am^-2"); + parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component for source-bulk junction" unit="Am^-1"); + parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component for source-bulk junction" unit="Am^-1"); + parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component for source-bulk junction" unit="Am^-3"); + parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component for source-bulk junction" unit="Am^-2"); + parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component for source-bulk junction" unit="Am^-2"); + parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component for source-bulk junction" unit="m"); + parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component for source-bulk junction" unit="m"); + parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component for source-bulk junction" unit="Am^-3"); + parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component for source-bulk junction" unit="Am^-2"); + parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component for source-bulk junction" unit="Am^-2"); + parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component for source-bulk junction" unit=""); + parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for source-bulk junction" unit=""); + parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for source-bulk junction" unit=""); + parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component for source-bulk junction" unit="AV^-3"); + parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component for source-bulk junction" unit="AV^-3m"); + parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component for source-bulk junction" unit="AV^-3m"); + parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component for source-bulk junction" unit="Vm^-1"); + parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for source-bulk junction" unit="Vm^-1"); + parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for source-bulk junction" unit="Vm^-1"); + parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component for source-bulk junction" unit="K^-1"); + parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component for source-bulk junction" unit="K^-1"); + parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component for source-bulk junction" unit="K^-1"); + parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component for source-bulk junction" unit="V"); + parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component for source-bulk junction" unit="V"); + parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component for source-bulk junction" unit="V"); + parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component for source-bulk junction" unit="V"); + parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component for source-bulk junction" unit="V"); + parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component for source-bulk junction" unit="V"); +`endif + +`ifdef JUNCAP_StandAlone + // do nothing +`else // JUNCAP_StandAlone + // Parameters for drain-bulk junction + parameter real CJORBOTD = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component for drain-bulk junction" unit="Fm^-2"); + parameter real CJORSTID = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component for drain-bulk junction" unit="Fm^-1"); + parameter real CJORGATD = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component for drain-bulk junction" unit="Fm^-1"); + parameter real VBIRBOTD = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component for drain-bulk junction" unit="V"); + parameter real VBIRSTID = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component for drain-bulk junction" unit="V"); + parameter real VBIRGATD = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component for drain-bulk junction" unit="V"); + parameter real PBOTD = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component for drain-bulk junction" unit=""); + parameter real PSTID = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component for drain-bulk junction" unit=""); + parameter real PGATD = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component for drain-bulk junction" unit=""); + parameter real PHIGBOTD = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component for drain-bulk junction" unit="V"); + parameter real PHIGSTID = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component for drain-bulk junction" unit="V"); + parameter real PHIGGATD = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component for drain-bulk junction" unit="V"); + parameter real IDSATRBOTD = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component for drain-bulk junction" unit="Am^-2"); + parameter real IDSATRSTID = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component for drain-bulk junction" unit="Am^-1"); + parameter real IDSATRGATD = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component for drain-bulk junction" unit="Am^-1"); + parameter real CSRHBOTD = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component for drain-bulk junction" unit="Am^-3"); + parameter real CSRHSTID = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component for drain-bulk junction" unit="Am^-2"); + parameter real CSRHGATD = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component for drain-bulk junction" unit="Am^-2"); + parameter real XJUNSTID = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component for drain-bulk junction" unit="m"); + parameter real XJUNGATD = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component for drain-bulk junction" unit="m"); + parameter real CTATBOTD = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component for drain-bulk junction" unit="Am^-3"); + parameter real CTATSTID = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component for drain-bulk junction" unit="Am^-2"); + parameter real CTATGATD = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component for drain-bulk junction" unit="Am^-2"); + parameter real MEFFTATBOTD= 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component for drain-bulk junction" unit=""); + parameter real MEFFTATSTID= 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component for drain-bulk junction" unit=""); + parameter real MEFFTATGATD= 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component for drain-bulk junction" unit=""); + parameter real CBBTBOTD = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component for drain-bulk junction" unit="AV^-3"); + parameter real CBBTSTID = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component for drain-bulk junction" unit="AV^-3m"); + parameter real CBBTGATD = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component for drain-bulk junction" unit="AV^-3m"); + parameter real FBBTRBOTD = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component for drain-bulk junction" unit="Vm^-1"); + parameter real FBBTRSTID = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component for drain-bulk junction" unit="Vm^-1"); + parameter real FBBTRGATD = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component for drain-bulk junction" unit="Vm^-1"); + parameter real STFBBTBOTD = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component for drain-bulk junction" unit="K^-1"); + parameter real STFBBTSTID = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component for drain-bulk junction" unit="K^-1"); + parameter real STFBBTGATD = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component for drain-bulk junction" unit="K^-1"); + parameter real VBRBOTD = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component for drain-bulk junction" unit="V"); + parameter real VBRSTID = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component for drain-bulk junction" unit="V"); + parameter real VBRGATD = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component for drain-bulk junction" unit="V"); + parameter real PBRBOTD = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component for drain-bulk junction" unit="V"); + parameter real PBRSTID = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component for drain-bulk junction" unit="V"); + parameter real PBRGATD = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component for drain-bulk junction" unit="V"); +`endif // JUNCAP_StandAlone + +// JUNCAP2-express parameters +parameter real SWJUNEXP = 0.0 `from( 0.0,1.0 ) `P(info="Flag for JUNCAP-express; 0=full model, 1=express model" unit=""); +`ifdef JUNCAP_StandAlone + parameter real VJUNREF = 2.5 `from(`VJUNREF_cliplow ,inf ) `P(info="Typical maximum junction voltage; usually about 2*VSUP" unit=""); + parameter real FJUNQ = 0.03 `from(`FJUNQ_cliplow ,inf ) `P(info="Fraction below which junction capacitance components are considered negligible" unit=""); +`else // JUNCAP_StandAlone + parameter real VJUNREF = 2.5 `from(`VJUNREF_cliplow ,inf ) `P(info="Typical maximum source-bulk junction voltage; usually about 2*VSUP" unit=""); + parameter real FJUNQ = 0.03 `from(`FJUNQ_cliplow ,inf ) `P(info="Fraction below which source-bulk junction capacitance components are considered negligible" unit=""); + parameter real VJUNREFD = 2.5 `from(`VJUNREF_cliplow ,inf ) `P(info="Typical maximum drain-bulk junction voltage; usually about 2*VSUP" unit=""); + parameter real FJUNQD = 0.03 `from(`FJUNQ_cliplow ,inf ) `P(info="Fraction below which drain-bulk junction capacitance components are considered negligible" unit=""); +`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include deleted file mode 100644 index f05b01926..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include +++ /dev/null @@ -1,67 +0,0 @@ -//====================================================================================== -//====================================================================================== -// Filename: JUNCAP200_varlist.include -//====================================================================================== -//====================================================================================== -// -// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors -// -// -// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5) -// -//====================================================================================== -//====================================================================================== -// -// Further information can be found in the file readme.txt -// - - -// declaration of variables needed in macro "calcerfcexpmtat" -real ysq, terfc, erfcpos; - -// declaration of variables needed in hypfunction 5 -real h1, h2, h2d, h3, h4, h5; - -// declaration of variables used within macro "juncapfunction" -real tmp, id; -real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; -real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; -real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; -real ibbt, Fmaxr; -real fbreakdown; - -// declaration of clipped parameters -real TRJ_i, IMAX_i; -real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i; -real PBOT_i, PSTI_i, PGAT_i; -real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i; -real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i; -real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i; -real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i; -real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i; - -// declaration of variables calculated outside macro "juncapfunction", voltage-independent part -real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv; -real deltaphigr, phigrbot, phigrsti, phigrgat, deltaphigd, phigdbot, phigdsti, phigdgat; -real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat, exp_VMAX_over_phitd; -real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat; -real vbibot2, vbisti2, vbigat2, vbibot2r, vbisti2r, vbigat2r; -real vbiinvbot, vbiinvsti, vbiinvgat; -real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT; -real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT; -real cjobot, cjosti, cjogat, qprefbot, qprefsti, qprefgat; -real vbimin, vch, vfmin, vbbtlim; -real qpref2bot, qpref2sti, qpref2gat; -real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat; -real VBIRBOTinv, VBIRSTIinv, VBIRGATinv; -real perfc, berfc, cerfc; -real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat; -real btatpartbot, btatpartsti, btatpartgat; -real fbbtbot, fbbtsti, fbbtgat; -real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat; -real slopebot, slopesti, slopegat; -real vmaxbot, vmaxsti, vmaxgat, VMAX; - -// declaration of variables calculated outside macro "juncapfunction", voltage-dependent part -real VAK, idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; - diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist1.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist1.include new file mode 100644 index 000000000..481e12bbc --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist1.include @@ -0,0 +1,102 @@ +//====================================================================================== +//====================================================================================== +// Filename: JUNCAP200_varlist1.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +// declaration of clipped parameters +real TRJ_i, IMAX_i; +real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i; +real PBOT_i, PSTI_i, PGAT_i, PHIGBOT_i, PHIGSTI_i, PHIGGAT_i; +real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i; +real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i; +real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i; +real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i, FBBTRBOT_i, FBBTRSTI_i, FBBTRGAT_i; +real STFBBTBOT_i, STFBBTSTI_i, STFBBTGAT_i; +real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i; + +real SWJUNEXP_i, VJUNREF_i, FJUNQ_i; + +// declaration of variables calculated outside macro "juncapfunction", voltage-independent part +real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv; +real perfc, berfc, cerfc; +real deltaphigr, deltaphigd, pmax; + +real phigrbot, phigrsti, phigrgat, phigdbot, phigdsti, phigdgat; +real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat; +real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat; +real vbibot2, vbisti2, vbigat2, pbot2, psti2, pgat2, vbibot2r, vbisti2r, vbigat2r; +real vbiinvbot, vbiinvsti, vbiinvgat; +real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT; +real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT; +real cjobot, cjosti, cjogat; +real qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat; +real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat; +real VBIRBOTinv, VBIRSTIinv, VBIRGATinv; +real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat; +real btatpartbot, btatpartsti, btatpartgat; +real fbbtbot, fbbtsti, fbbtgat; +real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat; +real slopebot, slopesti, slopegat; +real vmaxbot, vmaxsti, vmaxgat; + +// JUNCAP-Express variables +real I1, I2, I3, I4, I5; +real I1_cor, I2_cor, I3_cor, I4_cor, I5_cor; +real V1, V2, V3, V4, V5; +real alphaje, m0_rev, mcor_rev; +real tt0, tt1, tt2, tm0, tm1; +real FRACNA, FRACNB, FRACI; +real zfrac; +real ijunfor1, ijunfor2, ijunrev; + +`ifdef JUNCAP_StandAlone + // do nothing +`else // JUNCAP_StandAlone + real CJORBOTD_i, CJORSTID_i, CJORGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i; + real PBOTD_i, PSTID_i, PGATD_i, PHIGBOTD_i, PHIGSTID_i, PHIGGATD_i; + real IDSATRBOTD_i, IDSATRSTID_i, IDSATRGATD_i, XJUNSTID_i, XJUNGATD_i; + real CSRHBOTD_i, CSRHSTID_i, CSRHGATD_i, CTATBOTD_i, CTATSTID_i, CTATGATD_i; + real MEFFTATBOTD_i, MEFFTATSTID_i, MEFFTATGATD_i; + real CBBTBOTD_i, CBBTSTID_i, CBBTGATD_i, FBBTRBOTD_i, FBBTRSTID_i, FBBTRGATD_i; + real STFBBTBOTD_i, STFBBTSTID_i, STFBBTGATD_i; + real VBRBOTD_i, VBRSTID_i, VBRGATD_i, PBRBOTD_i, PBRSTID_i, PBRGATD_i; + + real VJUNREFD_i, FJUNQD_i; + + real phigrbot_d, phigrsti_d, phigrgat_d, phigdbot_d, phigdsti_d, phigdgat_d; + real ftdbot_d, ftdsti_d, ftdgat_d, idsatbot_d, idsatsti_d, idsatgat_d; + real ubibot_d, ubisti_d, ubigat_d, vbibot_d, vbisti_d, vbigat_d; + real vbiinvbot_d, vbiinvsti_d, vbiinvgat_d; + real one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d; + real one_over_one_minus_PBOT_d, one_over_one_minus_PSTI_d, one_over_one_minus_PGAT_d; + real cjobot_d, cjosti_d, cjogat_d; + real qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d; + real wdepnulrbot_d, wdepnulrsti_d, wdepnulrgat_d, wdepnulrinvbot_d, wdepnulrinvsti_d, wdepnulrinvgat_d; + real VBIRBOTinv_d, VBIRSTIinv_d, VBIRGATinv_d; + real deltaEbot_d, deltaEsti_d, deltaEgat_d, atatbot_d, atatsti_d, atatgat_d; + real btatpartbot_d, btatpartsti_d, btatpartgat_d; + real fbbtbot_d, fbbtsti_d, fbbtgat_d; + real fstopbot_d, fstopsti_d, fstopgat_d, VBRinvbot_d, VBRinvsti_d, VBRinvgat_d; + real slopebot_d, slopesti_d, slopegat_d; +`endif + +`LocalGlobalVars diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist2.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist2.include new file mode 100644 index 000000000..ff1ec8a15 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist2.include @@ -0,0 +1,59 @@ +//====================================================================================== +//====================================================================================== +// Filename: JUNCAP200_varlist2.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0 (PSP), 200.4.0 (JUNCAP), December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// +//================================================================ +// Variables that are different for source and drain side junction +// and have a scope larger than a single macro-call +//================================================================ + +`ifdef JUNCAP_StandAlone + real AB_i, LS_i, LG_i; + real zflagbot, zflagsti, zflaggat; + real VMAX, exp_VMAX_over_phitd, vbimin, vch, vfmin, vbbtlim; + + // JUNCAP-express variables + real xhighf1, expxhf1, xhighf2, expxhf2, xhighr, expxhr; + + // JUNCAP2-express intermediate parameters + real ISATFOR1, MFOR1, ISATFOR2, MFOR2, ISATREV, MREV, m0flag; +`else // JUNCAP_StandAlone + real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, AS_i, PS_i; + real zflagbot_s, zflagsti_s, zflaggat_s; + real VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s; + + // JUNCAP-express variables + real xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, m0flag_s; + + // JUNCAP2-express intermediate parameters + real ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s; + + real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, AD_i, PD_i; + real zflagbot_d, zflagsti_d, zflaggat_d; + real VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d; + + // JUNCAP-express variables + real xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, m0flag_d; + + // JUNCAP2-express intermediate parameters + real ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d; +`endif // JUNCAP_StandAlone diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include new file mode 100644 index 000000000..c74c94f47 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_ChargesNQS.include @@ -0,0 +1,309 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_ChargesNQS.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +/////////////////////////////////////////////// +// +// Calculate NQS-charge contributions +// +/////////////////////////////////////////////// + +Qp1 = vnorm * V(SPLINE1); +Qp2 = vnorm * V(SPLINE2); +Qp3 = vnorm * V(SPLINE3); +Qp4 = vnorm * V(SPLINE4); +Qp5 = vnorm * V(SPLINE5); +Qp6 = vnorm * V(SPLINE6); +Qp7 = vnorm * V(SPLINE7); +Qp8 = vnorm * V(SPLINE8); +Qp9 = vnorm * V(SPLINE9); + +Tnorm = 0.0; + +if (SWNQS_i != 0) begin + // Dimension and mobility information is included in Tnorm + Tnorm = MUNQS_i * phit1 * BET_i / (COX_qm * Gmob_dL); + thesat2 = thesat1 * thesat1 * phit1 * phit1; + + if (SWNQS_i == 1) begin + dQy = QpN - Qp0; + d2Qy = 6.0 * (Qp0 + QpN) - 12.0 * Qp1; + end else if (SWNQS_i == 2) begin + dQy = (-7.0 * Qp0 - 3.0 * Qp1 + 12.0 * Qp2 - 2.0 * QpN) / 5.0; + d2Qy = -18.0 / 5.0 * (-4.0 * Qp0 + 9.0 * Qp1 - 6.0 * Qp2 + QpN); + end else if (SWNQS_i == 3) begin + dQy = (-13.0 * Qp0 - 6.0 * Qp1 + 24.0 * Qp2 - 6.0 * Qp3 + QpN) / 7.0; + d2Qy = (180.0 * Qp0 - 408.0 * Qp1 + 288.0 * Qp2 - 72.0 * Qp3 + 12.0 * QpN) / 7.0; + end else if (SWNQS_i == 5) begin + dQy = (-181.0 * Qp0 - 84.0 * Qp1 + 24.0 * Qp4 - 6.0 * Qp5 - 90.0 * Qp3 + QpN + + 336.0 * Qp2) / 65.0; + d2Qy = (432.0 * Qp4 - 108.0 * Qp5 - 1620.0 * Qp3 + 18.0 * QpN + 3762.0 * Qp0 + - 8532.0 * Qp1 + 6048.0 * Qp2) / 65.0; + end else if (SWNQS_i == 9) begin + dQy = (1680.0 * Qp6 + 23400.0 * Qp4 + 5.0 * QpN - 87330.0 * Qp3 + 120.0 * Qp8 + - 450.0 * Qp7 - 81480.0 * Qp1 + 325920.0 * Qp2 + -175565.0 * Qp0 - 30.0 * Qp9) / 37829.0 - 30.0 / 181.0 * Qp5; + d2Qy = (-13500.0 * Qp7 + 702000.0 * Qp4 - 2619900 * Qp3 - 13793100.0 * Qp1 + + 9777600.0 * Qp2 + 6081750.0 * Qp0 + 150.0 * QpN + 3600.0 * Qp8 + - 900.0 * Qp9 + 50400 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp1, xg, dQy, d2Qy, fk1) +end + +if (SWNQS_i >= 2) begin + if (SWNQS_i == 2) begin + dQy = (2.0 * Qp0 - 12.0 * Qp1 + 3.0 * Qp2 + 7.0 * QpN) / 5.0; + d2Qy = -18.0 / 5.0 * (-4.0 * QpN + 9.0 * Qp2 - 6.0 * Qp1 + Qp0); + end else if (SWNQS_i == 3) begin + dQy = 0.5 * Qp0 - 3.0 * Qp1 + 3.0 * Qp3 - 0.5 * QpN; + d2Qy = (-48.0 * Qp0 + 288.0 * Qp1 - 480.0 * Qp2 + 288.0 * Qp3 - 48.0 * QpN) / 7.0; + end else if (SWNQS_i == 5) begin + dQy = (-291.0 * Qp1 - 6.0 * Qp2 - 84.0 * Qp4 + 21.0 * Qp5) / 65.0 + + (630.0 * Qp3 - 7.0 * QpN + 97.0 * Qp0) / 130.0; + d2Qy = (-1728.0 * Qp4 + 432.0 * Qp5 + 6480.0 * Qp3 - 72.0 * QpN - 1008 * Qp0 + + 6048 * Qp1 - 10152 * Qp2) / 65.0; + end else if (SWNQS_i == 9) begin + dQy = (-5880.0 * Qp6 - 81900.0 * Qp4 + 305655.0 * Qp3 - 420.0 * Qp8 + + 105.0 * Qp9 - 282255.0 * Qp1 + 1575.0 * Qp7 - 5850.0 * Qp2) / 37829.0 + + 105.0 / 181.0 * Qp5 + (94085.0 * Qp0 - 35.0 * QpN) / 75658.0; + d2Qy = (9777600.0 * Qp1 + 54000.0 * Qp7 - 2808000.0 * Qp4 + 10479600.0 * Qp3 + - 16413000.0 * Qp2 - 1629600.0 * Qp0 - 600.0 * QpN - 14400.0 * Qp8 + + 3600.0 * Qp9 - 201600.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp2, xg, dQy, d2Qy, fk2) +end + +if (SWNQS_i >= 3) begin + if (SWNQS_i == 3) begin + dQy = (13.0 * QpN + 6.0 * Qp3 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 7.0; + d2Qy = (180.0 * QpN - 408.0 * Qp3 + 288.0 * Qp2 - 72.0 * Qp1 + 12.0 * Qp0) / 7.0; + end else if (SWNQS_i == 5) begin + dQy = (QpN - 6.0 * Qp5 + 24.0 * Qp4 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 5.0; + d2Qy = (1296.0 * (Qp4 + Qp2) - 324.0 * (Qp5 + Qp1) - 2052.0 * Qp3 + + 54.0 * (QpN + Qp0)) / 13.0; + end else if (SWNQS_i == 9) begin + dQy = (21840.0 * Qp6 + 304200.0 * Qp4 + 65.0 * QpN - 420.0 * Qp3 + 1560.0 * Qp8 + - 12605.0 * Qp0-390.0 * Qp9 + 75630.0 * Qp1 - 5850.0 * Qp7 + - 302520.0 * Qp2) / 37829.0 - 390.0 / 181.0 * Qp5; + d2Qy = (-2619900.0 * Qp1 - 202500.0 * Qp7 + 10530000.0 * Qp4 - 16601100.0 * Qp3 + + 10479600.0 * Qp2 + 436650.0 * Qp0 + 2250.0 * QpN + 54000.0 * Qp8 + - 13500.0 * Qp9 + 756000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp3, xg, dQy, d2Qy, fk3) +end + +if (SWNQS_i >= 4) begin + if (SWNQS_i == 5) begin + dQy = (-630.0 * Qp3 + 12.0 * Qp4 + 582.0 * Qp5 - 97.0 * QpN + 7.0 * Qp0 + - 42.0 * Qp1 + 168.0 * Qp2)/130.0; + d2Qy = (-10152.0 * Qp4 + 6048.0 * Qp5 + 6480.0 * Qp3 - 1008.0 * QpN + - 72.0 * Qp0 + 432.0 * Qp1 - 1728.0 * Qp2) / 65.0; + end + else if (SWNQS_i == 9) begin + dQy = (-81480.0 * Qp6 - 30.0 * Qp4 - 303975.0 * Qp3 - 5820.0 * Qp8 + + 1455.0 * Qp9 - 20265.0 * Qp1 + 21825.0 * Qp7 + 81060.0 * Qp2) / 37829.0 + - 485.0 / 75658.0 * QpN + 1455.0 * Qp5 / 181.0 + 6755.0 * Qp0 / 75658.0; + d2Qy = (702000.0 * Qp1 + 756000.0 * Qp7 - 16614600.0 * Qp4 + 10530000.0 * Qp3 + - 2808000.0 * Qp2 - 117000.0 * Qp0 - 8400.0 * QpN - 201600.0 * Qp8 + + 50400.0 * Qp9 - 2822400.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp4, xg, dQy, d2Qy, fk4) +end + +if (SWNQS_i >= 5) begin + if (SWNQS_i == 5) begin + dQy = (-336.0 * Qp4 + 84.0 * Qp5 + 90.0 * Qp3 + 181.0 * QpN - Qp0 + 6.0 * Qp1 + - 24.0 * Qp2) / 65.0; + d2Qy = (18.0 * Qp0 + 3762.0 * QpN + 6048.0 * Qp4 + 432.0 * Qp2 - 1620.0 * Qp3 + - 108.0 * Qp1 - 8532.0 * Qp5) / 65.0; + end else if (SWNQS_i == 9) begin + dQy = (1680.0 * (Qp6 - Qp4) + 5.0 * (QpN - Qp0) + 450.0 * (Qp3 - Qp7) + + 120.0 * (Qp8 - Qp2) - 30.0 * (Qp9 - Qp1)) / 209.0; + d2Qy = (-900.0 * (Qp1 + Qp9) - 13500.0 * (Qp7 + Qp3) - 79500.0 * Qp5 + + 50400.0 * (Qp4 + Qp6) + 3600.0 * (Qp2 + Qp8) + 150.0 * (Qp0 + QpN)) / 181.0; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp5, xg, dQy, d2Qy, fk5) +end + +if (SWNQS_i >= 6) begin + if (SWNQS_i == 9) begin + dQy = (30.0 * Qp6 + 81480.0 * Qp4 - 21825.0 * Qp3 - 81060.0 * Qp8 + 20265.0 * Qp9 + - 1455.0 * Qp1 + 303975.0 * Qp7 + 5820.0 * Qp2) / 37829.0 + -(6755.0 * QpN - 485.0 * Qp0) / 75658.0 - 1455.0 / 181.0 * Qp5; + d2Qy = (50400.0 * Qp1 + 10530000.0 * Qp7 - 2822400.0 * Qp4 + 756000.0 * Qp3 + - 201600.0 * Qp2 - 8400.0 * Qp0 - 117000.0 * QpN - 2808000.0 * Qp8 + + 702000.0 * Qp9 - 16614600.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp6, xg, dQy, d2Qy, fk6) +end + +if (SWNQS_i >= 7) begin + if (SWNQS_i == 9) begin + dQy = (-304200.0 * Qp6 - 21840.0 * Qp4 + 12605.0 * QpN + 5850.0 * Qp3 + + 302520.0 * Qp8 - 65.0 * Qp0 - 75630.0 * Qp9 + 390.0 * Qp1 + 420.0 * Qp7 + - 1560.0 * Qp2) / 37829.0 + 390.0 / 181.0 * Qp5; + d2Qy = (-13500.0 * Qp1 - 16601100.0 * Qp7 + 756000.0 * Qp4 - 202500.0 * Qp3 + + 54000.0 * Qp2 + 2250.0 * Qp0 + 436650.0 * QpN + 10479600.0 * Qp8 + - 2619900.0 * Qp9 + 10530000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp7, xg, dQy, d2Qy, fk7) +end + +if (SWNQS_i >= 8) begin + if (SWNQS_i == 9) begin + dQy = (81900.0 * Qp6 + 5880.0 * Qp4 - 1575.0 * Qp3 + 5850.0 * Qp8 + 282255.0 * Qp9 + - 105.0 * Qp1 - 305655.0 * Qp7 + 420.0 * Qp2) / 37829.0 + (35.0 * Qp0 + - 94085.0 * QpN) / 75658.0 - 105.0 / 181.0 * Qp5; + d2Qy = (3600.0 * Qp1 + 10479600.0 * Qp7 - 201600.0 * Qp4 + 54000.0 * Qp3 + - 14400.0 * Qp2 - 600.0 * Qp0 - 1629600.0 * QpN - 16413000.0 * Qp8 + + 9777600.0 * Qp9 - 2808000.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp8, xg, dQy, d2Qy, fk8) +end + +if (SWNQS_i >= 9) begin + if (SWNQS_i == 9) begin + dQy = (-23400.0 * Qp6 - 1680.0 * Qp4 + 175565.0 * QpN + 450.0 * Qp3 + - 325920.0 * Qp8 - 5.0 * Qp0 + 81480.0 * Qp9 + 30.0 * Qp1 + + 87330.0 * Qp7 - 120.0 * Qp2) / 37829.0 + 30.0 * Qp5 / 181.0; + d2Qy = (-900.0 * Qp1 - 2619900.0 * Qp7 + 50400.0 * Qp4 - 13500.0 * Qp3 + + 3600.0 * Qp2 + 150.0 * Qp0 + 6081750.0 * QpN + 9777600.0 * Qp8 + - 13793100.0 * Qp9 + 702000.0 * Qp6) / 37829.0 - 900.0 * Qp5 / 181.0; + end else begin + dQy = 0; + d2Qy = 0; + end + `fq(Qp9, xg, dQy, d2Qy, fk9) +end + +//-------------------------------------------------------------------- + +// Terminal charges for NQS +if (SWNQS_i != 0) begin + if (SWNQS_i == 1) begin + QS_NQS = (17.0 * Qp0 + 30.0 * Qp1 + QpN) / 96.0; + QD_NQS = (Qp0 + 30.0 * Qp1 + 17.0 * QpN) / 96.0; + `QiToPhi(Qp1,xg, temp1) + QG_NQS = xg - (x_sp + 4.0 * temp1 + x_dp) * `oneSixth; + end else if (SWNQS_i == 2) begin + QS_NQS = (11.0 * Qp0 + 24.0 * Qp1 + 9.0 * Qp2 + QpN) / 90.0; + QD_NQS = (11.0 * QpN + 24.0 * Qp2 + 9.0 * Qp1 + Qp0) / 90.0; + `QiToPhi(Qp1, xg, temp1) + `QiToPhi(Qp2, xg, temp2) + QG_NQS = xg - (x_sp + 3.0 * (temp1 + temp2) + x_dp) * 0.125; + end else if (SWNQS_i == 3) begin + QS_NQS = (251.0 * Qp0 + 594.0 * Qp1 + 312.0 * Qp2 + 174.0 * Qp3 + 13.0 * QpN) / 2688.0; + QD_NQS = (251.0 * QpN + 594.0 * Qp3 + 312.0 * Qp2 + 174.0 * Qp1 + 13.0 * Qp0) / 2688.0; + `QiToPhi(Qp1, xg, temp1) + `QiToPhi(Qp2, xg, temp2) + `QiToPhi(Qp3, xg, temp3) + QG_NQS = xg - (x_sp + 4.0 * temp1 + 2.0 * temp2 + 4.0 * temp3 + x_dp) / 12.0; + end else if (SWNQS_i == 5) begin + QS_NQS = (1187.0 * Qp0 + 43.0 * QpN) / 18720.0 + (503.0 * Qp1 + 172.0 * Qp4 + + 87.0 * Qp5 + 265.0 * Qp3 + 328.0 * Qp2) / 3120.0; + QD_NQS = (1187.0 * QpN + 43.0 * Qp0) / 18720.0 + (503.0 * Qp5 + 172.0 * Qp2 + + 87.0 * Qp1 + 265.0 * Qp3 + 328.0 * Qp4) / 3120.0; + `QiToPhi(Qp1, xg, temp1) + `QiToPhi(Qp2, xg, temp2) + `QiToPhi(Qp3, xg, temp3) + `QiToPhi(Qp4, xg, temp4) + `QiToPhi(Qp5, xg, temp5) + QG_NQS = xg - (x_sp + 4.0 * (temp1 + temp3 + temp5) + 2.0 * (temp2 + temp4) + x_dp) / 18.0; + end else if (SWNQS_i == 9) begin + QS_NQS = (75653.0 * Qp8 + 225999.0 * Qp4) / 3782900.0 + (151321.0 * Qp9 + + 454023.0 * Qp7 + 1073767.0 * Qp3 + 1564569.0 * Qp1) / 15131600.0 + + 75623.0 * Qp6 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp2 / 945725.0 + + (3504517.0 * Qp0 + 75653.0 * QpN) / 90789600.0; + QD_NQS = (75653.0 * Qp2 + 225999.0 * Qp6) / 3782900.0 + (151321.0 * Qp1 + + 454023.0 * Qp3 + 1073767.0 * Qp7 + 1564569.0 * Qp9) / 15131600.0 + + 75623.0 * Qp4 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp8 / 945725.0 + + (3504517.0 * QpN + 75653.0 * Qp0) / 90789600.0; + `QiToPhi(Qp1, xg, temp1) + `QiToPhi(Qp2, xg, temp2) + `QiToPhi(Qp3, xg, temp3) + `QiToPhi(Qp4, xg, temp4) + `QiToPhi(Qp5, xg, temp5) + `QiToPhi(Qp6, xg, temp6) + `QiToPhi(Qp7, xg, temp7) + `QiToPhi(Qp8, xg, temp8) + `QiToPhi(Qp9, xg, temp9) + QG_NQS = xg - (x_sp + 4.0 * (temp1 + temp3 + temp5 + temp7 + temp9) + + 2.0 * (temp2 + temp4 + temp6 + temp8) + x_dp) / 30.0; + end + QG_NQS = pd * QG_NQS; + + if (sigVds > 0) begin + Qs = COX_qm * phit1 * QS_NQS; + Qd = COX_qm * phit1 * QD_NQS; + end else begin + Qs = COX_qm * phit1 * QD_NQS; + Qd = COX_qm * phit1 * QS_NQS; + end + Qg = COX_qm * phit1 * QG_NQS; + Qb = -Qg - Qs - Qd; +end + +// Update internal nodes +V(RES1) <+ vnorm_inv * I(RES1) * r_nqs; +V(SPLINE1) <+ vnorm_inv * idt(-Tnorm * fk1, Qp1_0); +V(RES2) <+ vnorm_inv * I(RES2) * r_nqs; +V(SPLINE2) <+ vnorm_inv * idt(-Tnorm * fk2, Qp2_0); +V(RES3) <+ vnorm_inv * I(RES3) * r_nqs; +V(SPLINE3) <+ vnorm_inv * idt(-Tnorm * fk3, Qp3_0); +V(RES4) <+ vnorm_inv * I(RES4) * r_nqs; +V(SPLINE4) <+ vnorm_inv * idt(-Tnorm * fk4, Qp4_0); +V(RES5) <+ vnorm_inv * I(RES5) * r_nqs; +V(SPLINE5) <+ vnorm_inv * idt(-Tnorm * fk5, Qp5_0); +V(RES6) <+ vnorm_inv * I(RES6) * r_nqs; +V(SPLINE6) <+ vnorm_inv * idt(-Tnorm * fk6, Qp6_0); +V(RES7) <+ vnorm_inv * I(RES7) * r_nqs; +V(SPLINE7) <+ vnorm_inv * idt(-Tnorm * fk7, Qp7_0); +V(RES8) <+ vnorm_inv * I(RES8) * r_nqs; +V(SPLINE8) <+ vnorm_inv * idt(-Tnorm * fk8, Qp8_0); +V(RES9) <+ vnorm_inv * I(RES9) * r_nqs; +V(SPLINE9) <+ vnorm_inv * idt(-Tnorm * fk9, Qp9_0); + diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include new file mode 100644 index 000000000..3bdd3c858 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_InitNQS.include @@ -0,0 +1,197 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_InitNQS.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +///////////////////////////////////////////////////////////////////////////// +// +// Computing initial (dc) values for internal nodes. +// This code is independent of internal-node voltages +// +///////////////////////////////////////////////////////////////////////////// + +Qp1_0 = 0.0; +Qp2_0 = 0.0; +Qp3_0 = 0.0; +Qp4_0 = 0.0; +Qp5_0 = 0.0; +Qp6_0 = 0.0; +Qp7_0 = 0.0; +Qp8_0 = 0.0; +Qp9_0 = 0.0; +fk1 = 0.0; +fk2 = 0.0; +fk3 = 0.0; +fk4 = 0.0; +fk5 = 0.0; +fk6 = 0.0; +fk7 = 0.0; +fk8 = 0.0; +fk9 = 0.0; +if (SWNQS_i != 0) begin + dQis = 0.0; + dQy = 0.0; + dfQi = 0.0; + fQi = 0.0; + d2Qy = 0.0; + + Qp1 = 0.0; + Qp2 = 0.0; + Qp3 = 0.0; + Qp4 = 0.0; + Qp5 = 0.0; + Qp6 = 0.0; + Qp7 = 0.0; + Qp8 = 0.0; + Qp9 = 0.0; + + phi_p1 = 0.0; + phi_p2 = 0.0; + phi_p3 = 0.0; + phi_p4 = 0.0; + phi_p5 = 0.0; + phi_p6 = 0.0; + phi_p7 = 0.0; + phi_p8 = 0.0; + phi_p9 = 0.0; + + // Setting initial values for charge along the channel + // from interpolated DC-solution + if (xg > 0) begin + if (SWNQS_i == 1) begin + phi_p1 = `Phiy(0.5); + `PhiToQb(phi_p1,Qb_tmp) + Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; + end else if (SWNQS_i == 2) begin + phi_p1 = `Phiy(`oneThird); + `PhiToQb(phi_p1,Qb_tmp) + Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; + + phi_p2 = `Phiy(`twoThirds); + `PhiToQb(phi_p2,Qb_tmp) + Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; + if (sigVds < 0) begin + `swap(Qp1_0, Qp2_0) + end + end else if (SWNQS_i == 3) begin + phi_p1 = `Phiy(0.25); + `PhiToQb(phi_p1,Qb_tmp) + Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; + + phi_p2 = `Phiy(0.5); + `PhiToQb(phi_p2,Qb_tmp) + Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; + + phi_p3 = `Phiy(0.75); + `PhiToQb(phi_p3,Qb_tmp) + Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp; + if (sigVds < 0) begin + `swap(Qp1_0, Qp3_0) + end + end else if (SWNQS_i == 5) begin + phi_p1 = `Phiy(`oneSixth); + `PhiToQb(phi_p1,Qb_tmp) + Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; + + phi_p2 = `Phiy(`oneThird); + `PhiToQb(phi_p2,Qb_tmp) + Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; + + phi_p3 = `Phiy(0.5); + `PhiToQb(phi_p3,Qb_tmp) + Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp; + + phi_p4 = `Phiy(`twoThirds); + `PhiToQb(phi_p4,Qb_tmp) + Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp; + + phi_p5 = `Phiy(0.8333333333333333); + `PhiToQb(phi_p5,Qb_tmp) + Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp; + if (sigVds < 0) begin + `swap(Qp1_0, Qp5_0) + `swap(Qp2_0, Qp4_0) + end + end else if (SWNQS_i == 9) begin + phi_p1 = `Phiy(0.1); + `PhiToQb(phi_p1,Qb_tmp) + Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp; + + phi_p2 = `Phiy(0.2); + `PhiToQb(phi_p2,Qb_tmp) + Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp; + + phi_p3 = `Phiy(0.3); + `PhiToQb(phi_p3,Qb_tmp) + Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp; + + phi_p4 = `Phiy(0.4); + `PhiToQb(phi_p4,Qb_tmp) + Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp; + + phi_p5 = `Phiy(0.5); + `PhiToQb(phi_p5,Qb_tmp) + Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp; + + phi_p6 = `Phiy(0.6); + `PhiToQb(phi_p6,Qb_tmp) + Qp6_0 = -pd * (xg - phi_p6) - Qb_tmp; + + phi_p7 = `Phiy(0.7); + `PhiToQb(phi_p7,Qb_tmp) + Qp7_0 = -pd * (xg - phi_p7) - Qb_tmp; + + phi_p8 = `Phiy(0.8); + `PhiToQb(phi_p8,Qb_tmp) + Qp8_0 = -pd * (xg - phi_p8) - Qb_tmp; + + phi_p9 = `Phiy(0.9); + `PhiToQb(phi_p9,Qb_tmp) + Qp9_0 = -pd * (xg - phi_p9) - Qb_tmp; + if (sigVds < 0) begin + `swap(Qp1_0, Qp9_0) + `swap(Qp2_0, Qp8_0) + `swap(Qp3_0, Qp7_0) + `swap(Qp4_0, Qp6_0) + end + end + end // (x_g >0) +end // (SWNQS_i != 0) + +x_sp = 0.0; +x_dp = 0.0; +Qp0 = 0.0; +QpN = 0.0; +if (SWNQS_i != 0.0) begin + x_sp = x_m - sigVds * 0.5 * dps * inv_phit1; + x_dp = x_m + sigVds * 0.5 * dps * inv_phit1; + Qp0 = 0.0; + QpN = 0.0; + if (x_sp > 0) begin + `PhiToQb(x_sp, QbSIGN) + Qp0 = -pd * (xg - x_sp) - QbSIGN; + end + if (x_dp > 0) begin + `PhiToQb(x_dp, QbSIGN) + QpN = -pd * (xg - x_dp) - QbSIGN; + end +end diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include new file mode 100644 index 000000000..65c95e896 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_binning.include @@ -0,0 +1,152 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_binning.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +// auxiliary variables +iLEWE = iLE * iWE; +iiLE = LE / LEN; +iiWE = WE / WEN; +iiLEWE = iiLE * iiWE; +iiiLEWE = iiWE / iiLE; + +// auxiliary variables for COX only +iiLEcv = LEcv / LEN; +iiWEcv = WEcv / WEN; +iiLEWEcv = iiLEcv * iiWEcv; + +// auxiliary variables for CGOV only +iLEcv = LEN / LEcv; +iiiLEWEcv = iiWEcv / iiLEcv; + +// auxiliary variables for CGBOV only +iiLcv = Lcv / LEN; +iiWcv = Wcv / WEN; +iiLWcv = iiLcv * iiWcv; + +// auxiliary variables for CFR only +iLcv = LEN / Lcv; +iiiLWcv = iiWcv / iiLcv; + +// Process parameters +VFB = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB; +STVFB = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB; +TOX = POTOX; +EPSROX = POEPSROX; +NEFF = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF; +VNSUB = POVNSUB; +NSLP = PONSLP; +DNSUB = PODNSUB; +DPHIB = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB; +NP = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP; +CT = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT; +TOXOV = POTOXOV; +TOXOVD = POTOXOVD; +NOV = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV; +NOVD = PONOVD + iLE * PLNOVD + iWE * PWNOVD + iLEWE * PLWNOVD; + +// DIBL parameters +CF = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF; +CFB = POCFB; + +// Mobility parameters +BETN = POBETN + iLE * PLBETN + iiWE * PWBETN + iiiLEWE * PLWBETN; + + +STBET = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET; +MUE = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE; +STMUE = POSTMUE; +THEMU = POTHEMU; +STTHEMU = POSTTHEMU; +CS = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS; +STCS = POSTCS; +XCOR = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR; +STXCOR = POSTXCOR; +FETA = POFETA; + +// Series resistance parameters +RS = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS; +STRS = POSTRS; +RSB = PORSB; +RSG = PORSG; + +// Velocity saturation parameters +THESAT = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT; +STTHESAT = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT; +THESATB = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB; +THESATG = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG; + +// Saturation voltage parameters +AX = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX; + +// Channel length modulation (CLM) parameters +ALP = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP; +ALP1 = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1; +ALP2 = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2; +VP = POVP; + +// Impact ionization parameters +A1 = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1; +A2 = POA2; +STA2 = POSTA2; +A3 = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3; +A4 = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4; +GCO = POGCO; + +// Gate current parameters +IGINV = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV; +IGOV = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV; +IGOVD = POIGOVD + iLE * PLIGOVD + iiWE * PWIGOVD + iiiLEWE * PLWIGOVD; +STIG = POSTIG; +GC2 = POGC2; +GC3 = POGC3; +CHIB = POCHIB; + +// Gate-induced drain leakage (GIDL) parameters +AGIDL = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL; +AGIDLD = POAGIDLD + iLE * PLAGIDLD + iiWE * PWAGIDLD + iiiLEWE * PLWAGIDLD; +BGIDL = POBGIDL; +BGIDLD = POBGIDLD; +STBGIDL = POSTBGIDL; +STBGIDLD = POSTBGIDLD; +CGIDL = POCGIDL; +CGIDLD = POCGIDLD; + +// Charge model parameters +COX = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX; +CGOV = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV; +CGOVD = POCGOVD + iLEcv * PLCGOVD + iiWEcv * PWCGOVD + iiiLEWEcv * PLWCGOVD; +CGBOV = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV; +CFR = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR; +CFRD = POCFRD + iLcv * PLCFRD + iiWcv * PWCFRD + iiiLWcv * PLWCFRD; + +// Noise model parameters +FNT = POFNT; +FNTEXC = iLE * iLE * (POFNTEXC + iLE * PLFNTEXC + iWE * PWFNTEXC + iLEWE * PLWFNTEXC); +NFA = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA; +NFB = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB; +NFC = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC; +EF = POEF; + +// Well proximity effect parameters +KVTHOWE = POKVTHOWE + iLE * PLKVTHOWE + iWE * PWKVTHOWE + iLEWE * PLWKVTHOWE; +KUOWE = POKUOWE + iLE * PLKUOWE + iWE * PWKUOWE + iLEWE * PLWKUOWE; diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include new file mode 100644 index 000000000..a02b837f3 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_binpars.include @@ -0,0 +1,287 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_binpars.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +/////////////////////////////////////////////////// +// PSP global model parameters (binning) +/////////////////////////////////////////////////// + +parameter real LEVEL = 1021 `P(info="Model level" unit=""); +parameter real TYPE = 1 `from( -1.0,1.0 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit=""); +parameter real TR = 21 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C"); + +// Switch parameters +parameter real SWIGATE = 0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit=""); +parameter real SWIMPACT = 0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit=""); +parameter real SWGIDL = 0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit=""); +parameter real SWJUNCAP = 0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit=""); +parameter real SWJUNASYM = 0 `P(info="Flag for asymmetric junctions; 0=symmetric, 1=asymmetric" unit=""); +parameter real QMC = 1 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit=""); + +// Process parameters +parameter real LVARO = 0 `P(info="Geometry independent difference between actual and programmed poly-silicon gate length" unit="m"); +parameter real LVARL = 0 `P(info="Length dependence of difference between actual and programmed poly-silicon gate length" unit=""); +parameter real LAP = 0 `P(info="Effective channel length reduction per side due to lateral diffusion of source/drain dopant ions" unit="m"); +parameter real WVARO = 0 `P(info="Geometry independent difference between actual and programmed field-oxide opening" unit="m"); +parameter real WVARW = 0 `P(info="Width dependence of difference between actual and programmed field-oxide opening" unit=""); +parameter real WOT = 0 `P(info="Effective reduction of channel width per side due to lateral diffusion of channel-stop dopant ions" unit="m"); +parameter real DLQ = 0 `P(info="Effective channel length reduction for CV" unit="m"); +parameter real DWQ = 0 `P(info="Effective channel width reduction for CV" unit="m"); +parameter real POVFB = -1 `P(info="Coefficient for the geometry independent part of VFB" unit="V"); +parameter real PLVFB = 0.0 `P(info="Coefficient for the length dependence of VFB" unit="V"); +parameter real PWVFB = 0.0 `P(info="Coefficient for the width dependence of VFB" unit="V"); +parameter real PLWVFB = 0.0 `P(info="Coefficient for the length times width dependence of VFB" unit="V"); +parameter real POSTVFB = 0.0005 `P(info="Coefficient for the geometry independent part of STVFB" unit="V/K"); +parameter real PLSTVFB = 0.0 `P(info="Coefficient for the length dependence of STVFB" unit="V/K"); +parameter real PWSTVFB = 0.0 `P(info="Coefficient for the width dependence of STVFB" unit="V/K"); +parameter real PLWSTVFB = 0.0 `P(info="Coefficient for the length times width dependence of STVFB" unit="V/K"); +parameter real POTOX = 2E-09 `P(info="Coefficient for the geometry independent part of TOX" unit="m"); +parameter real POEPSROX = 3.9 `P(info="Coefficient for the geometry independent part of EPSOX" unit=""); +parameter real PONEFF = 5E+23 `P(info="Coefficient for the geometry independent part of NEFF" unit="m^-3"); +parameter real PLNEFF = 0.0 `P(info="Coefficient for the length dependence of NEFF" unit="m^-3"); +parameter real PWNEFF = 0.0 `P(info="Coefficient for the width dependence of NEFF" unit="m^-3"); +parameter real PLWNEFF = 0.0 `P(info="Coefficient for the length times width dependence of NEFF" unit="m^-3"); +parameter real POVNSUB = 0 `P(info="Coefficient for the geometry independent part of VNSUB" unit="V"); +parameter real PONSLP = 0.05 `P(info="Coefficient for the geometry independent part of NSLP" unit="V"); +parameter real PODNSUB = 0 `P(info="Coefficient for the geometry independent part of DNSUB" unit="V^-1"); +parameter real PODPHIB = 0 `P(info="Coefficient for the geometry independent part of DPHIB" unit="V"); +parameter real PLDPHIB = 0.0 `P(info="Coefficient for the length dependence of DPHIB" unit="V"); +parameter real PWDPHIB = 0.0 `P(info="Coefficient for the width dependence of DPHIB" unit="V"); +parameter real PLWDPHIB = 0.0 `P(info="Coefficient for the length times width dependence of DPHIB" unit="V"); +parameter real PONP = 1E+26 `P(info="Coefficient for the geometry independent part of NP" unit="m^-3"); +parameter real PLNP = 0.0 `P(info="Coefficient for the length dependence of NP" unit="m^-3"); +parameter real PWNP = 0.0 `P(info="Coefficient for the width dependence of NP" unit="m^-3"); +parameter real PLWNP = 0.0 `P(info="Coefficient for the length times width dependence of NP" unit="m^-3"); +parameter real POCT = 0 `P(info="Coefficient for the geometry independent part of CT" unit=""); +parameter real PLCT = 0.0 `P(info="Coefficient for the length dependence of CT" unit=""); +parameter real PWCT = 0.0 `P(info="Coefficient for the width dependence of CT" unit=""); +parameter real PLWCT = 0.0 `P(info="Coefficient for the length times width dependence of CT" unit=""); +parameter real POTOXOV = 2E-09 `P(info="Coefficient for the geometry independent part of TOXOV" unit="m"); +parameter real POTOXOVD = 2E-09 `P(info="Coefficient for the geometry independent part of TOXOV for drain side" unit="m"); +parameter real PONOV = 5E+25 `P(info="Coefficient for the geometry independent part of NOV" unit="m^-3"); +parameter real PLNOV = 0.0 `P(info="Coefficient for the length dependence of NOV" unit="m^-3"); +parameter real PWNOV = 0.0 `P(info="Coefficient for the width dependence of NOV" unit="m^-3"); +parameter real PLWNOV = 0.0 `P(info="Coefficient for the length times width dependence of NOV" unit="m^-3"); +parameter real PONOVD = 5E+25 `P(info="Coefficient for the geometry independent part of NOV for drain side" unit="m^-3"); +parameter real PLNOVD = 0.0 `P(info="Coefficient for the length dependence of NOV for drain side" unit="m^-3"); +parameter real PWNOVD = 0.0 `P(info="Coefficient for the width dependence of NOV for drain side" unit="m^-3"); +parameter real PLWNOVD = 0.0 `P(info="Coefficient for the length times width dependence of NOV for drain side" unit="m^-3"); + +// DIBL parameters +parameter real POCF = 0 `P(info="Coefficient for the geometry independent part of CF" unit=""); +parameter real PLCF = 0.0 `P(info="Coefficient for the length dependence of CF" unit=""); +parameter real PWCF = 0.0 `P(info="Coefficient for the width dependence of CF" unit=""); +parameter real PLWCF = 0.0 `P(info="Coefficient for the length times width dependence of CF" unit=""); +parameter real POCFB = 0 `P(info="Coefficient for the geometry independent part of CFB" unit="V^-1"); + +// Mobility parameters +parameter real POBETN = 0.07 `P(info="Coefficient for the geometry independent part of BETN" unit="m^2/V/s"); +parameter real PLBETN = 0.0 `P(info="Coefficient for the length dependence of BETN" unit="m^2/V/s"); +parameter real PWBETN = 0.0 `P(info="Coefficient for the width dependence of BETN" unit="m^2/V/s"); +parameter real PLWBETN = 0.0 `P(info="Coefficient for the length times width dependence of BETN" unit="m^2/V/s"); +parameter real POSTBET = 1 `P(info="Coefficient for the geometry independent part of STBET" unit=""); +parameter real PLSTBET = 0.0 `P(info="Coefficient for the length dependence of STBET" unit=""); +parameter real PWSTBET = 0.0 `P(info="Coefficient for the width dependence of STBET" unit=""); +parameter real PLWSTBET = 0.0 `P(info="Coefficient for the length times width dependence of STBET" unit=""); +parameter real POMUE = 0.5 `P(info="Coefficient for the geometry independent part of MUE" unit="m/V"); +parameter real PLMUE = 0.0 `P(info="Coefficient for the length dependence of MUE" unit="m/V"); +parameter real PWMUE = 0.0 `P(info="Coefficient for the width dependence of MUE" unit="m/V"); +parameter real PLWMUE = 0.0 `P(info="Coefficient for the length times width dependence of MUE" unit="m/V"); +parameter real POSTMUE = 0 `P(info="Coefficient for the geometry independent part of STMUE" unit=""); +parameter real POTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of THEMU" unit=""); +parameter real POSTTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of STTHEMU" unit=""); +parameter real POCS = 0 `P(info="Coefficient for the geometry independent part of CS" unit=""); +parameter real PLCS = 0.0 `P(info="Coefficient for the length dependence of CS" unit=""); +parameter real PWCS = 0.0 `P(info="Coefficient for the width dependence of CS" unit=""); +parameter real PLWCS = 0.0 `P(info="Coefficient for the length times width dependence of CS" unit=""); +parameter real POSTCS = 0 `P(info="Coefficient for the geometry independent part of STCS" unit=""); +parameter real POXCOR = 0 `P(info="Coefficient for the geometry independent part of XCOR" unit="V^-1"); +parameter real PLXCOR = 0.0 `P(info="Coefficient for the length dependence of XCOR" unit="V^-1"); +parameter real PWXCOR = 0.0 `P(info="Coefficient for the width dependence of XCOR" unit="V^-1"); +parameter real PLWXCOR = 0.0 `P(info="Coefficient for the length times width dependence of XCOR" unit="V^-1"); +parameter real POSTXCOR = 0 `P(info="Coefficient for the geometry independent part of STXCOR" unit=""); +parameter real POFETA = 1 `P(info="Coefficient for the geometry independent part of FETA" unit=""); + +// Series resistance parameters +parameter real PORS = 30 `P(info="Coefficient for the geometry independent part of RS" unit="Ohm"); +parameter real PLRS = 0.0 `P(info="Coefficient for the length dependence of RS" unit="Ohm"); +parameter real PWRS = 0.0 `P(info="Coefficient for the width dependence of RS" unit="Ohm"); +parameter real PLWRS = 0.0 `P(info="Coefficient for the length times width dependence of RS" unit="Ohm"); +parameter real POSTRS = 1 `P(info="Coefficient for the geometry independent part of STRS" unit=""); +parameter real PORSB = 0 `P(info="Coefficient for the geometry independent part of RSB" unit="V^-1"); +parameter real PORSG = 0 `P(info="Coefficient for the geometry independent part of RSG" unit="V^-1"); + +// Velocity saturation parameters +parameter real POTHESAT = 1 `P(info="Coefficient for the geometry independent part of THESAT" unit="V^-1"); +parameter real PLTHESAT = 0.0 `P(info="Coefficient for the length dependence of THESAT" unit="V^-1"); +parameter real PWTHESAT = 0.0 `P(info="Coefficient for the width dependence of THESAT" unit="V^-1"); +parameter real PLWTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of THESAT" unit="V^-1"); +parameter real POSTTHESAT = 1 `P(info="Coefficient for the geometry independent part of STTHESAT" unit=""); +parameter real PLSTTHESAT = 0.0 `P(info="Coefficient for the length dependence of STTHESAT" unit=""); +parameter real PWSTTHESAT = 0.0 `P(info="Coefficient for the width dependence of STTHESAT" unit=""); +parameter real PLWSTTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of STTHESAT" unit=""); +parameter real POTHESATB = 0 `P(info="Coefficient for the geometry independent part of THESATB" unit="V^-1"); +parameter real PLTHESATB = 0.0 `P(info="Coefficient for the length dependence of THESATB" unit="V^-1"); +parameter real PWTHESATB = 0.0 `P(info="Coefficient for the width dependence of THESATB" unit="V^-1"); +parameter real PLWTHESATB = 0.0 `P(info="Coefficient for the length times width dependence of THESATB" unit="V^-1"); +parameter real POTHESATG = 0 `P(info="Coefficient for the geometry independent part of THESATG" unit="V^-1"); +parameter real PLTHESATG = 0.0 `P(info="Coefficient for the length dependence of THESATG" unit="V^-1"); +parameter real PWTHESATG = 0.0 `P(info="Coefficient for the width dependence of THESATG" unit="V^-1"); +parameter real PLWTHESATG = 0.0 `P(info="Coefficient for the length times width dependence of THESATG" unit="V^-1"); + +// Saturation voltage parameters +parameter real POAX = 3 `P(info="Coefficient for the geometry independent part of AX" unit=""); +parameter real PLAX = 0.0 `P(info="Coefficient for the length dependence of AX" unit=""); +parameter real PWAX = 0.0 `P(info="Coefficient for the width dependence of AX" unit=""); +parameter real PLWAX = 0.0 `P(info="Coefficient for the length times width dependence of AX" unit=""); + +// Channel length modulation (CLM) parameters +parameter real POALP = 0.01 `P(info="Coefficient for the geometry independent part of ALP" unit=""); +parameter real PLALP = 0.0 `P(info="Coefficient for the length dependence of ALP" unit=""); +parameter real PWALP = 0.0 `P(info="Coefficient for the width dependence of ALP" unit=""); +parameter real PLWALP = 0.0 `P(info="Coefficient for the length times width dependence of ALP" unit=""); +parameter real POALP1 = 0 `P(info="Coefficient for the geometry independent part of ALP1" unit="V"); +parameter real PLALP1 = 0.0 `P(info="Coefficient for the length dependence of ALP1" unit="V"); +parameter real PWALP1 = 0.0 `P(info="Coefficient for the width dependence of ALP1" unit="V"); +parameter real PLWALP1 = 0.0 `P(info="Coefficient for the length times width dependence of ALP1" unit="V"); +parameter real POALP2 = 0 `P(info="Coefficient for the geometry independent part of ALP2" unit="V^-1"); +parameter real PLALP2 = 0.0 `P(info="Coefficient for the length dependence of ALP2" unit="V^-1"); +parameter real PWALP2 = 0.0 `P(info="Coefficient for the width dependence of ALP2" unit="V^-1"); +parameter real PLWALP2 = 0.0 `P(info="Coefficient for the length times width dependence of ALP2" unit="V^-1"); +parameter real POVP = 0.05 `P(info="Coefficient for the geometry independent part of VP" unit="V"); + +// Impact ionization parameters +parameter real POA1 = 1 `P(info="Coefficient for the geometry independent part of A1" unit=""); +parameter real PLA1 = 0.0 `P(info="Coefficient for the length dependence of A1" unit=""); +parameter real PWA1 = 0.0 `P(info="Coefficient for the width dependence of A1" unit=""); +parameter real PLWA1 = 0.0 `P(info="Coefficient for the length times width dependence of A1" unit=""); +parameter real POA2 = 10 `P(info="Coefficient for the geometry independent part of A2" unit="V"); +parameter real POSTA2 = 0 `P(info="Coefficient for the geometry independent part of STA2" unit="V"); +parameter real POA3 = 1 `P(info="Coefficient for the geometry independent part of A3" unit=""); +parameter real PLA3 = 0.0 `P(info="Coefficient for the length dependence of A3" unit=""); +parameter real PWA3 = 0.0 `P(info="Coefficient for the width dependence of A3" unit=""); +parameter real PLWA3 = 0.0 `P(info="Coefficient for the length times width dependence of A3" unit=""); +parameter real POA4 = 0 `P(info="Coefficient for the geometry independent part of A4" unit="V^-0.5"); +parameter real PLA4 = 0.0 `P(info="Coefficient for the length dependence of A4" unit="V^-0.5"); +parameter real PWA4 = 0.0 `P(info="Coefficient for the width dependence of A4" unit="V^-0.5"); +parameter real PLWA4 = 0.0 `P(info="Coefficient for the length times width dependence of A4" unit="V^-0.5"); +parameter real POGCO = 0 `P(info="Coefficient for the geometry independent part of GCO" unit=""); + +// Gate current parameters +parameter real POIGINV = 0 `P(info="Coefficient for the geometry independent part of IGINV" unit="A"); +parameter real PLIGINV = 0.0 `P(info="Coefficient for the length dependence of IGINV" unit="A"); +parameter real PWIGINV = 0.0 `P(info="Coefficient for the width dependence of IGINV" unit="A"); +parameter real PLWIGINV = 0.0 `P(info="Coefficient for the length times width dependence of IGINV" unit="A"); +parameter real POIGOV = 0 `P(info="Coefficient for the geometry independent part of IGOV" unit="A"); +parameter real PLIGOV = 0.0 `P(info="Coefficient for the length dependence of IGOV" unit="A"); +parameter real PWIGOV = 0.0 `P(info="Coefficient for the width dependence of IGOV" unit="A"); +parameter real PLWIGOV = 0.0 `P(info="Coefficient for the length times width dependence of IGOV" unit="A"); +parameter real POIGOVD = 0 `P(info="Coefficient for the geometry independent part of IGOV for drain side" unit="A"); +parameter real PLIGOVD = 0.0 `P(info="Coefficient for the length dependence of IGOV for drain side" unit="A"); +parameter real PWIGOVD = 0.0 `P(info="Coefficient for the width dependence of IGOV for drain side" unit="A"); +parameter real PLWIGOVD = 0.0 `P(info="Coefficient for the length times width dependence of IGOV for drain side" unit="A"); +parameter real POSTIG = 2 `P(info="Coefficient for the geometry independent part of STIG" unit=""); +parameter real POGC2 = 0.375 `P(info="Coefficient for the geometry independent part of GC2" unit=""); +parameter real POGC3 = 0.063 `P(info="Coefficient for the geometry independent part of GC3" unit=""); +parameter real POCHIB = 3.1 `P(info="Coefficient for the geometry independent part of CHIB" unit="V"); + +// Gate-induced drain leakage (GIDL) parameters +parameter real POAGIDL = 0 `P(info="Coefficient for the geometry independent part of AGIDL" unit="A/V^3"); +parameter real PLAGIDL = 0.0 `P(info="Coefficient for the length dependence of AGIDL" unit="A/V^3"); +parameter real PWAGIDL = 0.0 `P(info="Coefficient for the width dependence of AGIDL" unit="A/V^3"); +parameter real PLWAGIDL = 0.0 `P(info="Coefficient for the length times width dependence of AGIDL" unit="A/V^3"); +parameter real POAGIDLD = 0 `P(info="Coefficient for the geometry independent part of AGIDL for drain side" unit="A/V^3"); +parameter real PLAGIDLD = 0.0 `P(info="Coefficient for the length dependence of AGIDL for drain side" unit="A/V^3"); +parameter real PWAGIDLD = 0.0 `P(info="Coefficient for the width dependence of AGIDL for drain side" unit="A/V^3"); +parameter real PLWAGIDLD = 0.0 `P(info="Coefficient for the length times width dependence of AGIDL for drain side" unit="A/V^3"); +parameter real POBGIDL = 41 `P(info="Coefficient for the geometry independent part of BGIDL" unit="V"); +parameter real POBGIDLD = 41 `P(info="Coefficient for the geometry independent part of BGIDL for drain side" unit="V"); +parameter real POSTBGIDL = 0 `P(info="Coefficient for the geometry independent part of STBGIDL" unit="V/K"); +parameter real POSTBGIDLD = 0 `P(info="Coefficient for the geometry independent part of STBGIDL for drain side" unit="V/K"); +parameter real POCGIDL = 0 `P(info="Coefficient for the geometry independent part of CGIDL" unit=""); +parameter real POCGIDLD = 0 `P(info="Coefficient for the geometry independent part of CGIDL for drain side" unit=""); + +// Charge model parameters +parameter real POCOX = 1E-14 `P(info="Coefficient for the geometry independent part of COX" unit="F"); +parameter real PLCOX = 0.0 `P(info="Coefficient for the length dependence of COX" unit="F"); +parameter real PWCOX = 0.0 `P(info="Coefficient for the width dependence of COX" unit="F"); +parameter real PLWCOX = 0.0 `P(info="Coefficient for the length times width dependence of COX" unit="F"); +parameter real POCGOV = 1E-15 `P(info="Coefficient for the geometry independent part of CGOV" unit="F"); +parameter real PLCGOV = 0.0 `P(info="Coefficient for the length dependence of CGOV" unit="F"); +parameter real PWCGOV = 0.0 `P(info="Coefficient for the width dependence of CGOV" unit="F"); +parameter real PLWCGOV = 0.0 `P(info="Coefficient for the length times width dependence of CGOV" unit="F"); +parameter real POCGOVD = 1E-15 `P(info="Coefficient for the geometry independent part of CGOV for drain side" unit="F"); +parameter real PLCGOVD = 0.0 `P(info="Coefficient for the length dependence of CGOV for drain side" unit="F"); +parameter real PWCGOVD = 0.0 `P(info="Coefficient for the width dependence of CGOV for drain side" unit="F"); +parameter real PLWCGOVD = 0.0 `P(info="Coefficient for the length times width dependence of CGOV for drain side" unit="F"); +parameter real POCGBOV = 0 `P(info="Coefficient for the geometry independent part of CGBOV" unit="F"); +parameter real PLCGBOV = 0.0 `P(info="Coefficient for the length dependence of CGBOV" unit="F"); +parameter real PWCGBOV = 0.0 `P(info="Coefficient for the width dependence of CGBOV" unit="F"); +parameter real PLWCGBOV = 0.0 `P(info="Coefficient for the length times width dependence of CGBOV" unit="F"); +parameter real POCFR = 0 `P(info="Coefficient for the geometry independent part of CFR" unit="F"); +parameter real PLCFR = 0.0 `P(info="Coefficient for the length dependence of CFR" unit="F"); +parameter real PWCFR = 0.0 `P(info="Coefficient for the width dependence of CFR" unit="F"); +parameter real PLWCFR = 0.0 `P(info="Coefficient for the length times width dependence of CFR" unit="F"); +parameter real POCFRD = 0 `P(info="Coefficient for the geometry independent part of CFR for drain side" unit="F"); +parameter real PLCFRD = 0.0 `P(info="Coefficient for the length dependence of CFR for drain side" unit="F"); +parameter real PWCFRD = 0.0 `P(info="Coefficient for the width dependence of CFR for drain side" unit="F"); +parameter real PLWCFRD = 0.0 `P(info="Coefficient for the length times width dependence of CFR for drain side" unit="F"); + +// Noise model parameters +parameter real POFNT = 1 `P(info="Coefficient for the geometry independent part of FNT" unit=""); +parameter real POFNTEXC = 0.0 `P(info="Coefficient for the geometry independent part of FNTEXC" unit=""); +parameter real PLFNTEXC = 0.0 `P(info="Coefficient for the length dependence of FNTEXC" unit=""); +parameter real PWFNTEXC = 0.0 `P(info="Coefficient for the width dependence of FNTEXC" unit=""); +parameter real PLWFNTEXC = 0.0 `P(info="Coefficient for the length times width dependence of FNTEXC" unit=""); +parameter real PONFA = 8E+22 `P(info="Coefficient for the geometry independent part of NFA" unit="V^-1/m^4"); +parameter real PLNFA = 0.0 `P(info="Coefficient for the length dependence of NFA" unit="V^-1/m^4"); +parameter real PWNFA = 0.0 `P(info="Coefficient for the width dependence of NFA" unit="V^-1/m^4"); +parameter real PLWNFA = 0.0 `P(info="Coefficient for the length times width dependence of NFA" unit="V^-1/m^4"); +parameter real PONFB = 3E+07 `P(info="Coefficient for the geometry independent part of NFB" unit="V^-1/m^2"); +parameter real PLNFB = 0.0 `P(info="Coefficient for the length dependence of NFB" unit="V^-1/m^2"); +parameter real PWNFB = 0.0 `P(info="Coefficient for the width dependence of NFB" unit="V^-1/m^2"); +parameter real PLWNFB = 0.0 `P(info="Coefficient for the length times width dependence of NFB" unit="V^-1/m^2"); +parameter real PONFC = 0 `P(info="Coefficient for the geometry independent part of NFC" unit="V^-1"); +parameter real PLNFC = 0.0 `P(info="Coefficient for the length dependence of NFC" unit="V^-1"); +parameter real PWNFC = 0.0 `P(info="Coefficient for the width dependence of NFC" unit="V^-1"); +parameter real PLWNFC = 0.0 `P(info="Coefficient for the length times width dependence of NFC" unit="V^-1"); +parameter real POEF = 1.0 `P(info="Coefficient for the flicker noise frequency exponent" unit=""); + +// Other parameters +parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K"); + +// Well proximity effect parameters +parameter real POKVTHOWE = 0 `P(info="Coefficient for the geometry independent part of KVTHOWE" unit=""); +parameter real PLKVTHOWE = 0 `P(info="Coefficient for the length dependence part of KVTHOWE" unit=""); +parameter real PWKVTHOWE = 0 `P(info="Coefficient for the width dependence part of KVTHOWE" unit=""); +parameter real PLWKVTHOWE = 0 `P(info="Coefficient for the length times width dependence part of KVTHOWE" unit=""); +parameter real POKUOWE = 0 `P(info="Coefficient for the geometry independent part of KUOWE" unit=""); +parameter real PLKUOWE = 0 `P(info="Coefficient for the length dependence part of KUOWE" unit=""); +parameter real PWKUOWE = 0 `P(info="Coefficient for the width dependence part of KUOWE" unit=""); +parameter real PLWKUOWE = 0 `P(info="Coefficient for the length times width dependence part of KUOWE" unit=""); + +// `Dummy' parameters for binning-set labeling +parameter real LMIN = 0 `P(info="Dummy parameter to label binning set" unit="m"); +parameter real LMAX = 1.0 `P(info="Dummy parameter to label binning set" unit="m"); +parameter real WMIN = 0 `P(info="Dummy parameter to label binning set" unit="m"); +parameter real WMAX = 1.0 `P(info="Dummy parameter to label binning set" unit="m"); diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include index c4b1496bc..0c7800e39 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include @@ -4,18 +4,24 @@ //====================================================================================== //====================================================================================== // -// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. // // -// Version: 102.1, April 2007 (Simkit 2.5) +// Version: 102.5.0, December 2013 // //====================================================================================== //====================================================================================== // -// Further information can be found in the file readme.txt +// Further information can be found in the file releasenotesPSP102.txt // - ///////////////////////////////////////////// // // Macros and constants used in PSP @@ -23,7 +29,7 @@ ///////////////////////////////////////////// // Explicit Gmin -`define GMIN 1E-15 +`define GMIN $simparam("gmin") `define PMOS -1 `define NMOS +1 @@ -33,7 +39,6 @@ `define MAXA(x,y,a) 0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a))) // Physical constants -`define EPSOX 3.453E-11 `define QMN 5.951993 `define QMP 7.448711 @@ -41,20 +46,10 @@ `define DELTA1 0.02 `define invSqrt2 7.0710678118654746e-01 `define oneSixth 1.6666666666666667e-01 -`define exp80 5.5406223843935098e+34 -`define exp160 3.0698496406442424e+69 -`ifdef NQSmodel - `define Gint GP - `define Bint BP - `define Bjs BS - `define Bjd BD -`else // NQSmodel - `define Gint G - `define Bint B - `define Bjs B - `define Bjd B -`endif // NQSModel + +`define OPdef(OPvarname, OPdesc, OPunit) (*desc=OPdesc*) real OPvarname; + ///////////////////////////////////////////////////////////////////////////// // @@ -73,19 +68,14 @@ // around the arguments in the expressions are necessary) `define sigma(a,c,tau,eta,y) \ nu = (a) + (c); \ - mu = nu * nu / (tau) + 0.5 * ((c) * (c)) - (a); \ - y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a))); - + mutau = nu * nu + (tau) * (0.5 * ((c) * (c)) - (a)); \ + y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a))); // modified version of sigma, which takes 4 arguments `define sigma2(a,b,c,tau,eta,y) \ nu = (a) + (c); \ - if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\ - y = (eta); \ - end else begin \ - mu = (nu) * (nu) / (tau) + 0.5 * ((c) * (c)) - (a) * (b); \ - y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \ - end + mutau = (nu) * (nu) + (tau) * (0.5 * ((c) * (c)) - (a) * (b)); \ + y = (eta) + (a) * nu * (tau) / (mutau + (nu / mutau) * (tau) * (tau) * (c) * ((c) * (c) * `oneThird - (a) * (b))); // // sp_s surface potential calculation @@ -248,3 +238,37 @@ end \ sp = -sp; \ end + +// This construct is used for parasitic resistances. +// If R=0, the Verilog-A compiler should recognize +// that the corresponding nodes can be collapsed +`define CollapsableR(G, R, SN, N1, N2) \ + if ((R) > 0.0) begin \ + I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \ + I(N1, N2) <+ white_noise(MULT_i * SN); \ + end else begin \ + V(N1, N2) <+ 0.0; \ + end + +`define NonCollapsableR(G, R, SN, N1, N2) \ + I(N1, N2) <+ MULT_i * (G) * V(N1, N2); \ + I(N1, N2) <+ white_noise(MULT_i * SN, "thermal noise"); + +// This macro is used for asymmetric overlap regions. +// The following variables are changed to those for source/drain side. +`define ChangeToSource \ + GOV = GOV_s; \ + GOV2 = GOV2_s; \ + xi_ov = xi_ov_s; \ + inv_xi_ov = inv_xi_ov_s; \ + x_mrg_ov = x_mrg_ov_s; \ + inv_xg1 = inv_xg1_s; + + +`define ChangeToDrain \ + GOV = GOV_d; \ + GOV2 = GOV2_d; \ + xi_ov = xi_ov_d; \ + inv_xi_ov = inv_xi_ov_d; \ + x_mrg_ov = x_mrg_ov_d; \ + inv_xg1 = inv_xg1_d; diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include index 4a1b74d89..2b9640fa9 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include @@ -1,20 +1,25 @@ -`undef P -`define P(txt) (*txt*) //====================================================================================== //====================================================================================== // Filename: PSP102_module.include //====================================================================================== //====================================================================================== // -// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. // // -// Version: 102.1, April 2007 (Simkit 2.5) +// Version: 102.5.0, December 2013 // //====================================================================================== //====================================================================================== // -// Further information can be found in the file readme.txt +// Further information can be found in the file releasenotesPSP102.txt // // Node definitions @@ -33,13 +38,14 @@ branch (NOI) NOII; branch (NOI) NOIR; branch (NOI) NOIC; +// Internal nodes for gate and bulk resistors +electrical GP; +electrical BP; +electrical BI; +electrical BS; +electrical BD; + `ifdef NQSmodel - // Internal nodes for gate and bulk resistors - electrical GP; - electrical BP; - electrical BI; - electrical BS; - electrical BD; // Internal nodes for spline collocation electrical INT1; @@ -86,134 +92,151 @@ branch (NOI) NOIC; /////////////////////////////////////////////////// // Special model parameters, some are also simulator global variables - parameter real LEVEL = 102 `P(info="Model level" unit="" ); - parameter real TYPE = 1.0 `from( -1.0,1.0 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" ); - parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" ); + parameter real LEVEL = 102 `P(info="Model level" unit=""); + + parameter real TYPE = 1.0 `from( -1.0,1.0 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit=""); + parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C"); // Switch parameters that turn models or effects on or off - parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" ); - parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" ); - parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" ); - parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" ); - parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" ); + parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit=""); + parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit=""); + parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit=""); + parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit=""); + parameter real SWJUNASYM= 0.0 `P(info="Flag for asymmetric junctions; 0=symmetric, 1=asymmetric" unit=""); + parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit=""); // Process parameters - parameter real VFB = -1.0 `P(info="Flatband voltage at TR" unit="V" ); - parameter real STVFB = 5.0e-4 `P(info="Temperature dependence of VFB" unit="V/K" ); - parameter real TOX = 2.0e-09 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m" ); - parameter real NEFF = 5.0e+23 `from( 1e20,1e26 ) `P(info="Effective substrate doping" unit="m^-3" ); - parameter real VNSUB = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V" ); - parameter real NSLP = 0.05 `from( 1e-3,inf ) `P(info="Effective doping bias-dependence parameter" unit="V" ); - parameter real DNSUB = 0.0 `from( 0.0,1.0 ) `P(info="Effective doping bias-dependence parameter" unit="V^-1" ); - parameter real DPHIB = 0.0 `P(info="Offset parameter for PHIB" unit="V" ); - parameter real NP = 1.0e+26 `from( 0.0,inf ) `P(info="Gate poly-silicon doping" unit="m^-3" ); - parameter real CT = 0.0 `from( 0.0,inf ) `P(info="Interface states factor" unit="" ); - parameter real TOXOV = 2.0e-09 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m" ); - parameter real NOV = 5.0e+25 `from( 1e20,1e27 ) `P(info="Effective doping of overlap region" unit="m^-3" ); + parameter real VFB = -1.0 `P(info="Flatband voltage at TR" unit="V"); + parameter real STVFB = 5.0e-4 `P(info="Temperature dependence of VFB" unit="V/K"); + parameter real TOX = 2.0e-09 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m"); + parameter real EPSROX = 3.9 `from( 1.0,inf ) `P(info="Relative permittivity of gate dielectric" unit=""); + parameter real NEFF = 5.0e+23 `from( 1e20,1e26 ) `P(info="Effective substrate doping" unit="m^-3"); + parameter real VNSUB = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V"); + parameter real NSLP = 0.05 `from( 1e-3,inf ) `P(info="Effective doping bias-dependence parameter" unit="V"); + parameter real DNSUB = 0.0 `from( 0.0,1.0 ) `P(info="Effective doping bias-dependence parameter" unit="V^-1"); + parameter real DPHIB = 0.0 `P(info="Offset parameter for PHIB" unit="V"); + parameter real NP = 1.0e+26 `from( 0.0,inf ) `P(info="Gate poly-silicon doping" unit="m^-3"); + parameter real CT = 0.0 `from( 0.0,inf ) `P(info="Interface states factor" unit=""); + parameter real TOXOV = 2.0e-09 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m"); + parameter real TOXOVD = 2.0e-09 `from( 1e-10,inf ) `P(info="Overlap oxide thickness for drain side" unit="m"); + parameter real NOV = 5.0e+25 `from( 1e20,1e27 ) `P(info="Effective doping of overlap region" unit="m^-3"); + parameter real NOVD = 5.0e+25 `from( 1e20,1e27 ) `P(info="Effective doping of overlap region for drain side" unit="m^-3"); // DIBL parameters - parameter real CF = 0.0 `from( 0.0,inf ) `P(info="DIBL-parameter" unit="V^-1" ); - parameter real CFB = 0.0 `from( 0.0,1.0 ) `P(info="Back bias dependence of CF" unit="V^-1" ); + parameter real CF = 0.0 `from( 0.0,inf ) `P(info="DIBL-parameter" unit=""); + parameter real CFB = 0.0 `from( 0.0,1.0 ) `P(info="Back bias dependence of CF" unit="V^-1"); // Mobility parameters - parameter real BETN = 7e-2 `from( 0.0,inf ) `P(info="Channel aspect ratio times zero-field mobility" unit="m^2/V/s" ); - parameter real STBET = 1.0 `P(info="Temperature dependence of BETN" unit="" ); - parameter real MUE = 0.5 `from( 0.0,inf ) `P(info="Mobility reduction coefficient at TR" unit="m/V" ); - parameter real STMUE = 0.0 `P(info="Temperature dependence of MUE" unit="" ); - parameter real THEMU = 1.5 `from( 0.0,inf ) `P(info="Mobility reduction exponent at TR" unit="" ); - parameter real STTHEMU = 1.5 `P(info="Temperature dependence of THEMU" unit="" ); - parameter real CS = 0.0 `from( 0.0,inf ) `P(info="Coulomb scattering parameter at TR" unit="" ); - parameter real STCS = 0.0 `P(info="Temperature dependence of CS" unit="" ); - parameter real XCOR = 0.0 `from( 0.0,inf ) `P(info="Non-universality factor" unit="V^-1" ); - parameter real STXCOR = 0.0 `P(info="Temperature dependence of XCOR" unit="" ); - parameter real FETA = 1.0 `from( 0.0,inf ) `P(info="Effective field parameter" unit="" ); + parameter real BETN = 7e-2 `from( 0.0,inf ) `P(info="Channel aspect ratio times zero-field mobility" unit="m^2/V/s"); + parameter real STBET = 1.0 `P(info="Temperature dependence of BETN" unit=""); + parameter real MUE = 0.5 `from( 0.0,inf ) `P(info="Mobility reduction coefficient at TR" unit="m/V"); + parameter real STMUE = 0.0 `P(info="Temperature dependence of MUE" unit=""); + parameter real THEMU = 1.5 `from( 0.0,inf ) `P(info="Mobility reduction exponent at TR" unit=""); + parameter real STTHEMU = 1.5 `P(info="Temperature dependence of THEMU" unit=""); + parameter real CS = 0.0 `from( 0.0,inf ) `P(info="Coulomb scattering parameter at TR" unit=""); + parameter real STCS = 0.0 `P(info="Temperature dependence of CS" unit=""); + parameter real XCOR = 0.0 `from( 0.0,inf ) `P(info="Non-universality factor" unit="V^-1"); + parameter real STXCOR = 0.0 `P(info="Temperature dependence of XCOR" unit=""); + parameter real FETA = 1.0 `from( 0.0,inf ) `P(info="Effective field parameter" unit=""); // Series-resistance parameters (for resistance modeling as part of intrinsic mobility reduction) - parameter real RS = 30 `from( 0.0,inf ) `P(info="Series resistance at TR" unit="Ohm" ); - parameter real STRS = 1.0 `P(info="Temperature dependence of RS" unit="" ); - parameter real RSB = 0.0 `from( -0.5,1.0 ) `P(info="Back-bias dependence of series resistance" unit="V^-1" ); - parameter real RSG = 0.0 `from( -0.5,inf ) `P(info="Gate-bias dependence of series resistance" unit="V^-1" ); + parameter real RS = 30 `from( 0.0,inf ) `P(info="Series resistance at TR" unit="Ohm"); + parameter real STRS = 1.0 `P(info="Temperature dependence of RS" unit=""); + parameter real RSB = 0.0 `from( -0.5,1.0 ) `P(info="Back-bias dependence of series resistance" unit="V^-1"); + parameter real RSG = 0.0 `from( -0.5,inf ) `P(info="Gate-bias dependence of series resistance" unit="V^-1"); // Velocity saturation parameters - parameter real THESAT = 1.0 `from( 0.0,inf ) `P(info="Velocity saturation parameter at TR" unit="V^-1" ); - parameter real STTHESAT = 1.0 `P(info="Temperature dependence of THESAT" unit="" ); - parameter real THESATB = 0.0 `from( -0.5,1.0 ) `P(info="Back-bias dependence of velocity saturation" unit="V^-1" ); - parameter real THESATG = 0.0 `from( -0.5,inf ) `P(info="Gate-bias dependence of velocity saturation" unit="V^-1" ); + parameter real THESAT = 1.0 `from( 0.0,inf ) `P(info="Velocity saturation parameter at TR" unit="V^-1"); + parameter real STTHESAT = 1.0 `P(info="Temperature dependence of THESAT" unit=""); + parameter real THESATB = 0.0 `from( -0.5,1.0 ) `P(info="Back-bias dependence of velocity saturation" unit="V^-1"); + parameter real THESATG = 0.0 `from( -0.5,inf ) `P(info="Gate-bias dependence of velocity saturation" unit="V^-1"); // Saturation voltage parameters - parameter real AX = 3.0 `from( 2.0,inf ) `P(info="Linear/saturation transition factor" unit="" ); + parameter real AX = 3.0 `from( 2.0,inf ) `P(info="Linear/saturation transition factor" unit=""); // Channel length modulation (CLM) parameters - parameter real ALP = 0.01 `from( 0.0,inf ) `P(info="CLM pre-factor" unit="" ); - parameter real ALP1 = 0.00 `from( 0.0,inf ) `P(info="CLM enhancement factor above threshold" unit="V" ); - parameter real ALP2 = 0.00 `from( 0.0,inf ) `P(info="CLM enhancement factor below threshold" unit="V^-1" ); - parameter real VP = 0.05 `from( 1e-10,inf ) `P(info="CLM logarithm dependence factor" unit="V" ); + parameter real ALP = 0.01 `from( 0.0,inf ) `P(info="CLM pre-factor" unit=""); + parameter real ALP1 = 0.00 `from( 0.0,inf ) `P(info="CLM enhancement factor above threshold" unit="V"); + parameter real ALP2 = 0.00 `from( 0.0,inf ) `P(info="CLM enhancement factor below threshold" unit="V^-1"); + parameter real VP = 0.05 `from( 1e-10,inf ) `P(info="CLM logarithm dependence factor" unit="V"); // Impact ionization (II) parameters - parameter real A1 = 1.0 `from( 0.0,inf ) `P(info="Impact-ionization pre-factor" unit="" ); - parameter real A2 = 10.0 `from( 0.0,inf ) `P(info="Impact-ionization exponent at TR" unit="V" ); - parameter real STA2 = 0.0 `P(info="Temperature dependence of A2" unit="V" ); - parameter real A3 = 1.0 `from( 0.0,inf ) `P(info="Saturation-voltage dependence of impact-ionization" unit="" ); - parameter real A4 = 0.0 `from( 0.0,inf ) `P(info="Back-bias dependence of impact-ionization" unit="V^-0.5" ); + parameter real A1 = 1.0 `from( 0.0,inf ) `P(info="Impact-ionization pre-factor" unit=""); + parameter real A2 = 10.0 `from( 0.0,inf ) `P(info="Impact-ionization exponent at TR" unit="V"); + parameter real STA2 = 0.0 `P(info="Temperature dependence of A2" unit="V"); + parameter real A3 = 1.0 `from( 0.0,inf ) `P(info="Saturation-voltage dependence of impact-ionization" unit=""); + parameter real A4 = 0.0 `from( 0.0,inf ) `P(info="Back-bias dependence of impact-ionization" unit="V^-0.5"); // Gate current parameters - parameter real GCO = 0.0 `from( -10.0,10.0 ) `P(info="Gate tunnelling energy adjustment" unit="" ); - parameter real IGINV = 0.0 `from( 0.0,inf ) `P(info="Gate channel current pre-factor" unit="A" ); - parameter real IGOV = 0.0 `from( 0.0,inf ) `P(info="Gate overlap current pre-factor" unit="A" ); - parameter real STIG = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit="" ); - parameter real GC2 = 0.375 `from( 0.0,10.0 ) `P(info="Gate current slope factor" unit="" ); - parameter real GC3 = 0.063 `from( -2.0,2.0 ) `P(info="Gate current curvature factor" unit="" ); - parameter real CHIB = 3.1 `from( 1.0,inf ) `P(info="Tunnelling barrier height" unit="V" ); + parameter real GCO = 0.0 `from( -10.0,10.0 ) `P(info="Gate tunnelling energy adjustment" unit=""); + parameter real IGINV = 0.0 `from( 0.0,inf ) `P(info="Gate channel current pre-factor" unit="A"); + parameter real IGOV = 0.0 `from( 0.0,inf ) `P(info="Gate overlap current pre-factor" unit="A"); + parameter real IGOVD = 0.0 `from( 0.0,inf ) `P(info="Gate overlap current pre-factor for drain side" unit="A"); + parameter real STIG = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit=""); + parameter real GC2 = 0.375 `from( 0.0,10.0 ) `P(info="Gate current slope factor" unit=""); + parameter real GC3 = 0.063 `from( -2.0,2.0 ) `P(info="Gate current curvature factor" unit=""); + parameter real CHIB = 3.1 `from( 1.0,inf ) `P(info="Tunnelling barrier height" unit="V"); // Gate Induced Drain/Source Leakage (GIDL) parameters - parameter real AGIDL = 0.0 `from( 0.0,inf ) `P(info="GIDL pre-factor" unit="A/V^3" ); - parameter real BGIDL = 41.0 `from( 0.0,inf ) `P(info="GIDL probability factor at TR" unit="V" ); - parameter real STBGIDL = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K" ); - parameter real CGIDL = 0.0 `P(info="Back-bias dependence of GIDL" unit="" ); + parameter real AGIDL = 0.0 `from( 0.0,inf ) `P(info="GIDL pre-factor" unit="A/V^3"); + parameter real AGIDLD = 0.0 `from( 0.0,inf ) `P(info="GIDL pre-factor for drain side" unit="A/V^3"); + parameter real BGIDL = 41.0 `from( 0.0,inf ) `P(info="GIDL probability factor at TR" unit="V"); + parameter real BGIDLD = 41.0 `from( 0.0,inf ) `P(info="GIDL probability factor at TR for drain side" unit="V"); + parameter real STBGIDL = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K"); + parameter real STBGIDLD = 0.0 `P(info="Temperature dependence of BGIDL for drain side" unit="V/K"); + parameter real CGIDL = 0.0 `P(info="Back-bias dependence of GIDL" unit=""); + parameter real CGIDLD = 0.0 `P(info="Back-bias dependence of GIDL for drain side" unit=""); // Charge model parameters - parameter real COX = 1.0e-14 `from( 0.0,inf ) `P(info="Oxide capacitance for intrinsic channel" unit="F" ); - parameter real CGOV = 1.0e-15 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-drain/source overlap" unit="F" ); - parameter real CGBOV = 0.0 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-bulk overlap" unit="F" ); - parameter real CFR = 0.0 `from( 0.0,inf ) `P(info="Outer fringe capacitance" unit="F" ); + parameter real COX = 1.0e-14 `from( 0.0,inf ) `P(info="Oxide capacitance for intrinsic channel" unit="F"); + parameter real CGOV = 1.0e-15 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-drain/source overlap" unit="F"); + parameter real CGOVD = 1.0e-15 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-drain overlap" unit="F"); + parameter real CGBOV = 0.0 `from( 0.0,inf ) `P(info="Oxide capacitance for gate-bulk overlap" unit="F"); + parameter real CFR = 0.0 `from( 0.0,inf ) `P(info="Outer fringe capacitance" unit="F"); + parameter real CFRD = 0.0 `from( 0.0,inf ) `P(info="Outer fringe capacitance for drain side" unit="F"); // Noise parameters - parameter real FNT = 1.0 `from( 0.0,inf ) `P(info="Thermal noise coefficient" unit="" ); - parameter real NFA = 8.0e+22 `from( 0.0,inf ) `P(info="First coefficient of flicker noise" unit="V^-1/m^4" ); - parameter real NFB = 3.0e+07 `from( 0.0,inf ) `P(info="Second coefficient of flicker noise" unit="V^-1/m^2" ); - parameter real NFC = 0.0 `from( 0.0,inf ) `P(info="Third coefficient of flicker noise" unit="V^-1" ); -`ifdef NQSmodel + parameter real FNT = 1.0 `from( 0.0,inf ) `P(info="Thermal noise coefficient" unit=""); + parameter real FNTEXC = 0.0 `from( 0.0,inf ) `P(info="Excess noise coefficient" unit=""); + parameter real NFA = 8.0e+22 `from( 0.0,inf ) `P(info="First coefficient of flicker noise" unit="V^-1/m^4"); + parameter real NFB = 3.0e+07 `from( 0.0,inf ) `P(info="Second coefficient of flicker noise" unit="V^-1/m^2"); + parameter real NFC = 0.0 `from( 0.0,inf ) `P(info="Third coefficient of flicker noise" unit="V^-1"); + parameter real EF = 1.0 `from( 0.0,inf ) `P(info="Flicker noise frequency exponent" unit=""); +`ifdef NQSmodel // NQS parameters - parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit="" ); - parameter real MUNQS = 1.0 `from( 0.0,inf ) `P(info="Relative mobility for NQS modelling" ); - parameter real RG = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Gate resistance" unit="Ohm" ); - parameter real RBULK = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Bulk resistance between node BP and BI" unit="Ohm" ); - parameter real RWELL = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Well resistance between node BI and B" unit="Ohm" ); - parameter real RJUNS = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm" ); - parameter real RJUND = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm" ); + parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit=""); + parameter real MUNQS = 1.0 `from( 0.0,inf ) `P(info="Relative mobility for NQS modelling"); `endif // NQSmodel + // Parasitic resistance parameters + parameter real RG = 0.0 `from( 0.0,inf ) `P(info="Gate resistance" unit="Ohm"); + parameter real RBULK = 0.0 `from( 0.0,inf ) `P(info="Bulk resistance between node BP and BI" unit="Ohm"); + parameter real RWELL = 0.0 `from( 0.0,inf ) `P(info="Well resistance between node BI and B" unit="Ohm"); + parameter real RJUNS = 0.0 `from( 0.0,inf ) `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm"); + parameter real RJUND = 0.0 `from( 0.0,inf ) `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm"); + // JUNCAP Parameters - parameter real TRJ = 21 `from(`TRJ_cliplow,inf) `P(info="reference temperature" unit="C" ); `include "JUNCAP200_parlist.include" // Other parameters - parameter real DTA = 0.0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K" ); + parameter real DTA = 0.0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K"); // Instance parameters - parameter real ABSOURCE = 1e-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2" ); - parameter real LSSOURCE = 1e-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of source junction" unit="m" ); - parameter real LGSOURCE = 1e-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source junction" unit="m" ); - parameter real ABDRAIN = 1e-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2" ); - parameter real LSDRAIN = 1e-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of drain junction" unit="m" ); - parameter real LGDRAIN = 1e-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of drain junction" unit="m" ); - parameter real AS = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2" ); - parameter real PS = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of source junction" unit="m" ); - parameter real AD = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2" ); - parameter real PD = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of drain junction" unit="m" ); - parameter real JW = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source/drain junction" unit="m" ); - parameter real MULT = 1.0 `from( 0.0,inf ) `P(type="instance" info="Number of devices in parallel" unit="" ); + parameter real DELVTO = 0.0 `P(type="instance" info="Threshold voltage shift parameter" unit="V"); + parameter real FACTUO = 1.0 `from( 0.0,inf ) `P(type="instance" info="Zero-field mobility pre-factor" unit=""); + parameter real ABSOURCE = 1e-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2"); + parameter real LSSOURCE = 1e-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of source junction" unit="m"); + parameter real LGSOURCE = 1e-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source junction" unit="m"); + parameter real ABDRAIN = 1e-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2"); + parameter real LSDRAIN = 1e-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of drain junction" unit="m"); + parameter real LGDRAIN = 1e-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of drain junction" unit="m"); + parameter real AS = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2"); + parameter real PS = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of source junction" unit="m"); + parameter real AD = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2"); + parameter real PD = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of drain junction" unit="m"); + parameter real JW = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source/drain junction" unit="m"); + parameter real MULT = 1.0 `from( 0.0,inf ) `P(type="instance" info="Number of devices in parallel" unit=""); `else // LocalModel `ifdef Binning @@ -225,239 +248,283 @@ branch (NOI) NOIC; /////////////////////////////////////////////////// // Special model parameters - parameter real LEVEL = 1020 `P(info="Model level" unit="" ); - parameter real TYPE = 1.0 `from( -1,1 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" ); + parameter real LEVEL = 1020 `P(info="Model level" unit=""); + + parameter real TYPE = 1.0 `from( -1,1 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit=""); // Reference Temperature - parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" ); + parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C"); // Switch parameters that turn models or effects on or off - parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" ); - parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" ); - parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" ); - parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" ); - parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" ); + parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit=""); + parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit=""); + parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit=""); + parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit=""); + parameter real SWJUNASYM= 0.0 `P(info="Flag for asymmetric junctions; 0=symmetric, 1=asymmetric" unit=""); + parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit=""); // Process Parameters - parameter real LVARO = 0.0 `P(info="Geom. independent difference between actual and programmed gate length" unit="m" ); - parameter real LVARL = 0.0 `P(info="Length dependence of LVAR" unit="" ); - parameter real LVARW = 0.0 `P(info="Width dependence of LVAR" unit="" ); - parameter real LAP = 0.0 `P(info="Effective channel length reduction per side" unit="m" ); - parameter real WVARO = 0.0 `P(info="Geom. independent difference between actual and programmed field-oxide opening" unit="m" ); - parameter real WVARL = 0.0 `P(info="Length dependence of WVAR" unit="" ); - parameter real WVARW = 0.0 `P(info="Width dependence of WVAR" unit="" ); - parameter real WOT = 0.0 `P(info="Effective channel width reduction per side" unit="m" ); - parameter real DLQ = 0.0 `P(info="Effective channel length reduction for CV" unit="m" ); - parameter real DWQ = 0.0 `P(info="Effective channel width reduction for CV" unit="m" ); - parameter real VFBO = -1.0 `P(info="Geometry-independent flat-band voltage at TR" unit="V" ); - parameter real VFBL = 0.0 `P(info="Length dependence of flat-band voltage" unit="" ); - parameter real VFBW = 0.0 `P(info="Width dependence of flat-band voltage" unit="" ); - parameter real VFBLW = 0.0 `P(info="Area dependence of flat-band voltage" unit="" ); - parameter real STVFBO = 5e-4 `P(info="Geometry-independent temperature dependence of VFB" unit="V/K" ); - parameter real STVFBL = 0.0 `P(info="Length dependence of temperature dependence of VFB" unit="" ); - parameter real STVFBW = 0.0 `P(info="Width dependence of temperature dependence of VFB" unit="" ); - parameter real STVFBLW = 0.0 `P(info="Area dependence of temperature dependence of VFB" unit="" ); - parameter real TOXO = 2e-9 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m" ); - parameter real NSUBO = 3e23 `from( 1e20,inf ) `P(info="Geometry independent substrate doping" unit="m^-3" ); - parameter real NSUBW = 0.0 `P(info="Width dependence of background doping NSUBO due to segregation" unit="" ); - parameter real WSEG = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of background doping NSUBO" unit="m" ); - parameter real NPCK = 1e24 `from( 0.0,inf ) `P(info="Pocket doping level" unit="m^-3" ); - parameter real NPCKW = 0.0 `P(info="Width dependence of pocket doping NPCK due to segregation" unit="" ); - parameter real WSEGP = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of pocket doping NPCK" unit="m" ); - parameter real LPCK = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of lateral doping profile" unit="m" ); - parameter real LPCKW = 0.0 `P(info="Width dependence of char. length of lateral doping profile" unit="" ); - parameter real FOL1 = 0.0 `P(info="First length dependence coefficient for short channel body effect" unit="" ); - parameter real FOL2 = 0.0 `P(info="Second length dependence coefficient for short channel body effect" unit="" ); - parameter real VNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V" ); - parameter real NSLPO = 0.05 `P(info="Effective doping bias-dependence parameter" unit="V" ); - parameter real DNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V^-1" ); - parameter real DPHIBO = 0.0 `P(info="Geometry independent offset of PHIB" unit="V" ); - parameter real DPHIBL = 0.0 `P(info="Length dependence offset of PHIB" unit="V" ); - parameter real DPHIBLEXP= 1.0 `P(info="Exponent for length dependence of offset of PHIB" unit="" ); - parameter real DPHIBW = 0.0 `P(info="Width dependence of offset of PHIB" unit="" ); - parameter real DPHIBLW = 0.0 `P(info="Area dependence of offset of PHIB" unit="" ); - parameter real NPO = 1e26 `P(info="Geometry-independent gate poly-silicon doping" unit="m^-3" ); - parameter real NPL = 0.0 `P(info="Length dependence of gate poly-silicon doping" unit="" ); - parameter real CTO = 0.0 `P(info="Geometry-independent interface states factor" unit="" ); - parameter real CTL = 0.0 `P(info="Length dependence of interface states factor" unit="" ); - parameter real CTLEXP = 1.0 `P(info="Exponent for length dependence of interface states factor" unit="" ); - parameter real CTW = 0.0 `P(info="Width dependence of interface states factor" unit="" ); - parameter real CTLW = 0.0 `P(info="Area dependence of interface states factor" unit="" ); - parameter real TOXOVO = 2e-9 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m" ); - parameter real LOV = 0 `from( 0.0,inf ) `P(info="Overlap length for gate/drain and gate/source overlap capacitance" unit="m" ); - parameter real NOVO = 5e25 `P(info="Effective doping of overlap region" unit="m^-3" ); + parameter real LVARO = 0.0 `P(info="Geom. independent difference between actual and programmed gate length" unit="m"); + parameter real LVARL = 0.0 `P(info="Length dependence of LVAR" unit=""); + parameter real LVARW = 0.0 `P(info="Width dependence of LVAR" unit=""); + parameter real LAP = 0.0 `P(info="Effective channel length reduction per side" unit="m"); + parameter real WVARO = 0.0 `P(info="Geom. independent difference between actual and programmed field-oxide opening" unit="m"); + parameter real WVARL = 0.0 `P(info="Length dependence of WVAR" unit=""); + parameter real WVARW = 0.0 `P(info="Width dependence of WVAR" unit=""); + parameter real WOT = 0.0 `P(info="Effective channel width reduction per side" unit="m"); + parameter real DLQ = 0.0 `P(info="Effective channel length reduction for CV" unit="m"); + parameter real DWQ = 0.0 `P(info="Effective channel width reduction for CV" unit="m"); + parameter real VFBO = -1.0 `P(info="Geometry-independent flat-band voltage at TR" unit="V"); + parameter real VFBL = 0.0 `P(info="Length dependence of flat-band voltage" unit=""); + parameter real VFBW = 0.0 `P(info="Width dependence of flat-band voltage" unit=""); + parameter real VFBLW = 0.0 `P(info="Area dependence of flat-band voltage" unit=""); + parameter real STVFBO = 5e-4 `P(info="Geometry-independent temperature dependence of VFB" unit="V/K"); + parameter real STVFBL = 0.0 `P(info="Length dependence of temperature dependence of VFB" unit=""); + parameter real STVFBW = 0.0 `P(info="Width dependence of temperature dependence of VFB" unit=""); + parameter real STVFBLW = 0.0 `P(info="Area dependence of temperature dependence of VFB" unit=""); + parameter real TOXO = 2e-9 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m"); + parameter real EPSROXO = 3.9 `from( 1.0,inf ) `P(info="Relative permittivity of gate dielectric" unit=""); + parameter real NSUBO = 3e23 `from( 1e20,inf ) `P(info="Geometry independent substrate doping" unit="m^-3"); + parameter real NSUBW = 0.0 `P(info="Width dependence of background doping NSUBO due to segregation" unit=""); + parameter real WSEG = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of background doping NSUBO" unit="m"); + parameter real NPCK = 1e24 `from( 0.0,inf ) `P(info="Pocket doping level" unit="m^-3"); + parameter real NPCKW = 0.0 `P(info="Width dependence of pocket doping NPCK due to segregation" unit=""); + parameter real WSEGP = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of pocket doping NPCK" unit="m"); + parameter real LPCK = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of lateral doping profile" unit="m"); + parameter real LPCKW = 0.0 `P(info="Width dependence of char. length of lateral doping profile" unit=""); + parameter real FOL1 = 0.0 `P(info="First length dependence coefficient for short channel body effect" unit=""); + parameter real FOL2 = 0.0 `P(info="Second length dependence coefficient for short channel body effect" unit=""); + parameter real VNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V"); + parameter real NSLPO = 0.05 `P(info="Effective doping bias-dependence parameter" unit="V"); + parameter real DNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V^-1"); + parameter real DPHIBO = 0.0 `P(info="Geometry independent offset of PHIB" unit="V"); + parameter real DPHIBL = 0.0 `P(info="Length dependence offset of PHIB" unit="V"); + parameter real DPHIBLEXP= 1.0 `P(info="Exponent for length dependence of offset of PHIB" unit=""); + parameter real DPHIBW = 0.0 `P(info="Width dependence of offset of PHIB" unit=""); + parameter real DPHIBLW = 0.0 `P(info="Area dependence of offset of PHIB" unit=""); + parameter real NPO = 1e26 `P(info="Geometry-independent gate poly-silicon doping" unit="m^-3"); + parameter real NPL = 0.0 `P(info="Length dependence of gate poly-silicon doping" unit=""); + parameter real CTO = 0.0 `P(info="Geometry-independent interface states factor" unit=""); + parameter real CTL = 0.0 `P(info="Length dependence of interface states factor" unit=""); + parameter real CTLEXP = 1.0 `P(info="Exponent for length dependence of interface states factor" unit=""); + parameter real CTW = 0.0 `P(info="Width dependence of interface states factor" unit=""); + parameter real CTLW = 0.0 `P(info="Area dependence of interface states factor" unit=""); + parameter real TOXOVO = 2e-9 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m"); + parameter real TOXOVDO = 2e-9 `from( 1e-10,inf ) `P(info="Overlap oxide thickness for drain side" unit="m"); + parameter real LOV = 0 `from( 0.0,inf ) `P(info="Overlap length for gate/drain and gate/source overlap capacitance" unit="m"); + parameter real LOVD = 0 `from( 0.0,inf ) `P(info="Overlap length for gate/drain overlap capacitance" unit="m"); + parameter real NOVO = 5e25 `P(info="Effective doping of overlap region" unit="m^-3"); + parameter real NOVDO = 5e25 `P(info="Effective doping of overlap region for drain side" unit="m^-3"); // DIBL Parameters - parameter real CFL = 0.0 `P(info="Length dependence of DIBL-parameter" unit="V^-1" ); - parameter real CFLEXP = 2.0 `P(info="Exponent for length dependence of CF" unit="" ); - parameter real CFW = 0.0 `P(info="Width dependence of CF" unit="" ); - parameter real CFBO = 0.0 `P(info="Back-bias dependence of CF" unit="V^-1" ); + parameter real CFL = 0.0 `P(info="Length dependence of DIBL-parameter" unit=""); + parameter real CFLEXP = 2.0 `P(info="Exponent for length dependence of CF" unit=""); + parameter real CFW = 0.0 `P(info="Width dependence of CF" unit=""); + parameter real CFBO = 0.0 `P(info="Back-bias dependence of CF" unit="V^-1"); // Mobility Parameters - parameter real UO = 5e-2 `P(info="Zero-field mobility at TR" unit="m^2/V/s" ); - parameter real FBET1 = 0.0 `P(info="Relative mobility decrease due to first lateral profile" unit="" ); - parameter real FBET1W = 0.0 `P(info="Width dependence of relative mobility decrease due to first lateral profile" unit="" ); - parameter real LP1 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of first lateral profile" unit="m" ); - parameter real LP1W = 0.0 `P(info="Width dependence of mobility-related characteristic length of first lateral profile" unit="" ); - parameter real FBET2 = 0.0 `P(info="Relative mobility decrease due to second lateral profile" unit="" ); - parameter real LP2 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of second lateral profile" unit="m" ); - parameter real BETW1 = 0.0 `P(info="First higher-order width scaling coefficient of BETN" unit="" ); - parameter real BETW2 = 0.0 `P(info="Second higher-order width scaling coefficient of BETN" unit="" ); - parameter real WBET = 1e-9 `from( 1e-10,inf ) `P(info="Characteristic width for width scaling of BETN" unit="m" ); - parameter real STBETO = 1.0 `P(info="Geometry independent temperature dependence of BETN" unit="" ); - parameter real STBETL = 0.0 `P(info="Length dependence of temperature dependence of BETN" unit="" ); - parameter real STBETW = 0.0 `P(info="Width dependence of temperature dependence of BETN" unit="" ); - parameter real STBETLW = 0.0 `P(info="Area dependence of temperature dependence of BETN" unit="" ); - parameter real MUEO = 0.5 `P(info="Geometry independent mobility reduction coefficient at TR" unit="m/V" ); - parameter real MUEW = 0.0 `P(info="Width dependence of mobility reduction coefficient at TR" unit="" ); - parameter real STMUEO = 0.0 `P(info="Temperature dependence of MUE" unit="" ); - parameter real THEMUO = 1.5 `P(info="Mobility reduction exponent at TR" unit="" ); - parameter real STTHEMUO = 1.5 `P(info="Temperature dependence of THEMU" unit="" ); - parameter real CSO = 0.0 `P(info="Geometry independent coulomb scattering parameter at TR" unit="" ); - parameter real CSL = 0.0 `P(info="Length dependence of CS" unit="" ); - parameter real CSLEXP = 0.0 `P(info="Exponent for length dependence of CS" unit="" ); - parameter real CSW = 0.0 `P(info="Width dependence of CS" unit="" ); - parameter real CSLW = 0.0 `P(info="Area dependence of CS" unit="" ); - parameter real STCSO = 0.0 `P(info="Temperature dependence of CS" unit="" ); - parameter real XCORO = 0.0 `P(info="Geometry independent non-universality parameter" unit="V^-1" ); - parameter real XCORL = 0.0 `P(info="Length dependence of non-universality parameter" unit="" ); - parameter real XCORW = 0.0 `P(info="Width dependence of non-universality parameter" unit="" ); - parameter real XCORLW = 0.0 `P(info="Area dependence of non-universality parameter" unit="" ); - parameter real STXCORO = 0.0 `P(info="Temperature dependence of XCOR" unit="" ); - parameter real FETAO = 1.0 `P(info="Effective field parameter" unit="" ); + parameter real UO = 5e-2 `P(info="Zero-field mobility at TR" unit="m^2/V/s"); + parameter real FBET1 = 0.0 `P(info="Relative mobility decrease due to first lateral profile" unit=""); + parameter real FBET1W = 0.0 `P(info="Width dependence of relative mobility decrease due to first lateral profile" unit=""); + parameter real LP1 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of first lateral profile" unit="m"); + parameter real LP1W = 0.0 `P(info="Width dependence of mobility-related characteristic length of first lateral profile" unit=""); + parameter real FBET2 = 0.0 `P(info="Relative mobility decrease due to second lateral profile" unit=""); + parameter real LP2 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of second lateral profile" unit="m"); + parameter real BETW1 = 0.0 `P(info="First higher-order width scaling coefficient of BETN" unit=""); + parameter real BETW2 = 0.0 `P(info="Second higher-order width scaling coefficient of BETN" unit=""); + parameter real WBET = 1e-9 `from( 1e-10,inf ) `P(info="Characteristic width for width scaling of BETN" unit="m"); + parameter real STBETO = 1.0 `P(info="Geometry independent temperature dependence of BETN" unit=""); + parameter real STBETL = 0.0 `P(info="Length dependence of temperature dependence of BETN" unit=""); + parameter real STBETW = 0.0 `P(info="Width dependence of temperature dependence of BETN" unit=""); + parameter real STBETLW = 0.0 `P(info="Area dependence of temperature dependence of BETN" unit=""); + parameter real MUEO = 0.5 `P(info="Geometry independent mobility reduction coefficient at TR" unit="m/V"); + parameter real MUEW = 0.0 `P(info="Width dependence of mobility reduction coefficient at TR" unit=""); + parameter real STMUEO = 0.0 `P(info="Temperature dependence of MUE" unit=""); + parameter real THEMUO = 1.5 `P(info="Mobility reduction exponent at TR" unit=""); + parameter real STTHEMUO = 1.5 `P(info="Temperature dependence of THEMU" unit=""); + parameter real CSO = 0.0 `P(info="Geometry independent coulomb scattering parameter at TR" unit=""); + parameter real CSL = 0.0 `P(info="Length dependence of CS" unit=""); + parameter real CSLEXP = 0.0 `P(info="Exponent for length dependence of CS" unit=""); + parameter real CSW = 0.0 `P(info="Width dependence of CS" unit=""); + parameter real CSLW = 0.0 `P(info="Area dependence of CS" unit=""); + parameter real STCSO = 0.0 `P(info="Temperature dependence of CS" unit=""); + parameter real XCORO = 0.0 `P(info="Geometry independent non-universality parameter" unit="V^-1"); + parameter real XCORL = 0.0 `P(info="Length dependence of non-universality parameter" unit=""); + parameter real XCORW = 0.0 `P(info="Width dependence of non-universality parameter" unit=""); + parameter real XCORLW = 0.0 `P(info="Area dependence of non-universality parameter" unit=""); + parameter real STXCORO = 0.0 `P(info="Temperature dependence of XCOR" unit=""); + parameter real FETAO = 1.0 `P(info="Effective field parameter" unit=""); // Series Resistance - parameter real RSW1 = 2.5e3 `P(info="Source/drain series resistance for 1 um wide channel at TR" unit="Ohm" ); - parameter real RSW2 = 0.0 `P(info="Higher-order width scaling of RS" unit="" ); - parameter real STRSO = 1.0 `P(info="Temperature dependence of RS" unit="" ); - parameter real RSBO = 0.0 `P(info="Back-bias dependence of series resistance" unit="V^-1" ); - parameter real RSGO = 0.0 `P(info="Gate-bias dependence of series resistance" unit="V^-1" ); + parameter real RSW1 = 2.5e3 `P(info="Source/drain series resistance for 1 um wide channel at TR" unit="Ohm"); + parameter real RSW2 = 0.0 `P(info="Higher-order width scaling of RS" unit=""); + parameter real STRSO = 1.0 `P(info="Temperature dependence of RS" unit=""); + parameter real RSBO = 0.0 `P(info="Back-bias dependence of series resistance" unit="V^-1"); + parameter real RSGO = 0.0 `P(info="Gate-bias dependence of series resistance" unit="V^-1"); // Velocity Saturation - parameter real THESATO = 0.0 `P(info="Geometry independent velocity saturation parameter at TR" unit="V^-1" ); - parameter real THESATL = 0.05 `P(info="Length dependence of THESAT" unit="V^-1" ); - parameter real THESATLEXP= 1.0 `P(info="Exponent for length dependence of THESAT" unit="" ); - parameter real THESATW = 0.0 `P(info="Width dependence of velocity saturation parameter" unit="" ); - parameter real THESATLW = 0.0 `P(info="Area dependence of velocity saturation parameter" unit="" ); - parameter real STTHESATO= 1.0 `P(info="Geometry independent temperature dependence of THESAT" unit="" ); - parameter real STTHESATL= 0.0 `P(info="Length dependence of temperature dependence of THESAT" unit="" ); - parameter real STTHESATW= 0.0 `P(info="Width dependence of temperature dependence of THESAT" unit="" ); - parameter real STTHESATLW= 0.0 `P(info="Area dependence of temperature dependence of THESAT" unit="" ); - parameter real THESATBO = 0.0 `P(info="Back-bias dependence of velocity saturation" unit="V^-1" ); - parameter real THESATGO = 0.0 `P(info="Gate-bias dependence of velocity saturation" unit="V^-1" ); + parameter real THESATO = 0.0 `P(info="Geometry independent velocity saturation parameter at TR" unit="V^-1"); + parameter real THESATL = 0.05 `P(info="Length dependence of THESAT" unit="V^-1"); + parameter real THESATLEXP= 1.0 `P(info="Exponent for length dependence of THESAT" unit=""); + parameter real THESATW = 0.0 `P(info="Width dependence of velocity saturation parameter" unit=""); + parameter real THESATLW = 0.0 `P(info="Area dependence of velocity saturation parameter" unit=""); + parameter real STTHESATO= 1.0 `P(info="Geometry independent temperature dependence of THESAT" unit=""); + parameter real STTHESATL= 0.0 `P(info="Length dependence of temperature dependence of THESAT" unit=""); + parameter real STTHESATW= 0.0 `P(info="Width dependence of temperature dependence of THESAT" unit=""); + parameter real STTHESATLW= 0.0 `P(info="Area dependence of temperature dependence of THESAT" unit=""); + parameter real THESATBO = 0.0 `P(info="Back-bias dependence of velocity saturation" unit="V^-1"); + parameter real THESATGO = 0.0 `P(info="Gate-bias dependence of velocity saturation" unit="V^-1"); // Saturation Voltage - parameter real AXO = 18 `P(info="Geometry independent linear/saturation transition factor" unit="" ); - parameter real AXL = 0.4 `from( 0.0,inf ) `P(info="Length dependence of AX" unit="" ); + parameter real AXO = 18 `P(info="Geometry independent linear/saturation transition factor" unit=""); + parameter real AXL = 0.4 `from( 0.0,inf ) `P(info="Length dependence of AX" unit=""); // Channel Length Modulation - parameter real ALPL = 5e-4 `P(info="Length dependence of ALP" unit="" ); - parameter real ALPLEXP = 1.0 `P(info="Exponent for length dependence of ALP" unit="" ); - parameter real ALPW = 0.0 `P(info="Width dependence of ALP" unit="" ); - parameter real ALP1L1 = 0.0 `P(info="Length dependence of CLM enhancement factor above threshold" unit="V" ); - parameter real ALP1LEXP = 0.5 `P(info="Exponent for length dependence of ALP1" unit="" ); - parameter real ALP1L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP1" unit="" ); - parameter real ALP1W = 0.0 `P(info="Width dependence of ALP1" unit="" ); - parameter real ALP2L1 = 0.0 `P(info="Length dependence of CLM enhancement factor below threshold" unit="V^-1" ); - parameter real ALP2LEXP = 0.5 `P(info="Exponent for length dependence of ALP2" unit="" ); - parameter real ALP2L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP2" unit="" ); - parameter real ALP2W = 0.0 `P(info="Width dependence of ALP2" unit="" ); - parameter real VPO = 0.05 `P(info="CLM logarithmic dependence parameter" unit="V" ); + parameter real ALPL = 5e-4 `P(info="Length dependence of ALP" unit=""); + parameter real ALPLEXP = 1.0 `P(info="Exponent for length dependence of ALP" unit=""); + parameter real ALPW = 0.0 `P(info="Width dependence of ALP" unit=""); + parameter real ALP1L1 = 0.0 `P(info="Length dependence of CLM enhancement factor above threshold" unit="V"); + parameter real ALP1LEXP = 0.5 `P(info="Exponent for length dependence of ALP1" unit=""); + parameter real ALP1L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP1" unit=""); + parameter real ALP1W = 0.0 `P(info="Width dependence of ALP1" unit=""); + parameter real ALP2L1 = 0.0 `P(info="Length dependence of CLM enhancement factor below threshold" unit="V^-1"); + parameter real ALP2LEXP = 0.5 `P(info="Exponent for length dependence of ALP2" unit=""); + parameter real ALP2L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP2" unit=""); + parameter real ALP2W = 0.0 `P(info="Width dependence of ALP2" unit=""); + parameter real VPO = 0.05 `P(info="CLM logarithmic dependence parameter" unit="V"); // Weak-avalanche parameters - parameter real A1O = 1.0 `P(info="Geometry independent impact-ionization pre-factor" unit="" ); - parameter real A1L = 0.0 `P(info="Length dependence of A1" unit="" ); - parameter real A1W = 0.0 `P(info="Width dependence of A1" unit="" ); - parameter real A2O = 10 `P(info="Impact-ionization exponent at TR" unit="V" ); - parameter real STA2O = 0.0 `P(info="Temperature dependence of A2" unit="V" ); - parameter real A3O = 1.0 `P(info="Geometry independent saturation-voltage dependence of II" unit="" ); - parameter real A3L = 0.0 `P(info="Length dependence of A3" unit="" ); - parameter real A3W = 0.0 `P(info="Width dependence of A3" unit="" ); - parameter real A4O = 0.0 `P(info="Geometry independent back-bias dependence of II" unit="V^-0.5" ); - parameter real A4L = 0.0 `P(info="Length dependence of A4" unit="" ); - parameter real A4W = 0.0 `P(info="Width dependence of A4" unit="" ); + parameter real A1O = 1.0 `P(info="Geometry independent impact-ionization pre-factor" unit=""); + parameter real A1L = 0.0 `P(info="Length dependence of A1" unit=""); + parameter real A1W = 0.0 `P(info="Width dependence of A1" unit=""); + parameter real A2O = 10 `P(info="Impact-ionization exponent at TR" unit="V"); + parameter real STA2O = 0.0 `P(info="Temperature dependence of A2" unit="V"); + parameter real A3O = 1.0 `P(info="Geometry independent saturation-voltage dependence of II" unit=""); + parameter real A3L = 0.0 `P(info="Length dependence of A3" unit=""); + parameter real A3W = 0.0 `P(info="Width dependence of A3" unit=""); + parameter real A4O = 0.0 `P(info="Geometry independent back-bias dependence of II" unit="V^-0.5"); + parameter real A4L = 0.0 `P(info="Length dependence of A4" unit=""); + parameter real A4W = 0.0 `P(info="Width dependence of A4" unit=""); // Gate current parameters - parameter real GCOO = 0.0 `P(info="Gate tunnelling energy adjustment" unit="" ); - parameter real IGINVLW = 0.0 `P(info="Gate channel current pre-factor for 1 um^2 channel area" unit="A" ); - parameter real IGOVW = 0.0 `P(info="Gate overlap current pre-factor for 1 um wide channel" unit="A" ); - parameter real STIGO = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit="" ); - parameter real GC2O = 0.375 `P(info="Gate current slope factor" unit="" ); - parameter real GC3O = 0.063 `P(info="Gate current curvature factor" unit="" ); - parameter real CHIBO = 3.1 `P(info="Tunnelling barrier height" unit="V" ); + parameter real GCOO = 0.0 `P(info="Gate tunnelling energy adjustment" unit=""); + parameter real IGINVLW = 0.0 `P(info="Gate channel current pre-factor for 1 um^2 channel area" unit="A"); + parameter real IGOVW = 0.0 `P(info="Gate overlap current pre-factor for 1 um wide channel" unit="A"); + parameter real IGOVDW = 0.0 `P(info="Gate overlap current pre-factor for 1 um wide channel for drain side" unit="A"); + parameter real STIGO = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit=""); + parameter real GC2O = 0.375 `P(info="Gate current slope factor" unit=""); + parameter real GC3O = 0.063 `P(info="Gate current curvature factor" unit=""); + parameter real CHIBO = 3.1 `P(info="Tunnelling barrier height" unit="V"); // Gate-induced drain leakage parameters - parameter real AGIDLW = 0.0 `P(info="Width dependence of GIDL pre-factor" unit="A/V^3" ); - parameter real BGIDLO = 41 `P(info="GIDL probability factor at TR" unit="V" ); - parameter real STBGIDLO = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K" ); - parameter real CGIDLO = 0.0 `P(info="Back-bias dependence of GIDL" unit="" ); + parameter real AGIDLW = 0.0 `P(info="Width dependence of GIDL pre-factor" unit="A/V^3"); + parameter real AGIDLDW = 0.0 `P(info="Width dependence of GIDL pre-factor for drain side" unit="A/V^3"); + parameter real BGIDLO = 41 `P(info="GIDL probability factor at TR" unit="V"); + parameter real BGIDLDO = 41 `P(info="GIDL probability factor at TR for drain side" unit="V"); + parameter real STBGIDLO = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K"); + parameter real STBGIDLDO= 0.0 `P(info="Temperature dependence of BGIDL for drain side" unit="V/K"); + parameter real CGIDLO = 0.0 `P(info="Back-bias dependence of GIDL" unit=""); + parameter real CGIDLDO = 0.0 `P(info="Back-bias dependence of GIDL for drain side" unit=""); // Charge Model Parameters - parameter real CGBOVL = 0.0 `P(info="Oxide capacitance for gate-bulk overlap for 1 um^2 area" unit="F" ); - parameter real CFRW = 0.0 `P(info="Outer fringe capacitance for 1 um wide channel" unit="F" ); + parameter real CGBOVL = 0.0 `P(info="Oxide capacitance for gate-bulk overlap for 1 um long channel" unit="F"); + parameter real CFRW = 0.0 `P(info="Outer fringe capacitance for 1 um wide channel" unit="F"); + parameter real CFRDW = 0.0 `P(info="Outer fringe capacitance for 1 um wide channel for drain side" unit="F"); // Noise Model Parameters - parameter real FNTO = 1.0 `P(info="Thermal noise coefficient" unit="" ); - parameter real NFALW = 8e22 `P(info="First coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^4" ); - parameter real NFBLW = 3e7 `P(info="Second coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^2" ); - parameter real NFCLW = 0.0 `P(info="Third coefficient of flicker noise for 1 um^2 channel area" unit="V^-1" ); + parameter real FNTO = 1.0 `P(info="Thermal noise coefficient" unit=""); + parameter real FNTEXCL = 0.0 `from( 0.0,inf ) `P(info="Length dependence coefficient of excess noise" unit=""); + parameter real NFALW = 8e22 `P(info="First coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^4"); + parameter real NFBLW = 3e7 `P(info="Second coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^2"); + parameter real NFCLW = 0.0 `P(info="Third coefficient of flicker noise for 1 um^2 channel area" unit="V^-1"); + parameter real EFO = 1.0 `P(info="Flicker noise frequency exponent" unit=""); + parameter real LINTNOI = 0.0 `P(info="Length offset for flicker noise" unit="m"); + parameter real ALPNOI = 2.0 `P(info="Exponent for length offset for flicker noise" unit=""); // Other Parameters - parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient circuit temperature" unit="K" ); + parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient circuit temperature" unit="K"); + + // Well proximity effect Parameters + parameter real KVTHOWEO = 0 `P(info="Geometrical independent threshold shift parameter" unit=""); + parameter real KVTHOWEL = 0 `P(info="Length dependent threshold shift parameter" unit=""); + parameter real KVTHOWEW = 0 `P(info="Width dependent threshold shift parameter" unit=""); + parameter real KVTHOWELW= 0 `P(info="Area dependent threshold shift parameter" unit=""); + parameter real KUOWEO = 0 `P(info="Geometrical independent mobility degradation factor" unit=""); + parameter real KUOWEL = 0 `P(info="Length dependent mobility degradation factor" unit=""); + parameter real KUOWEW = 0 `P(info="Width dependent mobility degradation factor" unit=""); + parameter real KUOWELW = 0 `P(info="Area dependent mobility degradation factor" unit=""); `endif // Binning `ifdef NQSmodel - - // NQS parameters - parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit="" ); - parameter real MUNQSO = 1.0 `P(info="Relative mobility for NQS modelling" ); - parameter real RGO = 1.0e-3 `P(info="Gate resistance" ); - parameter real RBULKO = 1.0e-3 `P(info="Bulk resistance between node BP and BI" unit="Ohm" ); - parameter real RWELLO = 1.0e-3 `P(info="Well resistance between node BI and B" unit="Ohm" ); - parameter real RJUNSO = 1.0e-3 `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm" ); - parameter real RJUNDO = 1.0e-3 `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm" ); + parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit=""); + parameter real MUNQSO = 1.0 `P(info="Relative mobility for NQS modelling"); `endif // NQSmodel + // Parasitic resistance parameters + parameter real RGO = 0.0 `P(info="Gate resistance" unit="Ohm"); + parameter real RBULKO = 0.0 `P(info="Bulk resistance between node BP and BI" unit="Ohm"); + parameter real RWELLO = 0.0 `P(info="Well resistance between node BI and B" unit="Ohm"); + parameter real RJUNSO = 0.0 `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm"); + parameter real RJUNDO = 0.0 `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm"); + parameter real RINT = 0.0 `from( 0.0,inf ) `P(info="Contact resistance between silicide and ploy" unit="Ohm/Sqr"); + parameter real RVPOLY = 0.0 `from( 0.0,inf ) `P(info="Vertical poly resistance" unit="Ohm/Sqr"); + parameter real RSHG = 0.0 `from( 0.0,inf ) `P(info="Gate electrode diffusion sheet resistance" unit="Ohm/Sqr"); + parameter real DLSIL = 0.0 `P(info="Silicide extension over the physical gate length" unit="m"); + // Stress Model Parameters - parameter real SAREF = 1.0e-6 `from( 1e-9,inf ) `P(info="Reference distance beteen OD-edge to poly from one side" unit="m" ); - parameter real SBREF = 1.0e-6 `from( 1e-9,inf ) `P(info="Reference distance beteen OD-edge to poly from other side" unit="m" ); - parameter real WLOD = 0 `P(info="Width parameter" unit="m" ); - parameter real KUO = 0 `P(info="Mobility degradation/enhancement coefficient" unit="m" ); - parameter real KVSAT = 0 `from( -1.0,1.0 ) `P(info="Saturation velocity degradation/enhancement coefficient" unit="m" ); - parameter real TKUO = 0 `P(info="Temperature dependence of KUO" unit="" ); - parameter real LKUO = 0 `P(info="Length dependence of KUO" unit="m^LLODKUO" ); - parameter real WKUO = 0 `P(info="Width dependence of KUO" unit="m^WLODKUO" ); - parameter real PKUO = 0 `P(info="Cross-term dependence of KUO" unit="m^(LLODKUO+WLODKUO)" ); - parameter real LLODKUO = 0 `from( 0.0,inf ) `P(info="Length parameter for UO stress effect" unit="" ); - parameter real WLODKUO = 0 `from( 0.0,inf ) `P(info="Width parameter for UO stress effect" unit="" ); - parameter real KVTHO = 0 `P(info="Threshold shift parameter" unit="Vm" ); - parameter real LKVTHO = 0 `P(info="Length dependence of KVTHO" unit="m^LLODVTH" ); - parameter real WKVTHO = 0 `P(info="Width dependence of KVTHO" unit="m^WLODVTH" ); - parameter real PKVTHO = 0 `P(info="Cross-term dependence of KVTHO" unit="m^(LLODVTH+WLODVTH)" ); - parameter real LLODVTH = 0 `from( 0.0,inf ) `P(info="Length parameter for VTH-stress effect" unit="" ); - parameter real WLODVTH = 0 `from( 0.0,inf ) `P(info="Width parameter for VTH-stress effect" unit="" ); - parameter real STETAO = 0 `P(info="eta0 shift factor related to VTHO change" unit="m" ); - parameter real LODETAO = 1.0 `from( 0.0,inf ) `P(info="eta0 shift modifaction factor for stress effect" unit="" ); + parameter real SAREF = 1.0e-6 `from( 1e-9,inf ) `P(info="Reference distance between OD-edge and poly from one side" unit="m"); + parameter real SBREF = 1.0e-6 `from( 1e-9,inf ) `P(info="Reference distance between OD-edge and poly from other side" unit="m"); + parameter real WLOD = 0 `P(info="Width parameter" unit="m"); + parameter real KUO = 0 `P(info="Mobility degradation/enhancement coefficient" unit="m"); + parameter real KVSAT = 0 `from( -1.0,1.0 ) `P(info="Saturation velocity degradation/enhancement coefficient" unit="m"); + parameter real TKUO = 0 `P(info="Temperature dependence of KUO" unit=""); + parameter real LKUO = 0 `P(info="Length dependence of KUO" unit="m^LLODKUO"); + parameter real WKUO = 0 `P(info="Width dependence of KUO" unit="m^WLODKUO"); + parameter real PKUO = 0 `P(info="Cross-term dependence of KUO" unit="m^(LLODKUO+WLODKUO)"); + parameter real LLODKUO = 0 `from( 0.0,inf ) `P(info="Length parameter for UO stress effect" unit=""); + parameter real WLODKUO = 0 `from( 0.0,inf ) `P(info="Width parameter for UO stress effect" unit=""); + parameter real KVTHO = 0 `P(info="Threshold shift parameter" unit="Vm"); + parameter real LKVTHO = 0 `P(info="Length dependence of KVTHO" unit="m^LLODVTH"); + parameter real WKVTHO = 0 `P(info="Width dependence of KVTHO" unit="m^WLODVTH"); + parameter real PKVTHO = 0 `P(info="Cross-term dependence of KVTHO" unit="m^(LLODVTH+WLODVTH)"); + parameter real LLODVTH = 0 `from( 0.0,inf ) `P(info="Length parameter for VTH-stress effect" unit=""); + parameter real WLODVTH = 0 `from( 0.0,inf ) `P(info="Width parameter for VTH-stress effect" unit=""); + parameter real STETAO = 0 `P(info="eta0 shift factor related to VTHO change" unit="m"); + parameter real LODETAO = 1.0 `from( 0.0,inf ) `P(info="eta0 shift modification factor for stress effect" unit=""); + + // Well proximity effect Parameters + parameter real SCREF = 1e-6 `from( 0.0,inf ) `P(info="Distance between OD-edge and well edge of a reference device" unit="m"); + parameter real WEB = 0 `P(info="Coefficient for SCB" unit=""); + parameter real WEC = 0 `P(info="Coefficient for SCC" unit=""); // JUNCAP Parameters - parameter real TRJ = 21 `from(`TRJ_cliplow,inf) `P(info="reference temperature" unit="C"); `include "JUNCAP200_parlist.include" // Instance parameters - parameter real L = 10e-6 `from( 1e-9,inf ) `P(type="instance" info="Design length" unit="m" ); - parameter real W = 10e-6 `from( 1e-9,inf ) `P(type="instance" info="Design width" unit="m" ); - parameter real SA = 0.0 `P(type="instance" info="Distance beteen OD-edge to poly from one side" unit="m" ); - parameter real SB = 0.0 `P(type="instance" info="Distance beteen OD-edge to poly from other side" unit="m" ); - parameter real ABSOURCE = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2" ); - parameter real LSSOURCE = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of source junction" unit="m" ); - parameter real LGSOURCE = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source junction" unit="m" ); - parameter real ABDRAIN = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2" ); - parameter real LSDRAIN = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of drain junction" unit="m" ); - parameter real LGDRAIN = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of drain junction" unit="m" ); - parameter real AS = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2" ); - parameter real PS = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of source junction" unit="m" ); - parameter real AD = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2" ); - parameter real PD = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of drain junction" unit="m" ); - parameter real MULT = 1.0 `from( 0.0,inf ) `P(type="instance" info="Number of devices in parallel" unit="" ); + parameter real L = 10e-6 `from( 1e-9,inf ) `P(type="instance" info="Design length" unit="m"); + parameter real W = 10e-6 `from( 1e-9,inf ) `P(type="instance" info="Design width" unit="m"); + parameter real SA = 0.0 `P(type="instance" info="Distance between OD-edge and poly from one side" unit="m"); + parameter real SB = 0.0 `P(type="instance" info="Distance between OD-edge and poly from other side" unit="m"); + parameter real SD = 0.0 `P(type="instance" info="Distance between neighbouring fingers" unit="m"); + parameter real SCA = 0.0 `from( 0.0,inf ) `P(type="instance" info="Integral of the first distribution function for scattered well dopants" unit=""); + parameter real SCB = 0.0 `from( 0.0,inf ) `P(type="instance" info="Integral of the second distribution function for scattered well dopants" unit=""); + parameter real SCC = 0.0 `from( 0.0,inf ) `P(type="instance" info="Integral of the third distribution function for scattered well dopants" unit=""); + parameter real SC = 0.0 `P(type="instance" info="Distance between OD-edge and nearest well edge" unit="m"); + parameter real DELVTO = 0.0 `P(type="instance" info="Threshold voltage shift parameter" unit="V"); + parameter real FACTUO = 1.0 `from( 0.0,inf ) `P(type="instance" info="Zero-field mobility pre-factor" unit=""); + parameter real ABSOURCE = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2"); + parameter real LSSOURCE = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of source junction" unit="m"); + parameter real LGSOURCE = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of source junction" unit="m"); + parameter real ABDRAIN = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2"); + parameter real LSDRAIN = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="STI-edge length of drain junction" unit="m"); + parameter real LGDRAIN = 1E-6 `from(`LG_cliplow,inf) `P(type="instance" info="Gate-edge length of drain junction" unit="m"); + parameter real AS = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of source junction" unit="m^2"); + parameter real PS = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of source junction" unit="m"); + parameter real AD = 1E-12 `from(`AB_cliplow,inf) `P(type="instance" info="Bottom area of drain junction" unit="m^2"); + parameter real PD = 1E-6 `from(`LS_cliplow,inf) `P(type="instance" info="Perimeter of drain junction" unit="m"); + parameter real MULT = 1.0 `from( 0.0,inf ) `P(type="instance" info="Number of devices in parallel" unit=""); + parameter real NF = 1.0 `from( 1.0,inf ) `P(type="instance" info="Number of fingers" unit=""); + parameter real NGCON = 1.0 `from( 1.0,2.0 ) `P(type="instance" info="Number of gate contacts" unit=""); + parameter real XGW = 1.0E-7 `P(type="instance" info="Distance from the gate contact to the channel edge" unit="m"); ////////////////////////// // @@ -466,7 +533,7 @@ branch (NOI) NOIC; ////////////////////////// // Variables for geometrical scaling rules - real L_i, W_i, SA_i, SB_i; + real L_i, W_i, L_f, L_slif, W_f, SA_i, SB_i, SD_i, SC_i; real LEN, WEN, iL, iW, delLPS, delWOD, LE, WE, iLE, iWE, Lcv, Wcv, LEcv, WEcv; `ifdef Binning @@ -476,54 +543,72 @@ branch (NOI) NOIC; real iLcv, iiLcv, iiWcv, iiLWcv, iiiLWcv; `else // Binning // Intermediate variables used for geometry-scaling - real NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, LOV_i; + real NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, LOV_i, LOVD_i; real LP1_i, LP2_i, WBET_i, AXL_i, ALP1L2_i, ALP2L2_i; real NSUB, AA, BB, NSUB0e, NPCKe, LPCKe; real FBET1e, LP1e, GPE, GWE, tmpx; + real Lnoi, Lred; `endif // Binning // List of local parameters - real VFB, STVFB, TOX, NEFF, VNSUB, NSLP, DNSUB, DPHIB, NP, CT; - real TOXOV, NOV, CF, CFB; + real VFB, STVFB, TOX, EPSROX, NEFF, VNSUB, NSLP, DNSUB, DPHIB, NP, CT; + real TOXOV, TOXOVD, NOV, NOVD, CF, CFB; real BETN, STBET, MUE, STMUE, THEMU, STTHEMU, CS, STCS, XCOR, STXCOR, FETA; real RS, STRS, RSB, RSG; real THESAT, STTHESAT, THESATB, THESATG; real AX; real ALP, ALP1, ALP2, VP; real A1, A2, STA2, A3, A4; - real GCO, IGINV, IGOV, STIG, GC2, GC3, CHIB; + real GCO, IGINV, IGOV, IGOVD, STIG, GC2, GC3, CHIB; real AGIDL, BGIDL, STBGIDL, CGIDL; - real COX, CGOV, CGBOV, CFR; - real FNT, NFA, NFB, NFC; + real AGIDLD, BGIDLD, CGIDLD, STBGIDLD; + real COX, CGOV, CGBOV, CGOVD, CFR, CFRD; + real FNT, NFA, NFB, NFC, EF; + real FNTEXC; `ifdef NQSmodel - real MUNQS, RG, RBULK, RWELL, RJUNS, RJUND; + real MUNQS; `endif // NQSmodel + real RG, RBULK, RWELL, RJUNS, RJUND; + + real NF_i, invNF; + real RINT_i, RVPOLY_i, RSHG_i, NGCON_i, XGW_i, XGWE; // Variables for stress-model real SAREF_i, SBREF_i, KVSAT_i, LLODKUO_i, WLODKUO_i, LLODVTH_i, WLODVTH_i, LODETAO_i; real Invsa, Invsb, Invsaref, Invsbref, Kstressu0, rhobeta, rhobetaref, Kstressvth0; - real temp0, templ, tempw, Lx, Wx; + real temp0, temp00, templ, tempw, Lx, Wx; + real loop, tmpa, tmpb; + + // Variables for well proximity effect model + real SCA_i, SCB_i, SCC_i, SCREF_i, WEB_i, WEC_i, KVTHOWE, KUOWE; `endif // LocalModel +real ABS_i, LSS_i, LGS_i, ABD_i, LSD_i, LGD_i; + // Variables used in electrical equations -real VFB_i, STVFB_i, TOX_i, NEFF_i, VNSUB_i, NSLP_i, DNSUB_i, NP_i, QMC_i, CT_i, TOXOV_i, NOV_i; +real FACTUO_i, DELVTO_i, VFB_i, STVFB_i, TOX_i, EPSROX_i, NEFF_i, VNSUB_i, NSLP_i, DNSUB_i, NP_i, QMC_i, CT_i, TOXOV_i, TOXOVD_i, NOV_i, NOVD_i; real CF_i, CFB_i, DPHIB_i; -real BET_i, STBET_i, MUE_i, STMUE_i, THEMU_i, STTHEMU_i, CS_i, STCS_i, XCOR_i, STXCOR_i, FETA_i; +real BETN_i, STBET_i, MUE_i, STMUE_i, THEMU_i, STTHEMU_i, CS_i, STCS_i, XCOR_i, STXCOR_i, FETA_i; real RS_i, THER_i, STRS_i, RSB_i, RSG_i; real THESAT_i, STTHESAT_i, THESATB_i, THESATG_i; real AX_i, ALP_i, ALP1_i, ALP2_i, VP_i; real A1_i, A2_i, STA2_i, A3_i, A4_i; -real GCO_i, IGINV_i, IGOV_i, STIG_i, GC2_i, GC3_i, CHIB_i; +real GCO_i, IGINV_i, IGOV_i, IGOVD_i, STIG_i, GC2_i, GC3_i, CHIB_i; real AGIDL_i, BGIDL_i, STBGIDL_i, CGIDL_i; -real COX_i, CGOV_i, CGBOV_i, CFR_i; -real FNT_i, NFA_i, NFB_i, NFC_i; +real AGIDLD_i, BGIDLD_i, STBGIDLD_i, CGIDLD_i; +real COX_i, CGOV_i, CGOVD_i, CGBOV_i, CFR_i, CFRD_i; +real FNT_i, NFA_i, NFB_i, NFC_i, EF_i; +real FNTEXC_i; real TR_i, MULT_i; +real vth_i, vts_i; real temp, temp1, temp2, tempM; real help; +real jwcorr; real TKR, TKD, TKD_sq, dT, rT, rTn; -real phit, inv_phit, Eg, phibFac, CoxPrime, tox_sq; +real EPSOX, EPSSI; +real BET_i, phit, inv_phit, Eg, phibFac, CoxPrime, tox_sq; real delVg, CoxovPrime, GOV, GOV2; real np, kp, qq, qb0, dphibq, qlim2; real E_eff0, eta_mu, BCH, BOV, inv_CHIB, GCQ, Dch, Dov; @@ -531,21 +616,27 @@ real tf_bet, tf_mue, tf_cs, tf_xcor, tf_ther, tf_thesat, tf_ig; real xi_ov, inv_xi_ov, x_mrg_ov, x1, inv_xg1, Vdsat_lim; real nt, Cox_over_q; +real CoxovPrime_d, GOV_s, GOV_d, GOV2_s, GOV2_d; +real BOV_d, xi_ov_s, xi_ov_d, inv_xi_ov_s, inv_xi_ov_d, x_mrg_ov_s, x_mrg_ov_d, inv_xg1_s, inv_xg1_d; +real AGIDLs, AGIDLDs, BGIDLs, BGIDLDs, BGIDL_T, BGIDLD_T; + real phib, sqrt_phib, phix, aphi, bphi, phix1, phix2, G_0, phit1, inv_phit1, alpha_b; real inv_VP, inv_AX, Sfl_prefac; -real Vgs, Vgd, Vds, Vsb, Vsbstar; -real Vgb, Vgb1, Vgbstar, Vdb, Vdbstar, Vdsx, Vsbx; +real Vgs, Vds, Vsb, Vsbstar; +real Vgb, Vgb1, Vgbstar, Vdb, Vdsx, Vsbx; + +real VgsPrime, VgdPrime, VsbPrime, VdbPrime; real Dnsub; real Igidl, Igisl, Vtovd, Vtovs; -real x_s, sqm, alpha, alpha1, eta_p, phi_inf, za, xitsb, rhob; -real thesat1, wsat, ysat, zsat, r1, r2, dL, GdL, dL1, FdL, GR, Gmob, Gmob_dL, Gvsat, Gvsatinv, QCLM; -real xgm, Voxm, dps, qim, qim1, qim1_1, xgs_ov, xgd_ov, sigVds; -real Ux, xg; -real mu, nu, xn_s, delta_ns; +real x_s, sqm, alpha1, phi_inf, za, rhob; +real thesat1, wsat, ysat, zsat, r1, r2, dL, GdL, dL1, GR, QCLM; +real xgm, Voxm, qim1_1, xgs_ov, xgd_ov; +real Ux; +real mutau, nu, xn_s, delta_ns; real Gf, Gf2, inv_Gf2, xi, inv_xi, margin; -real qeff, COX_qm; +real qeff; real SP_xg1, SP_S_temp,SP_S_temp1,SP_S_temp2; real SP_S_yg, SP_S_ysub, SP_S_y0, SP_S_a, SP_S_b, SP_S_c; @@ -561,30 +652,39 @@ real SP_OV_x0, SP_OV_u; real x_d, x_m, x_ds, Rxcor, delta_1s, xi0s, xi1s, xi2s, xi0d; real Es, Em, Ed, Ds, Dm, Dd, Ps, xgs, qis, qbs, qbm, Eeffm, Vm; real Phi_0, Phi_2, asat, Phi_0_2, Phi0_Phi2; -real Vdse, Vdsat, xn_d, k_ds, Udse; +real Vdsat, xn_d, k_ds, Udse; real Mutmp, Phi_sat, delta_nd; real pC, qC, Pm; real d0, D_bar, km, x_pm, xi_pd, p_pd, u_pd, q_pd; real xs_ov, xd_ov, Vovs, Vovd, psi_t; real zg, delVsat, TP, Dsi, Dgate, u0, u0_div_H, x, xsq, inv_x, ex, inv_ex, Ag, Bg, Sg; -real H, Fj, Fj2; +real Fj, Fj2; real N1, Nm1, Delta_N1, Sfl; -real H0, t1, t2, sqt2, r, lc, lcinv2, g_ideal, CGeff, mid, mig, migid, c_igid, sqid, sqig; -real shot_igs, shot_igsx, shot_igd, shot_igdx, shot_iavl; +real t1, t2, sqt2, r, lc, lcinv2, g_ideal, CGeff, mid, mig, migid, c_igid, sqid, sqig; +real H0; -real Ids, Iimpact, mavl, Igdov, Igsov, Igc0, igc, igcd_h; -real Igc, Igcd, Igcs, Igb, Igs, Igd; -real Idse, Igbe, Igse, Igde, Igidle, Igisle, Iimpacte; +// excess noise variables +real fac_exc, temp2_exc, wsat_exc, temp_exc, thesat1_exc, zsat_exc, Gvsat_exc, gfac, Sidexc; + +real shot_igs, shot_igd, shot_iavl; +real shot_igcsx, shot_igcdx, shot_igsov, shot_igdov; + +real Igc0, igc, igcd_h; +real Igc, Igb; real QI, QD, QB, QG, Qg, Qd, Qb, Qs, Qgs_ov, Qgd_ov; real Qfgs, Qfgd, Qgb_ov; real arg1, arg2max, arg2mina; +real RG_i, RBULK_i, RWELL_i, RJUNS_i, RJUND_i; +real ggate, gbulk, gwell, gjund, gjuns, nt0; +real rgatenoise, rbulknoise, rwellnoise, rjundnoise, rjunsnoise; + integer CHNL_TYPE; `ifdef NQSmodel // Variables used in NQS-calculations - real SWNQS_i, MUNQS_i, RG_i, RBULK_i, RWELL_i, RJUNS_i, RJUND_i; + real SWNQS_i, MUNQS_i; real Qp1_0, Qp2_0, Qp3_0, Qp4_0, Qp5_0, Qp6_0, Qp7_0, Qp8_0, Qp9_0; real fk1, fk2, fk3, fk4, fk5, fk6, fk7, fk8, fk9; @@ -606,125 +706,234 @@ integer CHNL_TYPE; real NQS_xg1, NQS_yg, NQS_z, NQS_eta, NQS_a, NQS_c, NQS_tau, NQS_D0, NQS_xi, NQS_p; real NQS_q, NQS_temp, NQS_A_fac, NQS_xbar, NQS_w, NQS_x0, NQS_u, NQS_y0; real xphi, fk0, thesat2, Fvsat; - real Vrg, Vrbulk, Vrwell, Vrjund, Vrjuns; - real ggate, gbulk, gwell, gjund, gjuns, nt0; - real rgatenoise, rbulknoise, rwellnoise, rjundnoise, rjunsnoise; real temp3, temp4, temp5, temp6, temp7, temp8, temp9; `endif // NQSmodel // JUNCAP2 variables -`include "JUNCAP200_varlist.include" -real isjunbot, qsjunbot, isjunsti, qsjunsti, isjungat, qsjungat, isjun, qsjun, sjnoise, sjnoisex; -real idjunbot, qdjunbot, idjunsti, qdjunsti, idjungat, qdjungat, idjun, qdjun, djnoise, djnoisex; -real Vjuns, Vjund, VMAXS, VMAXD; -real vbimins, vchs, vfmins, vbbtlims, vbimind, vchd, vfmind, vbbtlimd; -real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i; -real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, juncapwidth; +`include "JUNCAP200_varlist1.include" +`include "JUNCAP200_varlist2.include" +real jnoisex_s, jnoisex_d; +real Vjun_s, Vjun_d; +`ifdef LocalModel + real JW_i; +`endif // LocalModel +real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat; +real alpha, eta_p, xitsb, FdL, Gmob, Gmob_dL, Gvsat, Gvsatinv, dps, qim, qim1; +real H, Iimpact, mavl, Ids, Vdse, Igsov, Igdov, Igcs, Igcd, xg, sigVds; +real COX_qm; +real ijun_s, ijunbot_s, ijunsti_s, ijungat_s; +real ijun_d, ijunbot_d, ijunsti_d, ijungat_d; +real qjun_s, qjunbot_s, qjunsti_s, qjungat_s; +real qjun_d, qjunbot_d, qjunsti_d, qjungat_d; +real jnoise_s, jnoise_d; +real tmpv, vjv; +real sf; +///////////////////////////////////////////////////////////////////////////// +// +// Variables for operating point info +// +///////////////////////////////////////////////////////////////////////////// -`ifdef insideADMS // OPinfo - ///////////////////////////////////////////////////////////////////////////// - // - // Variables for operating point info - // - ///////////////////////////////////////////////////////////////////////////// +real id_op, is, ig, ib, P_D, facvsb, facvsb0, sig1k; - real id_op, is, ig, ib, P_D, facvsb, facvsb0, sig1k; +`OPdef(ctype ,"Flag for channel type" ,"") +`OPdef(sdint ,"Flag for source-drain interchange" ,"") - real ctype `P(ask="yes" info="Flag for channel type" unit=""); - real sdint `P(ask="yes" info="Flag for source-drain interchange" unit=""); +`OPdef(ise ,"Total source current" ,"A") +`OPdef(ige ,"Total gate current" ,"A") +`OPdef(ide ,"Total drain current" ,"A") +`OPdef(ibe ,"Total bulk current" ,"A") +`OPdef(ids ,"Drain current, excl. avalanche, tunnel, GISL, GIDL, and junction currents" ,"A") +`OPdef(idb ,"Drain to bulk current" ,"A") +`OPdef(isb ,"Source to bulk current" ,"A") +`OPdef(igs ,"Gate-source tunneling current" ,"A") +`OPdef(igd ,"Gate-drain tunneling current" ,"A") +`OPdef(igb ,"Gate-bulk tunneling current" ,"A") +`OPdef(igcs ,"Gate-channel tunneling current (source component)" ,"A") +`OPdef(igcd ,"Gate-channel tunneling current (drain component)" ,"A") +`OPdef(iavl ,"Substrate current due to weak avelanche" ,"A") +`OPdef(igisl ,"Gate-induced source leakage current" ,"A") +`OPdef(igidl ,"Gate-induced drain leakage current" ,"A") - real ise `P(ask="yes" info="Total source current" unit="A"); - real ige `P(ask="yes" info="Total gate current" unit="A"); - real ide `P(ask="yes" info="Total drain current" unit="A"); - real ibe `P(ask="yes" info="Total bulk current" unit="A"); - real ids `P(ask="yes" info="Drain current, excl. avalanche, tunnel, GISL, GIDL, and junction currents" unit="A"); - real idb `P(ask="yes" info="Drain to bulk current" unit="A"); - real isb `P(ask="yes" info="Source to bulk current" unit="A"); - real igs `P(ask="yes" info="Gate-source tunneling current" unit="A"); - real igd `P(ask="yes" info="Gate-drain tunneling current" unit="A"); - real igb `P(ask="yes" info="Gate-bulk tunneling current" unit="A"); - real igcs `P(ask="yes" info="Gate-channel tunneling current (source component)" unit="A"); - real igcd `P(ask="yes" info="Gate-channel tunneling current (drain component)" unit="A"); - real iavl `P(ask="yes" info="Substrate current due to weak avelanche" unit="A"); - real igisl `P(ask="yes" info="Gate-induced source leakage current" unit="A"); - real igidl `P(ask="yes" info="Gate-induced drain leakage current" unit="A"); +`OPdef(ijs ,"Total source junction current" ,"A") +`OPdef(ijsbot ,"Source junction current (bottom component)" ,"A") +`OPdef(ijsgat ,"Source junction current (gate-edge component)" ,"A") +`OPdef(ijssti ,"Source junction current (STI-edge component)" ,"A") +`OPdef(ijd ,"Total drain junction current" ,"A") +`OPdef(ijdbot ,"Drain junction current (bottom component)" ,"A") +`OPdef(ijdgat ,"Drain junction current (gate-edge component)" ,"A") +`OPdef(ijdsti ,"Drain junction current (STI-edge component)" ,"A") - real ijs `P(ask="yes" info="Total source junction current" unit="A"); - real ijsbot `P(ask="yes" info="Source junction current (bottom component)" unit="A"); - real ijsgat `P(ask="yes" info="Source junction current (gate-edge component)" unit="A"); - real ijssti `P(ask="yes" info="Source junction current (STI-edge component)" unit="A"); - real ijd `P(ask="yes" info="Total drain junction current" unit="A"); - real ijdbot `P(ask="yes" info="Drain junction current (bottom component)" unit="A"); - real ijdgat `P(ask="yes" info="Drain junction current (gate-edge component)" unit="A"); - real ijdsti `P(ask="yes" info="Drain junction current (STI-edge component)" unit="A"); +`OPdef(vds ,"Drain-source voltage" ,"V") +`OPdef(vgs ,"Gate-source voltage" ,"V") +`OPdef(vsb ,"Source-bulk voltage" ,"V") +`OPdef(vto ,"Zero-bias threshold voltage" ,"V") +`OPdef(vts ,"Threshold voltage including back bias effects" ,"V") +`OPdef(vth ,"Threshold voltage including back bias and drain bias effects" ,"V") +`OPdef(vgt ,"Effective gate drive voltage including back bias and drain bias effects" ,"V") +`OPdef(vdss ,"Drain saturation voltage at actual bias" ,"V") +`OPdef(vsat ,"Saturation limit" ,"V") - real vds `P(ask="yes" info="Drain-source voltage" unit="V"); - real vgs `P(ask="yes" info="Gate-source voltage" unit="V"); - real vsb `P(ask="yes" info="Source-bulk voltage" unit="V"); - real vto `P(ask="yes" info="Zero-bias threshold voltage" unit="V"); - real vts `P(ask="yes" info="Threshold voltage including back bias effects" unit="V"); - real vth `P(ask="yes" info="Threshold voltage including back bias and drain bias effects" unit="V"); - real vgt `P(ask="yes" info="Effective gate drive voltage including back bias and drain bias effects" unit="V"); - real vdss `P(ask="yes" info="Drain saturation voltage at actual bias" unit="V"); - real vsat `P(ask="yes" info="Saturation limit" unit="V"); +`OPdef(gm ,"Transconductance" ,"1/Ohm") +`OPdef(gmb ,"Substrate transconductance" ,"1/Ohm") +`OPdef(gds ,"Output conductance" ,"1/Ohm") +`OPdef(gjs ,"Source junction conductance" ,"1/Ohm") +`OPdef(gjd ,"Drain junction conductance" ,"1/Ohm") - real gm `P(ask="yes" info="Transconductance" unit="1/Ohm"); - real gmb `P(ask="yes" info="Substrate transconductance" unit="1/Ohm"); - real gds `P(ask="yes" info="Output conductance" unit="1/Ohm"); - real gjs `P(ask="yes" info="Source junction conductance" unit="1/Ohm"); - real gjd `P(ask="yes" info="Drain junction conductance" unit="1/Ohm"); +`OPdef(cdd ,"Drain capacitance" ,"F") +`OPdef(cdg ,"Drain-gate capacitance" ,"F") +`OPdef(cds ,"Drain-source capacitance" ,"F") +`OPdef(cdb ,"Drain-bulk capacitance" ,"F") +`OPdef(cgd ,"Gate-drain capacitance" ,"F") +`OPdef(cgg ,"Gate capacitance" ,"F") +`OPdef(cgs ,"Gate-source capacitance" ,"F") +`OPdef(cgb ,"Gate-bulk capacitance" ,"F") +`OPdef(csd ,"Source-drain capacitance" ,"F") +`OPdef(csg ,"Source-gate capacitance" ,"F") +`OPdef(css ,"Source capacitance" ,"F") +`OPdef(csb ,"Source-bulk capacitance" ,"F") +`OPdef(cbd ,"Bulk-drain capacitance" ,"F") +`OPdef(cbg ,"Bulk-gate capacitance" ,"F") +`OPdef(cbs ,"Bulk-source capacitance" ,"F") +`OPdef(cbb ,"Bulk capacitance" ,"F") +`OPdef(cgsol ,"Total gate-source overlap capacitance" ,"F") +`OPdef(cgdol ,"Total gate-drain overlap capacitance" ,"F") - real cdd `P(ask="yes" info="Drain capacitance" unit="F"); - real cdg `P(ask="yes" info="Drain-gate capacitance" unit="F"); - real cds `P(ask="yes" info="Drain-source capacitance" unit="F"); - real cdb `P(ask="yes" info="Drain-bulk capacitance" unit="F"); - real cgd `P(ask="yes" info="Gate-drain capacitance" unit="F"); - real cgg `P(ask="yes" info="Gate capacitance" unit="F"); - real cgs `P(ask="yes" info="Gate-source capacitance" unit="F"); - real cgb `P(ask="yes" info="Gate-bulk capacitance" unit="F"); - real csd `P(ask="yes" info="Source-drain capacitance" unit="F"); - real csg `P(ask="yes" info="Source-gate capacitance" unit="F"); - real css `P(ask="yes" info="Source capacitance" unit="F"); - real csb `P(ask="yes" info="Source-bulk capacitance" unit="F"); - real cbd `P(ask="yes" info="Bulk-drain capacitance" unit="F"); - real cbg `P(ask="yes" info="Bulk-gate capacitance" unit="F"); - real cbs `P(ask="yes" info="Bulk-source capacitance" unit="F"); - real cbb `P(ask="yes" info="Bulk capacitance" unit="F"); - real cgsol `P(ask="yes" info="Total gate-source overlap capacitance" unit="F"); - real cgdol `P(ask="yes" info="Total gate-drain overlap capacitance" unit="F"); +`OPdef(cjs ,"Total source junction capacitance" ,"F") +`OPdef(cjsbot ,"Source junction capacitance (bottom component)" ,"F") +`OPdef(cjsgat ,"Source junction capacitance (gate-edge component)" ,"F") +`OPdef(cjssti ,"Source junction capacitance (STI-edge component)" ,"F") +`OPdef(cjd ,"Total drain junction capacitance" ,"F") +`OPdef(cjdbot ,"Drain junction capacitance (bottom component)" ,"F") +`OPdef(cjdgat ,"Drain junction capacitance (gate-edge component)" ,"F") +`OPdef(cjdsti ,"Drain junction capacitance (STI-edge component)" ,"F") - real cjs `P(ask="yes" info="Total source junction capacitance" unit="F"); - real cjsbot `P(ask="yes" info="Source junction capacitance (bottom component)" unit="F"); - real cjsgat `P(ask="yes" info="Source junction capacitance (gate-edge component)" unit="F"); - real cjssti `P(ask="yes" info="Source junction capacitance (STI-edge component)" unit="F"); - real cjd `P(ask="yes" info="Total drain junction capacitance" unit="F"); - real cjdbot `P(ask="yes" info="Drain junction capacitance (bottom component)" unit="F"); - real cjdgat `P(ask="yes" info="Drain junction capacitance (gate-edge component)" unit="F"); - real cjdsti `P(ask="yes" info="Drain junction capacitance (STI-edge component)" unit="F"); +`OPdef(weff ,"Effective channel width for geometrical models" ,"m") +`OPdef(leff ,"Effective channel length for geometrical models" ,"m") +`OPdef(u ,"Transistor gain" ,"") +`OPdef(rout ,"Small-signal output resistance" ,"Ohm") +`OPdef(vearly ,"Equivalent Early voltage" ,"V") +`OPdef(beff ,"Gain factor" ,"A/V^2") +`OPdef(fug ,"Unity gain frequency at actual bias" ,"Hz") +`OPdef(rg_op ,"Gate resistance" ,"Ohm") - real weff `P(ask="yes" info="Effective channel width for geometrical models" unit="m"); - real leff `P(ask="yes" info="Effective channel length for geometrical models" unit="m"); - real u `P(ask="yes" info="Transistor gain" unit=""); - real rout `P(ask="yes" info="Small-signal output resistance" unit="Ohm"); - real vearly `P(ask="yes" info="Equivalent Early voltage" unit="V"); - real beff `P(ask="yes" info="Gain factor" unit="A/V^2"); - real fug `P(ask="yes" info="Unity gain frequency at actual bias" unit="Hz"); +`OPdef(sfl ,"Flicker noise current spectral density at 1 Hz" ,"A^2/Hz") +`OPdef(sqrtsff ,"Input-referred RMS white noise voltage spectral density at 1 kHz" ,"V/sqrt(Hz)") +`OPdef(sqrtsfw ,"Input-referred RMS white noise voltage spectral density" ,"V/sqrt(Hz)") +`OPdef(sid ,"White noise current spectral density" ,"A^2/Hz") +`OPdef(sig ,"Induced gate noise current spectral density at 1 Hz" ,"A^2/Hz") +`OPdef(cigid ,"Imaginary part of correlation coefficient between Sig and Sid" ,"") +`OPdef(fknee ,"Cross-over frequency above which white noise is dominant" ,"Hz") +`OPdef(sigs ,"Gate-source current noise spectral density" ,"A^2/Hz") +`OPdef(sigd ,"Gate-drain current noise spectral density" ,"A^2/Hz") +`OPdef(siavl ,"Impact ionization current noise spectral density" ,"A^2/Hz") +`OPdef(ssi ,"Total source junction current noise spectral density" ,"A^2/Hz") +`OPdef(sdi ,"Total drain junction current noise spectral density" ,"A^2/Hz") - real sfl `P(ask="yes" info="Flicker noise current density at 1 Hz" unit="A/Hz"); - real sqrtsff `P(ask="yes" info="Input-referred RMS white noise voltage density at 1 kHz" unit="V/sqrt(Hz)"); - real sqrtsfw `P(ask="yes" info="Input-referred RMS white noise voltage density" unit="V/sqrt(Hz)"); - real sid `P(ask="yes" info="White noise current density" unit="A^2/Hz"); - real sig `P(ask="yes" info="Induced gate noise current density at 1 Hz" unit="A^2/Hz"); - real cigid `P(ask="yes" info="Imaginary part of correlation coefficient between Sig and Sid" unit=""); - real fknee `P(ask="yes" info="Cross-over frequency above which white noise is dominant" unit="Hz"); - real sigs `P(ask="yes" info="Gate-source current noise spectral density" unit="A^2/Hz"); - real sigd `P(ask="yes" info="Gate-drain current noise spectral density" unit="A^2/Hz"); - real siavl `P(ask="yes" info="Impact ionization current noise spectral density" unit="A^2/Hz"); - real ssi `P(ask="yes" info="Total source junction current noise spectral density" unit="A^2/Hz"); - real sdi `P(ask="yes" info="Total drain junction current noise specral density" unit="A^2/Hz"); -`endif // OPinfo +// local parameters after scaling, T-scaling, and clipping +`OPdef(lp_vfb , "Local parameter VFB after T-scaling and clipping", "V") +`OPdef(lp_stvfb , "Local parameter STVFB after clipping", "V/K") +`OPdef(lp_tox , "Local parameter TOX after clipping", "m") +`OPdef(lp_epsrox , "Local parameter EPSROX after clipping", "") +`OPdef(lp_neff , "Local parameter NEFF after clipping", "m^-3") +`OPdef(lp_vnsub , "Local parameter VNSUB after clipping", "V") +`OPdef(lp_nslp , "Local parameter NSLP after clipping", "V") +`OPdef(lp_dnsub , "Local parameter DNSUB after clipping", "V^-1") +`OPdef(lp_dphib , "Local parameter DPHIB after clipping", "V") +`OPdef(lp_np , "Local parameter NP after clipping", "m^-3") +`OPdef(lp_ct , "Local parameter CT after clipping", "") +`OPdef(lp_toxov , "Local parameter TOXOV after clipping", "m") +`OPdef(lp_toxovd , "Local parameter TOXOVD after clipping", "m") +`OPdef(lp_nov , "Local parameter NOV after clipping", "m^-3") +`OPdef(lp_novd , "Local parameter NOVD after clipping", "m^-3") +`OPdef(lp_cf , "Local parameter CF after clipping", "") +`OPdef(lp_cfb , "Local parameter CFB after clipping", "V^-1") +`OPdef(lp_betn , "Local parameter BETN after T-scaling and clipping", "m^2/(V s)") +`OPdef(lp_stbet , "Local parameter STBET after clipping", "") +`OPdef(lp_mue , "Local parameter MUE after T-scaling and clipping", "m/V") +`OPdef(lp_stmue , "Local parameter STMUE after clipping", "") +`OPdef(lp_themu , "Local parameter THEMU after T-scaling and clipping", "") +`OPdef(lp_stthemu , "Local parameter STTHEMU after clipping", "") +`OPdef(lp_cs , "Local parameter CS after T-scaling and clipping", "") +`OPdef(lp_stcs , "Local parameter STCS after clipping", "") +`OPdef(lp_xcor , "Local parameter XCOR after T-scaling and clipping", "V^-1") +`OPdef(lp_stxcor , "Local parameter STXCOR after clipping", "") +`OPdef(lp_feta , "Local parameter FETA after clipping", "") +`OPdef(lp_rs , "Local parameter RS after T-scaling and clipping", "Ohm") +`OPdef(lp_strs , "Local parameter STRS after clipping", "") +`OPdef(lp_rsb , "Local parameter RSB after clipping", "V^-1") +`OPdef(lp_rsg , "Local parameter RSG after clipping", "V^-1") +`OPdef(lp_thesat , "Local parameter THESAT after T-scaling and clipping", "V^-1") +`OPdef(lp_stthesat , "Local parameter STTHESAT after clipping", "") +`OPdef(lp_thesatb , "Local parameter THESATB after clipping", "V^-1") +`OPdef(lp_thesatg , "Local parameter THESATG after clipping", "V^-1") +`OPdef(lp_ax , "Local parameter AX after clipping", "") +`OPdef(lp_alp , "Local parameter ALP after clipping", "") +`OPdef(lp_alp1 , "Local parameter ALP1 after clipping", "V") +`OPdef(lp_alp2 , "Local parameter ALP2 after clipping", "V^-1") +`OPdef(lp_vp , "Local parameter VP after clipping", "V") +`OPdef(lp_a1 , "Local parameter A1 after clipping", "") +`OPdef(lp_a2 , "Local parameter A2 after T-scaling and clipping", "V") +`OPdef(lp_sta2 , "Local parameter STA2 after clipping", "") +`OPdef(lp_a3 , "Local parameter A3 after clipping", "") +`OPdef(lp_a4 , "Local parameter A4 after clipping", "1/sqrt(V)") +`OPdef(lp_gco , "Local parameter GCO after clipping", "") +`OPdef(lp_iginv , "Local parameter IGINV after T-scaling and clipping", "A") +`OPdef(lp_igov , "Local parameter IGOV after T-scaling and clipping", "A") +`OPdef(lp_igovd , "Local parameter IGOVD after T-scaling and clipping", "A") +`OPdef(lp_stig , "Local parameter STIG after clipping", "") +`OPdef(lp_gc2 , "Local parameter GC2 after clipping", "") +`OPdef(lp_gc3 , "Local parameter GC3 after clipping", "") +`OPdef(lp_chib , "Local parameter CHIB after clipping", "V") +`OPdef(lp_agidl , "Local parameter AGIDL after clipping", "A/V^3") +`OPdef(lp_agidld , "Local parameter AGIDLD after clipping", "A/V^3") +`OPdef(lp_bgidl , "Local parameter BGIDL after T-scaling and clipping", "V") +`OPdef(lp_bgidld , "Local parameter BGIDLD after T-scaling and clipping", "V") +`OPdef(lp_stbgidl , "Local parameter STBGIDL after clipping", "V/K") +`OPdef(lp_stbgidld , "Local parameter STBGIDLD after clipping", "V/K") +`OPdef(lp_cgidl , "Local parameter CGIDL after clipping", "") +`OPdef(lp_cgidld , "Local parameter CGIDLD after clipping", "") +`OPdef(lp_cox , "Local parameter COX after clipping", "F") +`OPdef(lp_cgov , "Local parameter CGOV after clipping", "F") +`OPdef(lp_cgovd , "Local parameter CGOVD after clipping", "F") +`OPdef(lp_cgbov , "Local parameter CGBOV after clipping", "F") +`OPdef(lp_cfr , "Local parameter CFR after clipping", "F") +`OPdef(lp_cfrd , "Local parameter CFRD after clipping", "F") +`OPdef(lp_fnt , "Local parameter FNT after clipping", "") +`OPdef(lp_fntexc , "Local parameter FNTEXC after clipping", "") +`OPdef(lp_nfa , "Local parameter NFA after clipping", "1/(V m^4)") +`OPdef(lp_nfb , "Local parameter NFB after clipping", "1/(V m^2)") +`OPdef(lp_nfc , "Local parameter NFC after clipping", "V^-1") +`OPdef(lp_ef , "Local parameter EF after clipping", "") +`OPdef(lp_rg , "Local parameter RG after clipping", "Ohm") +`OPdef(lp_rbulk , "Local parameter RBULK after clipping", "Ohm") +`OPdef(lp_rwell , "Local parameter RWELL after clipping", "Ohm") +`OPdef(lp_rjuns , "Local parameter RJUNS after clipping", "Ohm") +`OPdef(lp_rjund , "Local parameter RJUND after clipping", "Ohm") +`OPdef(tk , "Device Temperature", "K") +`OPdef(cjosbot , "Bottom component of total zero-bias source junction capacitance at device temperature", "F") +`OPdef(cjossti , "STI-edge component of total zero-bias source junction capacitance at device temperature", "F") +`OPdef(cjosgat , "Gate-edge component of total zero-bias source junction capacitance at device temperature", "F") +`OPdef(vbisbot , "Built-in voltage of source-side bottom junction at device temperature", "V") +`OPdef(vbissti , "Built-in voltage of source-side STI-edge junction at device temperature", "V") +`OPdef(vbisgat , "Built-in voltage of source-side gate-edge junction at device temperature", "V") +`OPdef(idsatsbot , "Total source-side bottom junction saturation current", "A") +`OPdef(idsatssti , "Total source-side STI-edge junction saturation current", "A") +`OPdef(idsatsgat , "Total source-side gate-edge junction saturation current", "A") +`OPdef(cjosbotd , "Bottom component of total zero-bias drain junction capacitance at device temperature", "F") +`OPdef(cjosstid , "STI-edge component of total zero-bias drain junction capacitance at device temperature", "F") +`OPdef(cjosgatd , "Gate-edge component of total zero-bias drain junction capacitance at device temperature", "F") +`OPdef(vbisbotd , "Built-in voltage of drain-side bottom junction at device temperature", "V") +`OPdef(vbisstid , "Built-in voltage of drain-side STI-edge junction at device temperature", "V") +`OPdef(vbisgatd , "Built-in voltage of drain-side gate-edge junction at device temperature", "V") +`OPdef(idsatsbotd , "Total drain-side bottom junction saturation current", "A") +`OPdef(idsatsstid , "Total drain-side STI-edge junction saturation current", "A") +`OPdef(idsatsgatd , "Total drain-side gate-edge junction saturation current", "A") +`ifdef NQSmodel + `OPdef(lp_munqs , "Local parameter MUNQS after clipping", "") +`endif // NQSmodel ///////////////////////////////////////////////////////////////////////////// // @@ -734,9 +943,7 @@ real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, juncapwidth; analog begin -`ifdef insideADMS - `INITIAL_MODEL -`endif + `INITIAL_MODEL begin : initial_model // Code independent of bias or instance parameters // This block needs to be evaluated only once @@ -749,6 +956,8 @@ analog begin `else // Binning // Clipping of global model parameters TOX_i = `CLIP_LOW(TOXO, 1e-10); + TOXOVD_i = `CLIP_LOW(TOXOVDO, 1e-10); + EPSROX_i = `CLIP_LOW(EPSROXO, 1.0); NSUBO_i = `CLIP_LOW(NSUBO, 1e20); WSEG_i = `CLIP_LOW(WSEG, 1e-10); NPCK_i = `CLIP_LOW(NPCK, 0.0); @@ -756,6 +965,7 @@ analog begin LPCK_i = `CLIP_LOW(LPCK, 1e-10); TOXOV_i = `CLIP_LOW(TOXOVO, 1e-10); LOV_i = `CLIP_LOW(LOV, 0.0); + LOVD_i = `CLIP_LOW(LOVD, 0.0); LP1_i = `CLIP_LOW(LP1, 1e-10); LP2_i = `CLIP_LOW(LP2, 1e-10); WBET_i = `CLIP_LOW(WBET, 1e-10); @@ -764,12 +974,19 @@ analog begin ALP2L2_i = `CLIP_LOW(ALP2L2, 0.0); `endif // Binning + SAREF_i = `CLIP_LOW(SAREF, 1e-9); + SBREF_i = `CLIP_LOW(SBREF, 1e-9); KVSAT_i = `CLIP_BOTH(KVSAT, -1.0, 1.0); LLODKUO_i = `CLIP_LOW(LLODKUO, 0.0); WLODKUO_i = `CLIP_LOW(WLODKUO, 0.0); LLODVTH_i = `CLIP_LOW(LLODVTH, 0.0); WLODVTH_i = `CLIP_LOW(WLODVTH, 0.0); LODETAO_i = `CLIP_LOW(LODETAO, 0.0); + SCREF_i = `CLIP_LOW(SCREF, 0.0); + WEB_i = WEB; + WEC_i = WEC; + RINT_i = `CLIP_LOW(RINT, 0.0); + RVPOLY_i = `CLIP_LOW(RVPOLY, 0.0); `endif // LocalModel // 4.1 Internal parameters (including temperature scaling) @@ -784,7 +1001,7 @@ analog begin // Transistor temperature TR_i = `CLIP_LOW(TR, -273); TKR = `KELVINCONVERSION + TR_i; - TKD = $temperature + DTA; + TKD = $temperature + DTA; TKD_sq = TKD * TKD; dT = TKD - TKR; rT = TKD / TKR; @@ -796,6 +1013,7 @@ analog begin Eg = 1.179 - 9.025e-5 * TKD - 3.05e-7 * TKD_sq; phibFac = (1.045 + 4.5e-4 * TKD) * (0.523 + 1.4e-3 * TKD - 1.48e-6 * TKD_sq) * TKD_sq / 9.0E4; phibFac = `MAX(phibFac, 1.0E-3); + EPSSI = `EPSO * `EPSRSI; `ifdef NQSmodel // Round SWNQS to nearest allowed value @@ -825,33 +1043,57 @@ analog begin vnorm = 10.0; vnorm_inv = 1.0 / vnorm; - nt0 = 4 * `KBOL * TKD; // parameter for white noise of parasitic resistances `endif // NQSmodel + nt0 = 4 * `KBOL * TKD; // parameter for white noise of parasitic resistances + // JUNCAP2 `include "JUNCAP200_InitModel.include" end // initial_model -`ifdef insideADMS - `INITIAL_INSTANCE -`endif + `INITIAL_INSTANCE begin : initial_instance // Code independent of bias, but dependent on instance parameters, // (including code dependent on parameters which could IN PRINCIPLE be scaled) // This block needs to be evaluated only once for each instance -`ifdef LocalModel - juncapwidth= JW; + ABSOURCE_i = ABSOURCE; + LSSOURCE_i = LSSOURCE; + LGSOURCE_i = LGSOURCE; + ABDRAIN_i = ABDRAIN; + LSDRAIN_i = LSDRAIN; + LGDRAIN_i = LGDRAIN; + AS_i = AS; + PS_i = PS; + AD_i = AD; + PD_i = PD; + + +`ifdef LocalModel + JW_i = JW; `else // LocalModel - // Clipping of the instance parameters - SAREF_i = `CLIP_LOW(SAREF, 1e-9); - SBREF_i = `CLIP_LOW(SBREF, 1e-9); - L_i = `CLIP_LOW(L, 1e-9); - W_i = `CLIP_LOW(W, 1e-9); + + L_i = L; + W_i = W; SA_i = SA; SB_i = SB; + SD_i = SD; + SC_i = SC; + XGW_i = XGW; + + // Clipping of the instance parameters + NF_i = `CLIP_LOW(NF, 1.0); + NF_i = floor(NF_i + 0.5); // round to nearest integer + invNF = 1.0 / NF_i; + L_i = `CLIP_LOW(L_i, 1e-9); + W_i = `CLIP_LOW(W_i * invNF, 1e-9); + SCA_i = `CLIP_LOW(SCA, 0.0); + SCB_i = `CLIP_LOW(SCB, 0.0); + SCC_i = `CLIP_LOW(SCC, 0.0); + RSHG_i = `CLIP_LOW(RSHG, 0.0); + NGCON_i = (NGCON < 1.5) ? 1.0 : 2.0; /////////////////////////////////////////// // GEOMETRICAL PARAMETERSCALING @@ -877,19 +1119,50 @@ analog begin Wcv = `CLIP_LOW(W_i + delWOD + DWQ, 1e-9); iLE = LEN / LE; iWE = WEN / WE; - juncapwidth= WE; + jwcorr = 0.0; + ABS_i = 0.0; + LSS_i = 0.0; + LGS_i = 0.0; + ABD_i = 0.0; + LSD_i = 0.0; + LGD_i = 0.0; + if (SWJUNCAP == 3.0) begin + jwcorr = WE; + end + if ((SWJUNCAP == 2.0) || (SWJUNCAP == 3.0)) begin + ABS_i = AS_i * invNF; + LSS_i = PS_i * invNF - jwcorr; + LGS_i = WE; + ABD_i = AD_i * invNF; + LSD_i = PD_i * invNF - jwcorr; + LGD_i = WE; + end else begin + ABS_i = ABSOURCE_i * invNF; + LSS_i = LSSOURCE_i * invNF; + LGS_i = LGSOURCE_i * invNF; + ABD_i = ABDRAIN_i * invNF; + LSD_i = LSDRAIN_i * invNF; + LGD_i = LGDRAIN_i * invNF; + end + + // Geometry for multi-finger devices + L_f = `CLIP_LOW(L_i + delLPS, 1e-9); + L_slif = `CLIP_LOW(L_f + DLSIL, 1e-9); + W_f = `CLIP_LOW(W_i + delWOD, 1e-9); + XGWE = `CLIP_LOW(XGW_i - 0.5 * delWOD, 1e-9); `ifdef Binning - // 3.4 Geometry scaling with binning scaling rules + // 3.3 Geometry scaling with binning scaling rules `include "PSP102_binning.include" `else // Binning - // 3.3 Geometry scaling with physical scaling rules + // 3.2 Geometry scaling with physical scaling rules // Process parameters VFB = VFBO * (1.0 + VFBL * iLE) * (1.0 + VFBW * iWE) * (1.0 + VFBLW * iLE * iWE); STVFB = STVFBO * (1.0 + STVFBL * iLE) * (1.0 + STVFBW * iWE) * (1.0 + STVFBLW * iLE * iWE); TOX = TOXO; + EPSROX = EPSROXO; NSUB0e = NSUBO_i * `MAX(( 1.0 + NSUBW * iWE * ln( 1.0 + WE / WSEG_i )), 1.0E-03); NPCKe = NPCK_i * `MAX(( 1.0 + NPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0E-03); LPCKe = LPCK_i * `MAX(( 1.0 + LPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0E-03); @@ -913,7 +1186,9 @@ analog begin NP = NPO * `MAX(1e-6, (1.0 + NPL * iLE)); CT = (CTO + CTL * pow(iLE, CTLEXP)) * (1.0 + CTW * iWE) * (1.0 + CTLW * iLE * iWE); TOXOV = TOXOVO; + TOXOVD = TOXOVDO; NOV = NOVO; + NOVD = NOVDO; // DIBL parameters CF = CFL * pow(iLE, CFLEXP) * (1.0 + CFW * iWE); @@ -971,6 +1246,7 @@ analog begin GCO = GCOO; IGINV = IGINVLW / (iWE * iLE); IGOV = IGOVW * LOV_i / (LEN * iWE); + IGOVD = IGOVDW * LOVD_i / (LEN * iWE); STIG = STIGO; GC2 = GC2O; GC3 = GC3O; @@ -978,41 +1254,72 @@ analog begin // GIDL AGIDL = AGIDLW * LOV_i / (LEN * iWE); + AGIDLD = AGIDLDW * LOVD_i / (LEN * iWE); BGIDL = BGIDLO; + BGIDLD = BGIDLDO; STBGIDL = STBGIDLO; + STBGIDLD = STBGIDLDO; CGIDL = CGIDLO; + CGIDLD = CGIDLDO; // Charge model parameters - COX = `EPSOX * WEcv * LEcv / TOX_i; - CGOV = `EPSOX * WEcv * LOV_i / TOXOV_i; + COX = `EPSO * EPSROX_i * WEcv * LEcv / TOX_i; + CGOV = `EPSO * EPSROX_i * WEcv * LOV_i / TOXOV_i; + CGOVD = `EPSO * EPSROX_i * WEcv * LOVD_i / TOXOVD_i; CGBOV = CGBOVL * Lcv / LEN; CFR = CFRW * Wcv / WEN; - FNT = FNTO; + CFRD = CFRDW * Wcv / WEN; // Noise model parameters - NFA = iWE * iLE * NFALW; - NFB = iWE * iLE * NFBLW; - NFC = iWE * iLE * NFCLW; + temp0 = 1.0 - 2.0 * LINTNOI * iLE / LEN; + Lnoi = `MAX(temp0, 1.0e-3); + Lred = 1.0 / pow(Lnoi, ALPNOI); + + FNT = FNTO; + FNTEXC = FNTEXCL * BETN * BETN * iWE * iWE; + NFA = Lred * iWE * iLE * NFALW; + NFB = Lred * iWE * iLE * NFBLW; + NFC = Lred * iWE * iLE * NFCLW; + EF = EFO; + + // Well proximity effect parameters + KVTHOWE = KVTHOWEO + KVTHOWEL * iLE + KVTHOWEW * iWE + KVTHOWELW * iLE * iWE; + KUOWE = KUOWEO + KUOWEL * iLE + KUOWEW * iWE + KUOWELW * iLE * iWE; `endif // Binning + // Parasitic resistance parameters + RG = RSHG_i * (`oneThird * W_f / NGCON_i + XGWE) / (NGCON_i * L_slif) + + (RINT_i + RVPOLY_i) / (W_f * L_f) + NF_i * RGO; + RWELL = NF_i * RWELLO; + RBULK = NF_i * RBULKO; + RJUNS = NF_i * RJUNSO; + RJUND = NF_i * RJUNDO; + `ifdef NQSmodel MUNQS = MUNQSO; - RG = RGO; - RWELL = RWELLO; - RBULK = RBULKO; - RJUNS = RJUNSO; - RJUND = RJUNDO; `endif // NQSModel /////////////////////////////////////////// // STRESSMODEL /////////////////////////////////////////// - // 3.5 Stress equations - if ((SA_i > 0) && (SB_i > 0)) begin + // 3.4 Stress equations + tmpa = 0.0; + tmpb = 0.0; + loop = 0.0; + if ((SA_i > 0.0) && (SB_i > 0.0) && ((NF_i == 1.0) || ((NF_i > 1.0) && (SD_i > 0.0)))) begin // Auxiliary variables - Invsa = 1.0 / (SA_i + 0.5 * L_i); - Invsb = 1.0 / (SB_i + 0.5 * L_i); + + // Note: some verilog-A compilers will (unnecesarily) cause the while-loop + // below to be executed at every bias step; this has a negative impact on + // the simulation speed of PSP. + while (loop < (NF_i - 0.5)) begin + tmpa = tmpa + 1.0 / (SA_i + 0.5 * L_i + loop * (SD_i + L_i)); + tmpb = tmpb + 1.0 / (SB_i + 0.5 * L_i + loop * (SD_i + L_i)); + loop = loop + 1.0; + end + Invsa = tmpa * invNF; + Invsb = tmpb * invNF; Invsaref = 1.0 / (SAREF_i + 0.5 * L_i); Invsbref = 1.0 / (SBREF_i + 0.5 * L_i); Lx = `MAX(L_i + delLPS, 1e-9); @@ -1035,9 +1342,31 @@ analog begin end /////////////////////////////////////////// - // END OF SCALINGRULES AND STRESSMODEL + // WELL PROXIMITY EFFECT MODEL /////////////////////////////////////////// + // 3.5 Well proximity effect equations + if ((SCA_i > 0.0) || (SCB_i > 0.0) || (SCC_i > 0.0) || (SC_i > 0.0)) begin + if ((SCA_i == 0.0) && (SCB_i == 0.0) && (SCC_i == 0.0)) begin + temp0 = SC_i + W_i; + temp00 = 1.0 / SCREF_i; + SCA_i = SCREF_i * SCREF_i / (SC_i * temp0); + SCB_i = ((0.1 * SC_i + 0.01 * SCREF_i) * exp(-10.0 * SC_i * temp00) + - (0.1 * temp0 + 0.01 * SCREF_i) * exp(-10.0 * temp0 * temp00)) / W_i; + SCC_i = ((0.05 * SC_i + 0.0025 * SCREF_i) * exp(-20.0 * SC_i * temp00) + - (0.05 * temp0 + 0.0025 * SCREF_i) * exp(-20.0 * temp0 * temp00)) / W_i; + end + + // Parameter adaptations + temp0 = SCA_i + WEB_i * SCB_i + WEC_i * SCC_i; + VFB = VFB + KVTHOWE * temp0; + BETN = BETN * (1.0 + KUOWE * temp0); + end + + ///////////////////////////////////////////// + // END OF SCALINGRULES AND STRESS/WPE MODELS + ///////////////////////////////////////////// + `endif // LocalModel // 4.1 Internal parameters (including temperature scaling) @@ -1045,6 +1374,7 @@ analog begin VFB_i = VFB; STVFB_i = STVFB; TOX_i = `CLIP_LOW(TOX, 1e-10); + EPSROX_i = `CLIP_LOW(EPSROX, 1.0); NEFF_i = `CLIP_BOTH(NEFF, 1e20, 1e26); VNSUB_i = VNSUB; NSLP_i = `CLIP_LOW(NSLP, 1e-3); @@ -1054,10 +1384,12 @@ analog begin QMC_i = `CLIP_LOW(QMC, 0.0); CT_i = `CLIP_LOW(CT, 0.0); TOXOV_i = `CLIP_LOW(TOXOV, 1e-10); + TOXOVD_i = `CLIP_LOW(TOXOVD, 1e-10); NOV_i = `CLIP_BOTH(NOV, 1e20, 1e27); + NOVD_i = `CLIP_BOTH(NOVD, 1e20, 1e27); CF_i = `CLIP_LOW(CF, 0.0); CFB_i = `CLIP_BOTH(CFB, 0.0, 1.0); - BET_i = `CLIP_LOW(BETN, 0.0); + BETN_i = `CLIP_LOW(BETN, 0.0); STBET_i = STBET; MUE_i = `CLIP_LOW(MUE, 0.0); STMUE_i = STMUE; @@ -1089,43 +1421,124 @@ analog begin GCO_i = `CLIP_BOTH(GCO, -10.0, 10.0); IGINV_i = `CLIP_LOW(IGINV, 0.0); IGOV_i = `CLIP_LOW(IGOV, 0.0); + IGOVD_i = `CLIP_LOW(IGOVD, 0.0); STIG_i = STIG; GC2_i = `CLIP_BOTH(GC2, 0.0, 10.0); GC3_i = `CLIP_BOTH(GC3, -10.0, 10.0); CHIB_i = `CLIP_LOW(CHIB, 1.0); AGIDL_i = `CLIP_LOW(AGIDL, 0.0); + AGIDLD_i = `CLIP_LOW(AGIDLD, 0.0); BGIDL_i = `CLIP_LOW(BGIDL, 0.0); + BGIDLD_i = `CLIP_LOW(BGIDLD, 0.0); STBGIDL_i = STBGIDL; + STBGIDLD_i = STBGIDLD; CGIDL_i = CGIDL; + CGIDLD_i = CGIDLD; COX_i = `CLIP_LOW(COX, 0.0); CGOV_i = `CLIP_LOW(CGOV, 0.0); + CGOVD_i = `CLIP_LOW(CGOVD, 0.0); CGBOV_i = `CLIP_LOW(CGBOV, 0.0); CFR_i = `CLIP_LOW(CFR, 0.0); + CFRD_i = `CLIP_LOW(CFRD, 0.0); FNT_i = `CLIP_LOW(FNT, 0.0); + FNTEXC_i = `CLIP_LOW(FNTEXC, 0.0); NFA_i = `CLIP_LOW(NFA, 0.0); NFB_i = `CLIP_LOW(NFB, 0.0); NFC_i = `CLIP_LOW(NFC, 0.0); - MULT_i = `CLIP_LOW(MULT, 0.0); + EF_i = `CLIP_LOW(EF, 0.0); + FACTUO_i = `CLIP_LOW(FACTUO, 0.0); + DELVTO_i = DELVTO; + // Parasitic resistances + RG_i = `CLIP_LOW(RG, 1.0e-3); + RBULK_i = `CLIP_LOW(RBULK, 1.0e-3); + RJUNS_i = `CLIP_LOW(RJUNS, 1.0e-3); + RJUND_i = `CLIP_LOW(RJUND, 1.0e-3); + RWELL_i = `CLIP_LOW(RWELL, 1.0e-3); +`ifdef LocalModel + MULT_i = `CLIP_LOW(MULT, 0.0); +`else // LocalModel + MULT_i = `CLIP_LOW(MULT * NF_i, 0.0); +`endif // LocalModel +`ifdef NQSmodel + MUNQS_i = `CLIP_LOW(MUNQS, 0.0); +`endif // NQSmodel + // ignore drain-side values in case of symmetric junctions + if (SWJUNASYM == 0.0) begin + TOXOVD_i = TOXOV_i; + NOVD_i = NOV_i; + AGIDLD_i = AGIDL_i; + BGIDLD_i = BGIDL_i; + STBGIDLD_i = STBGIDL_i; + CGIDLD_i = CGIDL_i; + IGOVD_i = IGOV_i; + CGOVD_i = CGOV_i; + CFRD_i = CFR_i; + end + +`ifdef LocalModel + // JUNCAP instance parameters (local model) + jwcorr = 0.0; + ABS_i = 0.0; + LSS_i = 0.0; + LGS_i = 0.0; + ABD_i = 0.0; + LSD_i = 0.0; + LGD_i = 0.0; + if (SWJUNCAP == 3.0) begin + jwcorr = JW_i; + end + if ((SWJUNCAP == 2.0) || (SWJUNCAP == 3.0)) begin + ABS_i = AS_i; + LSS_i = PS_i - jwcorr; + LGS_i = JW_i; + ABD_i = AD_i; + LSD_i = PD_i - jwcorr; + LGD_i = JW_i; + end else begin + ABS_i = ABSOURCE_i; + LSS_i = LSSOURCE_i; + LGS_i = LGSOURCE_i; + ABD_i = ABDRAIN_i; + LSD_i = LSDRAIN_i; + LGD_i = LGDRAIN_i; + end +`endif // LocalModel + if ((SWJUNCAP == 1.0) || (SWJUNCAP == 2.0) || (SWJUNCAP == 3.0)) begin + ABSOURCE_i = `CLIP_LOW(ABS_i, `AB_cliplow); + LSSOURCE_i = `CLIP_LOW(LSS_i, `LS_cliplow); + LGSOURCE_i = `CLIP_LOW(LGS_i, `LG_cliplow); + ABDRAIN_i = `CLIP_LOW(ABD_i, `AB_cliplow); + LSDRAIN_i = `CLIP_LOW(LSD_i, `LS_cliplow); + LGDRAIN_i = `CLIP_LOW(LGD_i, `LG_cliplow); + end else begin + ABSOURCE_i = 0.0; + LSSOURCE_i = 0.0; + LGSOURCE_i = 0.0; + ABDRAIN_i = 0.0; + LSDRAIN_i = 0.0; + LGDRAIN_i = 0.0; + end // Local process parameters + EPSOX = `EPSO * EPSROX_i; phit1 = phit * (1.0 + CT_i * rTn); inv_phit1 = 1.0 / phit1; - VFB_i = VFB_i + STVFB_i * dT; + VFB_i = VFB_i + STVFB_i * dT + DELVTO_i; phib = Eg + DPHIB_i + 2.0 * phit * ln(NEFF_i * pow(phibFac, -0.75) * 4.0e-26); phib = `MAX(phib, 5.0E-2); - CoxPrime = `EPSOX / TOX_i; + CoxPrime = EPSOX / TOX_i; tox_sq = TOX_i * TOX_i; - G_0 = sqrt(2.0 * `QELE * NEFF_i * `EPSSI * inv_phit) / CoxPrime; + G_0 = sqrt(2.0 * `QELE * NEFF_i * EPSSI * inv_phit) / CoxPrime; // Poly-silicon depletion kp = 0.0; if (NP_i > 0.0) begin arg2max = 8.0e7 / tox_sq; np = `MAX(NP_i, arg2max); - np = `MAX(3.0e25, np); - kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * `EPSSI); + np = `MAX(5.0e24, np); + kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * EPSSI); end // QM corrections @@ -1149,16 +1562,23 @@ analog begin phix1 = `MINA(phix - phix2, 0, aphi); // Gate overlap - CoxovPrime = `EPSOX / TOXOV_i; - GOV = sqrt(2.0 * `QELE * NOV_i * `EPSSI * inv_phit) / CoxovPrime; - GOV2 = GOV * GOV; - xi_ov = 1.0 + GOV * `invSqrt2; - inv_xi_ov = 1.0 / xi_ov; - x_mrg_ov = 1.0e-5 * xi_ov; + CoxovPrime = EPSOX / TOXOV_i; + CoxovPrime_d = EPSOX / TOXOVD_i; + GOV_s = sqrt(2.0 * `QELE * NOV_i * EPSSI * inv_phit) / CoxovPrime; + GOV_d = sqrt(2.0 * `QELE * NOVD_i * EPSSI * inv_phit) / CoxovPrime_d; + GOV2_s = GOV_s * GOV_s; + GOV2_d = GOV_d * GOV_d; + xi_ov_s = 1.0 + GOV_s * `invSqrt2; + xi_ov_d = 1.0 + GOV_d * `invSqrt2; + inv_xi_ov_s = 1.0 / xi_ov_s; + inv_xi_ov_d = 1.0 / xi_ov_d; + x_mrg_ov_s = 1.0e-5 * xi_ov_s; + x_mrg_ov_d = 1.0e-5 * xi_ov_d; // Mobility parameters tf_bet = pow(rTn, STBET_i); - BET_i = BET_i * CoxPrime * tf_bet; + BET_i = FACTUO_i * BETN_i * CoxPrime * tf_bet; + BETN_i = BETN_i * tf_bet; THEMU_i = THEMU_i * pow(rTn, STTHEMU_i); tf_mue = pow(rTn, STMUE_i); MUE_i = MUE_i * tf_mue; @@ -1166,7 +1586,7 @@ analog begin CS_i = CS_i * tf_cs; tf_xcor = pow(rTn, STXCOR_i); XCOR_i = XCOR_i * tf_xcor; - E_eff0 = 1.0e-8 * CoxPrime / `EPSSI; + E_eff0 = 1.0e-8 * CoxPrime / EPSSI; eta_mu = 0.5 * FETA_i; if (CHNL_TYPE == `PMOS) begin eta_mu = `oneThird * FETA_i; @@ -1192,10 +1612,12 @@ analog begin tf_ig = pow(rT, STIG_i); IGINV_i = IGINV_i * tf_ig; IGOV_i = IGOV_i * tf_ig; + IGOVD_i = IGOVD_i * tf_ig; inv_CHIB = 1.0 / CHIB_i; tempM = 4.0 * `oneThird * sqrt(2 * `QELE * `MELE * CHIB_i) / `HBAR; BCH = tempM * TOX_i; BOV = tempM * TOXOV_i; + BOV_d = tempM * TOXOVD_i; GCQ = 0; if (GC3_i < 0) begin GCQ = -0.495 * GC2_i / GC3_i; @@ -1205,91 +1627,195 @@ analog begin Dov = GCO_i * phit; // GIDL - AGIDL_i = AGIDL_i * 4e-18 / (TOXOV_i * TOXOV_i); + AGIDLs = AGIDL_i * 4e-18 / (TOXOV_i * TOXOV_i); + AGIDLDs = AGIDLD_i * 4e-18 / (TOXOVD_i * TOXOVD_i); tempM = `MAX(1.0 + STBGIDL_i * dT, 0); - BGIDL_i = BGIDL_i * tempM * TOXOV_i * 5e8; + BGIDL_T = BGIDL_i * tempM; + BGIDLs = BGIDL_T * TOXOV_i * 5e8; + tempM = `MAX(1.0 + STBGIDLD_i * dT, 0); + BGIDLD_T = BGIDLD_i * tempM; + BGIDLDs = BGIDLD_T * TOXOVD_i * 5e8; // Noise nt = FNT_i * 4 * `KBOL * TKD; Cox_over_q = CoxPrime / `QELE; Sfl_prefac = phit * phit * BET_i / Cox_over_q; + fac_exc = `MELE * 1e9 * FNTEXC_i; // Additional internal parameters x1 = 1.25; - inv_xg1 = 1.0 / (x1 + GOV * 7.324648775608221e-1); // = 1.0/(x1+GOV*sqrt(exp(-x1)+x1-1)); -`ifdef NQSmodel + inv_xg1_s = 1.0 / (x1 + GOV_s * 7.324648775608221e-1); // = 1.0/(x1+GOV*sqrt(exp(-x1)+x1-1)); + inv_xg1_d = 1.0 / (x1 + GOV_d * 7.324648775608221e-1); - // NQS parameters and variables - MUNQS_i = `CLIP_LOW(MUNQS, 0.0); - RG_i = `CLIP_LOW(RG, 1.0e-6); - RBULK_i = `CLIP_LOW(RBULK, 1.0e-6); - RJUNS_i = `CLIP_LOW(RJUNS, 1.0e-6); - RJUND_i = `CLIP_LOW(RJUND, 1.0e-6); - RWELL_i = `CLIP_LOW(RWELL, 1.0e-6); + // Conductance of parasitic resistance + if (RG_i > 0.0) begin + ggate = 1.0 / RG_i; + end else begin + ggate = 0.0; + end + if (RBULK_i > 0.0) begin + gbulk = 1.0 / RBULK_i; + end else begin + gbulk = 0.0; + end + if (RJUNS_i > 0.0) begin + gjuns = 1.0 / RJUNS_i; + end else begin + gjuns = 0.0; + end + if (RJUND_i > 0.0) begin + gjund = 1.0 / RJUND_i; + end else begin + gjund = 0.0; + end + if (RWELL_i > 0.0) begin + gwell = 1.0 / RWELL_i; + end else begin + gwell = 0.0; + end - // Conductance of parasitic resistance - ggate = MULT_i / RG_i; - gbulk = MULT_i / RBULK_i; - gjuns = MULT_i / RJUNS_i; - gjund = MULT_i / RJUND_i; - gwell = MULT_i / RWELL_i; -`endif // NQSmodel // JUNCAP2 - vbimins = 0.0; - vfmins = 0.0; - vchs = 0.0; - vbbtlims = 0.0; - vbimind = 0.0; - vfmind = 0.0; - vchd = 0.0; - vbbtlimd = 0.0; - vj = 0.0; - idmult = 0.0; - vjsrh = 0.0; - zinv = 0.0; - wdep = 0.0; - wsrh = 0.0; - asrh = 0.0; - vav = 0.0; - vbi_minus_vjsrh = 0.0; - if (SWJUNCAP == 0.0) begin - ABSOURCE_i = 0.0; - LSSOURCE_i = 0.0; - LGSOURCE_i = 0.0; - ABDRAIN_i = 0.0; - LSDRAIN_i = 0.0; - LGDRAIN_i = 0.0; - VMAXS = 0.0; - VMAXD = 0.0; - end else begin - if (SWJUNCAP == 2.0) begin - ABSOURCE_i = `CLIP_LOW(AS, `AB_cliplow); - LSSOURCE_i = `CLIP_LOW(PS, `LS_cliplow); - LGSOURCE_i = juncapwidth; - ABDRAIN_i = `CLIP_LOW(AD, `AB_cliplow); - LSDRAIN_i = `CLIP_LOW(PD, `LS_cliplow); - LGDRAIN_i = juncapwidth; - end else begin - if (SWJUNCAP == 3.0) begin - ABSOURCE_i = `CLIP_LOW(AS, `AB_cliplow); - ABDRAIN_i = `CLIP_LOW(AD, `AB_cliplow); - LSSOURCE_i = `CLIP_LOW(PS - juncapwidth, `LS_cliplow); - LGSOURCE_i = juncapwidth; - LSDRAIN_i = `CLIP_LOW(PD - juncapwidth, `LS_cliplow); - LGDRAIN_i = juncapwidth; - end else begin - ABSOURCE_i = `CLIP_LOW(ABSOURCE, `AB_cliplow); - LSSOURCE_i = `CLIP_LOW(LSSOURCE, `LS_cliplow); - LGSOURCE_i = `CLIP_LOW(LGSOURCE, `LG_cliplow); - ABDRAIN_i = `CLIP_LOW(ABDRAIN, `AB_cliplow); - LSDRAIN_i = `CLIP_LOW(LSDRAIN, `LS_cliplow); - LGDRAIN_i = `CLIP_LOW(LGDRAIN, `LG_cliplow); - end - end - `JuncapInitInstance(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, VMAXS, vbimins, vchs, vfmins, vbbtlims) - `JuncapInitInstance(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, VMAXD, vbimind, vchd, vfmind, vbbtlimd) + // Initialization of JUNCAP (global) variables; required for some verilog-A compilers + vbimin_s = 0.0; + vbimin_d = 0.0; + vfmin_s = 0.0; + vfmin_d = 0.0; + vch_s = 0.0; + vch_d = 0.0; + vbbtlim_s = 0.0; + vbbtlim_d = 0.0; + VMAX_s = 0.0; + VMAX_d = 0.0; + exp_VMAX_over_phitd_s = 0.0; + exp_VMAX_over_phitd_d = 0.0; + ISATFOR1_s = 0.0; + ISATFOR1_d = 0.0; + MFOR1_s = 1.0; + MFOR1_d = 1.0; + ISATFOR2_s = 0.0; + ISATFOR2_d = 0.0; + MFOR2_s = 1.0; + MFOR2_d = 1.0; + ISATREV_s = 0.0; + ISATREV_d = 0.0; + MREV_s = 1.0; + MREV_d = 1.0; + m0flag_s = 0.0; + m0flag_d = 0.0; + xhighf1_s = 0.0; + xhighf1_d = 0.0; + expxhf1_s = 0.0; + expxhf1_d = 0.0; + xhighf2_s = 0.0; + xhighf2_d = 0.0; + expxhf2_s = 0.0; + expxhf2_d = 0.0; + xhighr_s = 0.0; + xhighr_d = 0.0; + expxhr_s = 0.0; + expxhr_d = 0.0; + zflagbot_s = 1.0; + zflagbot_d = 1.0; + zflagsti_s = 1.0; + zflagsti_d = 1.0; + zflaggat_s = 1.0; + zflaggat_d = 1.0; + + m0_rev = 0.0; + mcor_rev = 0.0; + I1_cor = 0.0; + I2_cor = 0.0; + I3_cor = 0.0; + I4_cor = 0.0; + I5_cor = 0.0; + tt0 = 0.0; + tt1 = 0.0; + tt2 = 0.0; + zfrac = 0.0; + alphaje = 0.0; + + if (SWJUNCAP > 0) begin + `JuncapInitInstance(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, idsatbot, idsatsti, idsatgat, vbibot, vbisti, vbigat, PBOT_i, PSTI_i, PGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) + `JuncapInitInstance(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, idsatbot_d, idsatsti_d, idsatgat_d, vbibot_d, vbisti_d, vbigat_d, PBOTD_i, PSTID_i, PGATD_i, VBIRBOTD_i, VBIRSTID_i, VBIRGATD_i, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) + + if (SWJUNEXP_i == 1.0) begin : JUNCAPexpressInit + // The variables in the macro below are (re-)declared LOCALLY, to keep + // them separated from their globally declared counterparts. This trick + // allows one to use the "juncapcommon" macro both in the JUNCAP-express + // initialization and in the full-JUNCAP evaluation, while in the former + // the verilog-A compiler can still consider the variables as + // voltage-INdependent. This is essential to avoid recomputation of the + // JUNCAP-express initialization at each bias-step. +// `LocalGlobalVars + // results computed here are not used elsewhere +// real ijunbot, ijunsti, ijungat, qjunbot, qjunsti, qjungat; + + // Initialization of (local) variables; required for some verilog-A compilers + ysq = 0.0; + terfc = 0.0; + erfcpos = 0.0; + h1 = 0.0; + h2 = 0.0; + h2d = 0.0; + h3 = 0.0; + h4 = 0.0; + h5 = 0.0; + idmult = 0.0; + vj = 0.0; + z = 0.0; + zinv = 0.0; + two_psistar = 0.0; + vjlim = 0.0; + vjsrh = 0.0; + vbbt = 0.0; + vav = 0.0; + tmp = 0.0; + id = 0.0; + isrh = 0.0; + vbi_minus_vjsrh = 0.0; + wsrhstep = 0.0; + dwsrh = 0.0; + wsrh = 0.0; + wdep = 0.0; + asrh = 0.0; + itat = 0.0; + btat = 0.0; + twoatatoverthreebtat = 0.0; + umaxbeforelimiting = 0.0; + umax = 0.0; + sqrtumax = 0.0; + umaxpoweronepointfive = 0.0; + wgamma = 0.0; + wtat = 0.0; + ktat = 0.0; + ltat = 0.0; + mtat = 0.0; + xerfc = 0.0; + erfctimesexpmtat = 0.0; + gammamax = 0.0; + ibbt = 0.0; + Fmaxr = 0.0; + fbreakdown = 0.0; + qjunbot = 0.0; + qjunsti = 0.0; + qjungat = 0.0; + + // Computation of JUNCAP-express internal parameters + `JuncapExpressInit1(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, VJUNREF_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) + `JuncapExpressInit2(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s) + `JuncapExpressInit3(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, idsatbot, idsatsti, idsatgat, ISATFOR1_s, MFOR1_s, ISATFOR2_s, MFOR2_s, ISATREV_s, MREV_s, m0flag_s) + `JuncapExpressInit4(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, FJUNQ_i, cjobot, cjosti, cjogat, zflagbot_s, zflagsti_s, zflaggat_s) + `JuncapExpressInit5(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, ISATFOR1_s, ISATFOR2_s, ISATREV_s, xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s) + + `JuncapExpressInit1(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, VJUNREFD_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) + `JuncapExpressInit2(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d) + `JuncapExpressInit3(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, idsatbot_d, idsatsti_d, idsatgat_d, ISATFOR1_d, MFOR1_d, ISATFOR2_d, MFOR2_d, ISATREV_d, MREV_d, m0flag_d) + `JuncapExpressInit4(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, FJUNQD_i, cjobot_d, cjosti_d, cjogat_d, zflagbot_d, zflagsti_d, zflaggat_d) + `JuncapExpressInit5(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, ISATFOR1_d, ISATFOR2_d, ISATREV_d, xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d) + end // JUNCAPexpressInit + end @@ -1301,844 +1827,882 @@ analog begin // ///////////////////////////////////////////////////////////////////////////// - begin : evaluateStatic - // Initialisation of some variables - SP_S_x1 = 0.0; - x_s = 0.0; - sqm = 0.0; - alpha = 0.0; - eta_p = 1.0; - xitsb = 0.0; - rhob = 0.0; - GdL = 1.0; - FdL = 1.0; - Gmob = 1.0; - Gmob_dL = 1.0; - Udse = 0.0; - QCLM = 0.0; - thesat1 = 0.0; - Gvsat = 1.0; - Gvsatinv = 1.0; - xgm = 0.0; - dps = 0.0; - qim = 0.0; - qim1 = 0.0; - H = 1.0; - xs_ov = 0.0; - xd_ov = 0.0; - Vovs = 0.0; - Vovd = 0.0; - Iimpact = 0.0; - mavl = 0.0; + begin : evaluateblock +// real alpha, eta_p, xitsb, FdL, Gmob, Gmob_dL, Gvsat, Gvsatinv, dps, qim, qim1; +// real H, Iimpact, mavl, Ids, Vdse, Igsov, Igdov, Igcs, Igcd, xg, sigVds; +// real COX_qm; +// real ijun_s, ijunbot_s, ijunsti_s, ijungat_s; +// real ijun_d, ijunbot_d, ijunsti_d, ijungat_d; +// real qjun_s, qjunbot_s, qjunsti_s, qjungat_s; +// real qjun_d, qjunbot_d, qjunsti_d, qjungat_d; +// real jnoise_s, jnoise_d; + begin : evaluateStatic + + // Initialisation of some variables + SP_S_x1 = 0.0; + x_s = 0.0; + sqm = 0.0; + alpha = 0.0; + eta_p = 1.0; + xitsb = 0.0; + rhob = 0.0; + GdL = 1.0; + FdL = 1.0; + Gmob = 1.0; + Gmob_dL = 1.0; + Udse = 0.0; + QCLM = 0.0; + thesat1 = 0.0; + Gvsat = 1.0; + Gvsatinv = 1.0; + xgm = 0.0; + dps = 0.0; + qim = 0.0; + qim1 = 0.0; + H = 1.0; + xs_ov = 0.0; + xd_ov = 0.0; + Vovs = 0.0; + Vovd = 0.0; + Iimpact = 0.0; + mavl = 0.0; `ifdef NQSmodel - // Initialization of variables for NQS model - pd = 1.0; - ym = 0.0; - - Vrg = V(G ,GP); - Vrjuns = V(BS,BI); - Vrjund = V(BD,BI); - Vrbulk = V(BP,BI); - Vrwell = V(B ,BI); + // Initialization of variables for NQS model + pd = 1.0; + ym = 0.0; `endif // NQSmodel - if (CHNL_TYPE == `NMOS) begin - Vgs = V(`Gint, S); - Vds = V(D, S); - Vsb = V(S, `Bint); - Vjuns = -V(S, `Bjs); - Vjund = -V(D, `Bjd); - end else begin - Vgs = -V(`Gint, S); - Vds = -V(D, S); - Vsb = -V(S, `Bint); - Vjuns = V(S, `Bjs); - Vjund = V(D, `Bjd); - end - // Source-drain interchange - sigVds = 1.0; - if (Vds < 0.0) begin - sigVds = -1.0; - Vgs = Vgs - Vds; - Vsb = Vsb + Vds; - Vds = -Vds; - end - - Vgd = Vgs - Vds; - Vdb = Vds + Vsb; - Vgb = Vgs + Vsb; - - xgs_ov = -Vgs * inv_phit; - xgd_ov = -Vgd * inv_phit; - - // 4.2.1 Conditioning of terminal voltages - temp = `MINA(Vdb, Vsb, bphi) + phix; - Vsbstar = Vsb - `MINA(temp, 0, aphi) + phix1; - Vdbstar = Vds + Vsbstar; - Vgbstar = Vgs + Vsbstar; - Vgb1 = Vgbstar - VFB_i; - Vdsx = sqrt(Vds * Vds + 0.01) - 0.1; - Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); - delVg = CF_i * (Vdsx * (1 + CFB_i * Vsbx)); // DIBL - Vgb1 = Vgb1 + delVg; - xg = Vgb1 * inv_phit1; - - // 4.2.2 Bias dependent body factor - if (DNSUB_i > 0.0) begin - Dnsub = DNSUB_i * `MAXA(0, Vgs + Vsb - VNSUB_i, NSLP_i); - Gf = G_0 * sqrt(1.0 + Dnsub); - end else begin - Gf = G_0; - end - - // 4.2.3 Surface potential at source side - Gf2 = Gf * Gf; - inv_Gf2 = 1.0 / Gf2; - xi = 1.0 + Gf * `invSqrt2; - inv_xi = 1.0 / xi; - Ux = Vsbstar * inv_phit1; - xn_s = phib * inv_phit1 + Ux; - if (xn_s < `se) - delta_ns = exp(-xn_s); - else - delta_ns = `ke / `P3(xn_s - `se); - margin = 1e-5 * xi; - - `sp_s(x_s, xg, xn_s, delta_ns) - x_d = x_s; - x_m = x_s; - x_ds = 0.0; - - // - // Core PSP current calculation - // - if (xg <= 0.0) begin - qis = 0.0; - Ids = 0.0; - xgm = xg - x_s; - Voxm = xgm * phit1; - qeff = Voxm; - Vdsat = Vdsat_lim; - end else begin // (xg > 0) - delta_1s = 0.0; - temp = 1.0 / (2.0 + x_s * x_s); - xi0s = x_s * x_s * temp; - xi1s = 4.0 * (x_s * temp * temp); - xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; - if (x_s < `se05) begin - delta_1s = exp(x_s); - Es = 1.0 / delta_1s; - delta_1s = delta_ns * delta_1s; - end else if (x_s > (xn_s - `se05)) begin - delta_1s = exp(x_s - xn_s); - Es = delta_ns / delta_1s; + if (CHNL_TYPE == `NMOS) begin + Vgs = V(GP, S); + Vds = V(D, S); + Vsb = V(S, BP); + Vjun_s = -V(S, BS); + Vjun_d = -V(D, BD); end else begin - delta_1s = `ke05 / `P3(xn_s - x_s - `se05); - Es = `ke05 / `P3(x_s - `se05); + Vgs = -V(GP, S); + Vds = -V(D, S); + Vsb = -V(S, BP); + Vjun_s = V(S, BS); + Vjun_d = V(D, BD); end - Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); - if (x_s < 1.0e-5) begin - Ps = 0.5 * (x_s * x_s * (1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s)))); - Ds = `oneSixth * (delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s)); - temp = sqrt(1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s))); - sqm = `invSqrt2 * (x_s * temp); - alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * (x_s * x_s)) / temp; - end else begin - Ps = x_s - 1.0 + Es; - sqm = sqrt(Ps); - alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); - end - Em = Es; - Ed = Em; - Dm = Ds; - Dd = Dm; - // 4.2.4 Drain saturation voltage - Rxcor = (1.0 + 0.2 * XCOR_i * Vsbx) / (1.0 + XCOR_i * Vsbx); - if ( Ds > `ke05) begin - xgs = Gf * sqrt(Ps + Ds); - qis = Gf2 * Ds * phit1 / (xgs + Gf * sqm); - qbs = sqm * Gf * phit1; - if (RSB_i < 0) begin - rhob = 1.0 / (1.0 - RSB_i * Vsbx); + // Voltages NOT subject to S/D-interchange + VgsPrime = Vgs; + VsbPrime = Vsb; + VdbPrime = Vds + Vsb; + VgdPrime = Vgs - Vds; + xgs_ov = -VgsPrime * inv_phit; + xgd_ov = -VgdPrime * inv_phit; + + // Source-drain interchange + sigVds = 1.0; + if (Vds < 0.0) begin + sigVds = -1.0; + Vgs = Vgs - Vds; + Vsb = Vsb + Vds; + Vds = -Vds; + end + + Vdb = Vds + Vsb; + + // 4.2.1 Conditioning of terminal voltages + temp = `MINA(Vdb, Vsb, bphi) + phix; + Vsbstar = Vsb - `MINA(temp, 0, aphi) + phix1; + Vgbstar = Vgs + Vsbstar; + Vgb1 = Vgbstar - VFB_i; + Vdsx = sqrt(Vds * Vds + 0.01) - 0.1; + Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); + delVg = CF_i * (Vdsx * (1 + CFB_i * Vsbx)); // DIBL + Vgb1 = Vgb1 + delVg; + xg = Vgb1 * inv_phit1; + + + // 4.2.2 Bias dependent body factor + if (DNSUB_i > 0.0) begin + Dnsub = DNSUB_i * `MAXA(0, Vgs + Vsb - VNSUB_i, NSLP_i); + Gf = G_0 * sqrt(1.0 + Dnsub); + end else begin + Gf = G_0; + end + + // 4.2.3 Surface potential at source side + Gf2 = Gf * Gf; + inv_Gf2 = 1.0 / Gf2; + xi = 1.0 + Gf * `invSqrt2; + inv_xi = 1.0 / xi; + Ux = Vsbstar * inv_phit1; + xn_s = phib * inv_phit1 + Ux; + if (xn_s < `se) + delta_ns = exp(-xn_s); + else + delta_ns = `ke / `P3(xn_s - `se); + margin = 1e-5 * xi; + + `sp_s(x_s, xg, xn_s, delta_ns) + x_d = x_s; + x_m = x_s; + x_ds = 0.0; + + // + // Core PSP current calculation + // + if (xg <= 0.0) begin + qis = 0.0; + Ids = 0.0; + xgm = xg - x_s; + Voxm = xgm * phit1; + qeff = Voxm; + Vdsat = Vdsat_lim; + Vdse = Vds; + end else begin // (xg > 0) + delta_1s = 0.0; + temp = 1.0 / (2.0 + x_s * x_s); + xi0s = x_s * x_s * temp; + xi1s = 4.0 * (x_s * temp * temp); + xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; + if (x_s < `se05) begin + delta_1s = exp(x_s); + Es = 1.0 / delta_1s; + delta_1s = delta_ns * delta_1s; + end else if (x_s > (xn_s - `se05)) begin + delta_1s = exp(x_s - xn_s); + Es = delta_ns / delta_1s; end else begin - rhob = 1.0 + RSB_i * Vsbx; + delta_1s = `ke05 / `P3(xn_s - x_s - `se05); + Es = `ke05 / `P3(x_s - `se05); end + Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); + if (x_s < 1.0e-5) begin + Ps = 0.5 * (x_s * x_s * (1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s)))); + Ds = `oneSixth * (delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s)); + temp = sqrt(1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s))); + sqm = `invSqrt2 * (x_s * temp); + alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * (x_s * x_s)) / temp; + end else begin + Ps = x_s - 1.0 + Es; + sqm = sqrt(Ps); + alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); + end + Em = Es; + Ed = Em; + Dm = Ds; + Dd = Dm; + + // 4.2.4 Drain saturation voltage + Rxcor = (1.0 + 0.2 * XCOR_i * Vsbx) / (1.0 + XCOR_i * Vsbx); + if ( Ds > `ke05) begin + xgs = Gf * sqrt(Ps + Ds); + qis = Gf2 * Ds * phit1 / (xgs + Gf * sqm); + qbs = sqm * Gf * phit1; + if (RSB_i < 0) begin + rhob = 1.0 / (1.0 - RSB_i * Vsbx); + end else begin + rhob = 1.0 + RSB_i * Vsbx; + end + if (RSG_i < 0) begin + temp = 1.0 - RSG_i * qis; + end else begin + temp = 1.0 / (1.0 + RSG_i * qis); + end + GR = THER_i * (rhob * temp * qis); + Eeffm = E_eff0 * (qbs + eta_mu * qis); + Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Ps / (Ps + Ds + 1.0e-14)); + Gmob = (1.0 + Mutmp + GR) * Rxcor; + if (THESATB_i < 0) begin + xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); + end else begin + xitsb = 1.0 + THESATB_i * Vsbx; + end + temp2 = qis * xitsb; + wsat = 100.0 * (temp2 / (100.0 + temp2)); + if (THESATG_i < 0) begin + temp = 1 / (1 - THESATG_i * wsat); + end else begin + temp = 1 + THESATG_i * wsat; + end + thesat1 = THESAT_i * (temp / Gmob); + phi_inf = qis / alpha + phit1; + ysat = thesat1 * phi_inf * `invSqrt2; + if (CHNL_TYPE==`PMOS) begin + ysat = ysat / sqrt(1.0 + ysat); + end + za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); + temp1 = za * ysat; + Phi_0 = phi_inf * za * (1.0 + 0.86 * (temp1 * (1.0 - temp1 * za) / (1.0 + 4.0 * (temp1 * temp1 * za)))); + asat = xgs + 0.5 * Gf2; + Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); + Phi_0_2 = Phi_0 + Phi_2; + Phi0_Phi2 = 2.0 * (Phi_0 * Phi_2); + Phi_sat = Phi0_Phi2 / (Phi_0_2 + sqrt(Phi_0_2 * Phi_0_2 - 1.98 * Phi0_Phi2)); + Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds)); + end else begin + Vdsat = Vdsat_lim; + end + temp = pow(Vds / Vdsat, AX_i); + Vdse = Vds * pow(1.0 + temp, -inv_AX); + + // 4.2.5 Surface potential at drain side + Udse = Vdse * inv_phit1; + xn_d = xn_s + Udse; + if (Udse < `se) begin + k_ds = exp(-Udse); + end else begin + k_ds = `ke / `P3(Udse - `se); + end + delta_nd = delta_ns * k_ds; + + `sp_s_d(x_d, xg, xn_d, delta_nd) + x_ds = x_d - x_s; + + // + // Approximations for extremely small x_ds: capacitance calulation + // + if (x_ds < 1.0E-10) begin + pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); + qC = Gf2 * (1.0 - k_ds) * Ds; + temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); + temp = pC * pC - 2.0 * (temp * qC); + x_ds = 2.0 * (qC / (pC + sqrt(temp))); + x_d = x_s + x_ds; + end + dps = x_ds * phit1; // deltaPsi + + xi0d = x_d * x_d / (2.0 + x_d * x_d); + if (x_d < `se05) begin + Ed = exp(-x_d); + if (x_d < 1.0e-5) begin + Dd = `oneSixth * delta_nd * x_d * x_d * x_d * (1.0 + 1.75 * x_d); + end else begin + Dd = delta_nd * (1.0 / Ed - x_d - 1.0 - xi0d); + end + end else begin + if (x_d > (xn_d - `se05)) begin + temp = exp(x_d - xn_d); + Ed = delta_nd / temp; + Dd = temp - delta_nd * (x_d + 1.0 + xi0d); + end else begin + Ed = `ke05 / `P3(x_d - `se05); + temp = `ke05 / `P3(xn_d - x_d - `se05); + Dd = temp - delta_nd * (x_d + 1.0 + xi0d); + end + end + + // 4.2.6 Mid-point surface potential + x_m = 0.5 * (x_s + x_d); + Em = 0.0; + temp = Ed * Es; + if (temp > 0.0) begin + Em = sqrt(temp); + end + D_bar = 0.5 * (Ds + Dd); + Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2)); + + if (x_m < 1.0e-5) begin + Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)))); + xgm = Gf * sqrt(Dm + Pm); + + // 4.2.7 Polysilicon depletion + if (kp > 0.0) begin + eta_p = 1.0 / sqrt(1.0 + kp * xgm); + end // (kp > 0.0) + temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); + sqm = `invSqrt2 * (x_m * temp); + alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); + end else begin + Pm = x_m - 1.0 + Em; + xgm = Gf * sqrt(Dm + Pm); + + // 4.2.7 Polysilicon depletion + if (kp > 0.0) begin + d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2); + eta_p = 1.0 / sqrt(1.0 + kp * xgm); + temp = eta_p / (eta_p + 1.0); + x_pm = kp * (temp * temp * Gf2 * Dm); + p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); + q_pd = x_pm * (x_pm - 2.0 * xgm); + xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm)); + u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); + x_m = x_m + u_pd; + km = exp(u_pd); + Em = Em / km; + Dm = Dm * km; + Pm = x_m - 1.0 + Em; + xgm = Gf * sqrt(Dm + Pm); + help = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2); + x_ds = x_ds * km * (d0 + D_bar) / (help + km * D_bar); + dps = x_ds * phit1; + end // (kp > 0.0) + sqm = sqrt(Pm); + alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm); + end + + // 4.2.8 Potential midpoint inversion charge + qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); + + // 4.2.8 Potential midpoint inversion charge (continued) + qim1 = qim + phit1 * alpha; + qim1_1 = 1.0 / qim1; + qbm = sqm * Gf * phit1; + // Series resistance if (RSG_i < 0) begin - temp = 1.0 - RSG_i * qis; + temp = 1.0 - RSG_i * qim; end else begin - temp = 1.0 / (1.0 + RSG_i * qis); + temp = 1.0 / (1.0 + RSG_i * qim); end - GR = THER_i * (rhob * temp * qis); - Eeffm = E_eff0 * (qbs + eta_mu * qis); - Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Ps / (Ps + Ds + 1.0e-14)); + GR = THER_i * (rhob * temp * qim); + // Mobility reduction + qeff = qbm + eta_mu * qim; + Eeffm = E_eff0 * qeff; + Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Pm / (Pm + Dm + 1.0e-14)); Gmob = (1.0 + Mutmp + GR) * Rxcor; - if (THESATB_i < 0) begin - xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); - end else begin - xitsb = 1.0 + THESATB_i * Vsbx; - end - temp2 = qis * xitsb; + + // 4.2.9 Drain-source channel current + // Channel length modulation + r1 = qim * qim1_1; + r2 = phit1 * (alpha * qim1_1); + temp = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); + temp1 = ln(1.0 + Vdsx * inv_VP); + dL = ALP_i * temp; + GdL = 1.0 / (1.0 + dL + dL * dL); + dL1 = dL + ALP1_i * (qim1_1 * r1 * temp) + ALP2_i * (qbm * r2 * r2 * temp1); + FdL = (1.0 + dL1 + dL1 * dL1) * GdL; + // Velocity saturation + temp2 = qim * xitsb; wsat = 100.0 * (temp2 / (100.0 + temp2)); + Gmob_dL = Gmob * GdL; if (THESATG_i < 0) begin temp = 1 / (1 - THESATG_i * wsat); end else begin temp = 1 + THESATG_i * wsat; end - thesat1 = THESAT_i * (temp / Gmob); - phi_inf = qis / alpha + phit1; - ysat = thesat1 * phi_inf * `invSqrt2; - if (CHNL_TYPE==`PMOS) begin - ysat = ysat / sqrt(1.0 + ysat); + thesat1 = THESAT_i * (temp / Gmob_dL); + zsat = thesat1 * thesat1 * dps * dps; + if (CHNL_TYPE == `PMOS) begin + zsat = zsat / (1.0 + thesat1 * dps); end - za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); - temp1 = za * ysat; - Phi_0 = phi_inf * za * (1.0 + 0.86 * (temp1 * (1.0 - temp1 * za) / (1.0 + 4.0 * (temp1 * temp1 * za)))); - asat = xgs + 0.5 * Gf2; - Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); - Phi_0_2 = Phi_0 + Phi_2; - Phi0_Phi2 = 2.0 * (Phi_0 * Phi_2); - Phi_sat = Phi0_Phi2 / (Phi_0_2 + sqrt(Phi_0_2 * Phi_0_2 - 1.98 * Phi0_Phi2)); - Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds)); - end else begin - Vdsat = Vdsat_lim; - end - temp = pow(Vds / Vdsat, AX_i); - Vdse = Vds * pow(1.0 + temp, -inv_AX); + Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); + Gvsatinv = 1.0 / Gvsat; + // Drain-source current + Ids = BET_i * (FdL * qim1 * dps * Gvsatinv); - // 4.2.5 Surface potential at drain side - Udse = Vdse * inv_phit1; - xn_d = xn_s + Udse; - if (Udse < `se) begin - k_ds = exp(-Udse); - end else begin - k_ds = `ke / `P3(Udse - `se); - end - delta_nd = delta_ns * k_ds; + // 4.2.10 Variables for calculation of intrinsic charges and gate current + Voxm = xgm * phit1; + temp = Gmob_dL * Gvsatinv; + alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp)); + H = temp * qim1 / alpha1; - `sp_s_d(x_d, xg, xn_d, delta_nd) - x_ds = x_d - x_s; - - // - // Approximations for extremely small x_ds: capacitance calulation - // - if (x_ds < 1.0E-10) begin - pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); - qC = Gf2 * (1.0 - k_ds) * Ds; - temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); - temp = pC * pC - 2.0 * (temp * qC); - x_ds = 2.0 * (qC / (pC + sqrt(temp))); - x_d = x_s + x_ds; - end - dps = x_ds * phit1; // deltaPsi - - xi0d = x_d * x_d / (2.0 + x_d * x_d); - if (x_d < `se05) begin - Ed = exp(-x_d); - if (x_d < 1.0e-5) begin - Dd = `oneSixth * delta_nd * x_d * x_d * x_d * (1.0 + 1.75 * x_d); - end else begin - Dd = delta_nd * (1.0 / Ed - x_d - 1.0 - xi0d); - end - end else begin - if (x_d > (xn_d - `se05)) begin - temp = exp(x_d - xn_d); - Ed = delta_nd / temp; - Dd = temp - delta_nd * (x_d + 1.0 + xi0d); - end else begin - Ed = `ke05 / `P3(x_d - `se05); - temp = `ke05 / `P3(xn_d - x_d - `se05); - Dd = temp - delta_nd * (x_d + 1.0 + xi0d); - end - end - - // 4.2.6 Mid-point surface potential - x_m = 0.5 * (x_s + x_d); - Em = 0.0; - temp = Ed * Es; - if (temp > 0.0) begin - Em = sqrt(temp); - end - D_bar = 0.5 * (Ds + Dd); - Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2)); - - if (x_m < 1.0e-5) begin - Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)))); - xgm = Gf * sqrt(Dm + Pm); - - // 4.2.7 Polysilicon depletion - if (kp > 0.0) begin - eta_p = 1.0 / sqrt(1.0 + kp * xgm); - end // (kp > 0.0) - temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); - sqm = `invSqrt2 * (x_m * temp); - alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); - end else begin - Pm = x_m - 1.0 + Em; - xgm = Gf * sqrt(Dm + Pm); - - // 4.2.7 Polysilicon depletion - if (kp > 0.0) begin - d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2); - eta_p = 1.0 / sqrt(1.0 + kp * xgm); - temp = eta_p / (eta_p + 1.0); - x_pm = kp * (temp * temp * Gf2 * Dm); - p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); - q_pd = x_pm * (x_pm - 2.0 * xgm); - xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm)); - u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); - x_m = x_m + u_pd; - km = exp(u_pd); - Em = Em / km; - Dm = Dm * km; - Pm = x_m - 1.0 + Em; - xgm = Gf * sqrt(Dm + Pm); - help = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2); - x_ds = x_ds * km * (d0 + D_bar) / (help + km * D_bar); - dps = x_ds * phit1; - end // (kp > 0.0) - sqm = sqrt(Pm); - alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm); - end - - // 4.2.8 Potential midpoint inversion charge - qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); - - // 4.2.8 Potential midpoint inversion charge (continued) - qim1 = qim + phit1 * alpha; - qim1_1 = 1.0 / qim1; - qbm = sqm * Gf * phit1; - // Series resistance - if (RSG_i < 0) begin - temp = 1.0 - RSG_i * qim; - end else begin - temp = 1.0 / (1.0 + RSG_i * qim); - end - GR = THER_i * (rhob * temp * qim); - // Mobility reduction - qeff = qbm + eta_mu * qim; - Eeffm = E_eff0 * qeff; - Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Pm / (Pm + Dm + 1.0e-14)); - Gmob = (1.0 + Mutmp + GR) * Rxcor; - - // 4.2.9 Drain-source channel current - // Channel length modulation - r1 = qim * qim1_1; - r2 = phit1 * (alpha * qim1_1); - temp = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); - temp1 = ln(1.0 + Vdsx * inv_VP); - dL = ALP_i * temp; - GdL = 1.0 / (1.0 + dL + dL * dL); - dL1 = dL + ALP1_i * (qim1_1 * r1 * temp) + ALP2_i * (qbm * r2 * r2 * temp1); - FdL = (1.0 + dL1 + dL1 * dL1) * GdL; - // Velocity saturation - temp2 = qim * xitsb; - wsat = 100.0 * (temp2 / (100.0 + temp2)); - Gmob_dL = Gmob * GdL; - if (THESATG_i < 0) begin - temp = 1 / (1 - THESATG_i * wsat); - end else begin - temp = 1 + THESATG_i * wsat; - end - thesat1 = THESAT_i * (temp / Gmob_dL); - zsat = thesat1 * thesat1 * dps * dps; - if (CHNL_TYPE == `PMOS) begin - zsat = zsat / (1.0 + thesat1 * dps); - end - Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); - Gvsatinv = 1.0 / Gvsat; - // Drain-source current - Ids = BET_i * (FdL * qim1 * dps * Gvsatinv); - - // 4.2.10 Variables for calculation of intrinsic charges and gate current - Voxm = xgm * phit1; - temp = Gmob_dL * Gvsatinv; - alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp)); - H = temp * qim1 / alpha1; - - // 4.2.11 Impact-Ionization - if (SWIMPACT != 0) begin - delVsat = Vds - A3_i * dps; - if (delVsat > 0) begin - temp2 = A2_i * ((1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / delVsat); - `expl_low(-temp2, temp) - mavl = A1_i * (delVsat * temp); - Iimpact = Ids * mavl; - end - end - end // (xg > 0) - - // 4.2.12 Surface potential in gate overlap regions - if (((SWIGATE != 0) && (IGOV_i > 0)) || ((SWGIDL != 0) && (AGIDL_i > 0)) || (CGOV_i > 0)) begin - `sp_ov(xs_ov, xgs_ov) - `sp_ov(xd_ov, xgd_ov) - Vovs = -phit * (xgs_ov + xs_ov); - Vovd = -phit * (xgd_ov + xd_ov); - end - - // 4.2.13 Gate current - Igsov = 0.0; - Igdov = 0.0; - Igc = 0.0; - Igs = 0.0; - Igd = 0.0; - Igb = 0.0; - Igcs = 0.0; - Igcd = 0.0; - if (SWIGATE != 0) begin - if (IGOV_i > 0) begin - - // Gate-source overlap component of gate current - arg2mina = Vovs + Dov; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Vovs * Vovs + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-6); - end - arg1 = (3.0 + xs_ov + psi_t * inv_phit); - `expl(arg1, Dsi) - arg1 = -Vgs * inv_phit; - `expl(arg1, temp) - Dgate = Dsi * temp; - temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igsov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - - // Gate-drain overlap component of gate current - arg2mina = Vovd + Dov; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Vovd * Vovd + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-6); - end - arg1 = (3.0 + xd_ov + psi_t * inv_phit); - `expl(arg1, Dsi) - arg1 = -Vgd * inv_phit; - `expl(arg1, temp) - Dgate = Dsi * temp; - temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igdov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - end - - // Gate-channel component of gate current - if (IGINV_i > 0) begin - if (xg <= 0.0) begin - temp = pow(Vds / Vdsat_lim, AX_i); - Udse = Vds * pow(1.0 + temp, -inv_AX) * inv_phit1; - end - `expl_low(x_ds-Udse, temp) - Vm = Vsbstar + phit1 * (0.5 * x_ds - ln(0.5 * (1.0 + temp))); - - arg2mina = Voxm + Dch; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Voxm * Voxm + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-06); - end - arg1 = (x_m + (psi_t - alpha_b - Vm) * inv_phit1); - `expl(arg1,Dsi) - arg1 = -(Vgs + Vsbstar - Vm) * inv_phit1; - `expl(arg1,temp) - Dgate = Dsi * temp; - temp = BCH * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igc0 = IGINV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - - // Source/drain partitioning of gate-channel current - if ((xg <= 0) || ((GC2_i == 0) && (GC3_i == 0))) begin - igc = 1.0; - igcd_h = 0.5; - end else begin - temp = GC2_i + 2.0 * GC3_i * zg; - u0 = CHIB_i / (temp * BCH); - x = 0.5 * (dps / u0); - u0_div_H = u0 / H; - Bg = u0_div_H * (1.0 - u0_div_H) * 0.5; - Ag = 0.5 - 3.0 * Bg; - if (x < 1.0e-3) begin - xsq = x * x; - igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H))); - igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg))))); - end else begin - inv_x = 1.0 / x; - `expl(x, ex) - inv_ex = 1.0 / ex; - temp = ex - inv_ex; - temp2 = ex + inv_ex; - igc = 0.5 * ((1.0 - u0_div_H) * temp * inv_x + u0_div_H * temp2); - igcd_h = 0.5 * (igc - temp * (Bg - Ag * inv_x * inv_x) - Ag * temp2 * inv_x); + // 4.2.11 Impact-Ionization + if (SWIMPACT != 0) begin + delVsat = Vds - A3_i * dps; + if (delVsat > 0) begin + temp2 = A2_i * ((1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / (delVsat + 1e-30)); + `expl(-temp2, temp) + mavl = A1_i * (delVsat * temp); + Iimpact = Ids * mavl; end end - Sg = 0.5 * (1.0 + xg / sqrt(xg * xg + 1.0e-6)); - Igc = Igc0 * igc * Sg; - Igcd = Igc0 * igcd_h * Sg; - Igcs = Igc - Igcd; - Igb = Igc0 * igc * (1.0 - Sg); - end // (IGINV >0) - Igs = Igsov + Igcs; - Igd = Igdov + Igcd; - end // (SWIGATE != 0) + end // (xg > 0) - // 4.2.14 GIDL/GISL current - Igidl = 0.0; - Igisl = 0.0; - if ((SWGIDL != 0) && (AGIDL_i > 0)) begin - - // GIDL current computation - if (Vovd < 0) begin - Vtovd = sqrt(Vovd * Vovd + CGIDL_i * CGIDL_i * (Vdb * Vdb) + 1.0e-6); - temp = -BGIDL_i / Vtovd; - `expl_low(temp, temp2) - Igidl = -AGIDL_i * (Vdb * Vovd * Vtovd * temp2); + // 4.2.12 Surface potential in gate overlap regions + if (((SWIGATE != 0) && ((IGOV_i > 0) || (IGOVD_i > 0))) || ((SWGIDL != 0) && ((AGIDL_i > 0) || (AGIDLD_i > 0))) || (CGOV_i > 0) || (CGOVD_i > 0)) begin + `ChangeToSource + `sp_ov(xs_ov, xgs_ov) + `ChangeToDrain + `sp_ov(xd_ov, xgd_ov) + Vovs = -phit * (xgs_ov + xs_ov); + Vovd = -phit * (xgd_ov + xd_ov); end - // GISL current computation - if (Vovs < 0) begin - Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * (Vsb * Vsb) + 1.0e-6); - temp = -BGIDL_i / Vtovs; - `expl_low(temp, temp2) - Igisl = -AGIDL_i * (Vsb * Vovs * Vtovs * temp2); - end - end // (SWGIDL != 0) + // 4.2.13 Gate current + Igsov = 0.0; + Igdov = 0.0; + Igc = 0.0; + Igb = 0.0; + Igcs = 0.0; + Igcd = 0.0; + if (SWIGATE != 0) begin + if (IGOV_i > 0) begin - end // evaluateStatic - - - ///////////////////////////////////////////////////////////////////////////// - // - // AC bias dependent quantities (calculations for charge contribs) - // - ///////////////////////////////////////////////////////////////////////////// - - begin : evaluateDynamic - - // 4.2.16 Quantum mechanical corrections - COX_qm = COX_i; - if (qq > 0.0) begin - COX_qm = COX_i / (1.0 + qq * pow(qeff * qeff + qlim2, -1.0 * `oneSixth)); - end - - // 4.2.17 Intrinsic charge model - if (xg <= 0.0) begin - QG = Voxm; - QI = 0.0; - QD = 0.0; - QB = QG; - end else begin - Fj = 0.5 * (dps / H); - Fj2 = Fj * Fj; - QCLM = (1.0 - GdL) * (qim - 0.5 * (alpha * dps)); - QG = Voxm + 0.5 * (eta_p * dps * (Fj * GdL * `oneThird - 1.0 + GdL)); - temp = alpha * dps * `oneSixth; - QI = GdL * (qim + temp * Fj) + QCLM; - QD = 0.5 * (GdL * GdL * (qim - temp * (1.0 - Fj - 0.2 * Fj2)) + QCLM * (1.0 + GdL)); - QB = QG - QI; - end - Qg = QG * COX_qm; - Qd = -QD * COX_qm; - Qb = -QB * COX_qm; - - // 4.2.18 Extrinsic charge model - Qgs_ov = CGOV_i * Vovs; - Qgd_ov = CGOV_i * Vovd; - Qgb_ov = CGBOV_i * Vgb; - - // Outer fringe charge - Qfgs = CFR_i * Vgs; - Qfgd = CFR_i * Vgd; -`ifdef NQSmodel - - // Variables for NQS model - Gp = 0.0; - Gp2 = 0.0; - a_factrp = 0.0; - marginp = 0.0; - if (SWNQS_i != 0) begin - if (xg <= 0.0) begin - ym = 0.5; - pd = 1.0; - Gp = Gf; - end else begin - ym = 0.5 * ( 1.0 + 0.25 * (dps / H)); - pd = xgm / (xg - x_m); - Gp = Gf / pd; + // Gate-source overlap component of gate current + arg2mina = Vovs + Dov; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Vovs * Vovs + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-6); + end + arg1 = (3.0 + xs_ov + psi_t * inv_phit); + `expl(arg1, Dsi) + arg1 = -VgsPrime * inv_phit; + `expl(arg1, temp) + Dgate = Dsi * temp; + temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Igsov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); end - Gp2 = Gp * Gp; - a_factrp = 1.0 + Gp * `invSqrt2; - marginp = 1e-5 * a_factrp; + + if (IGOVD_i > 0) begin + + // Gate-drain overlap component of gate current + arg2mina = Vovd + Dov; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Vovd * Vovd + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-6); + end + arg1 = (3.0 + xd_ov + psi_t * inv_phit); + `expl(arg1, Dsi) + arg1 = -VgdPrime * inv_phit; + `expl(arg1, temp) + Dgate = Dsi * temp; + temp = BOV_d * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Igdov = IGOVD_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); + end + + // Gate-channel component of gate current + if (IGINV_i > 0) begin + if (xg <= 0.0) begin + temp = pow(Vds / Vdsat_lim, AX_i); + Udse = Vds * pow(1.0 + temp, -inv_AX) * inv_phit1; + end + `expl_low(x_ds-Udse, temp) + Vm = Vsbstar + phit1 * (0.5 * x_ds - ln(0.5 * (1.0 + temp))); + + arg2mina = Voxm + Dch; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Voxm * Voxm + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-06); + end + arg1 = (x_m + (psi_t - alpha_b - Vm) * inv_phit1); + `expl(arg1,Dsi) + arg1 = -(Vgs + Vsbstar - Vm) * inv_phit1; + `expl(arg1,temp) + Dgate = Dsi * temp; + temp = BCH * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Igc0 = IGINV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); + + // Source/drain partitioning of gate-channel current + if ((xg <= 0) || ((GC2_i == 0) && (GC3_i == 0))) begin + igc = 1.0; + igcd_h = 0.5; + end else begin + temp = GC2_i + 2.0 * GC3_i * zg; + u0 = CHIB_i / (temp * BCH); + x = 0.5 * (dps / u0); + u0_div_H = u0 / H; + Bg = u0_div_H * (1.0 - u0_div_H) * 0.5; + Ag = 0.5 - 3.0 * Bg; + if (x < 1.0e-3) begin + xsq = x * x; + igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H))); + igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg))))); + end else begin + inv_x = 1.0 / x; + `expl(x, ex) + inv_ex = 1.0 / ex; + temp = ex - inv_ex; + temp2 = ex + inv_ex; + igc = 0.5 * ((1.0 - u0_div_H) * temp * inv_x + u0_div_H * temp2); + igcd_h = 0.5 * (igc - temp * (Bg - Ag * inv_x * inv_x) - Ag * temp2 * inv_x); + end + end + Sg = 0.5 * (1.0 + xg / sqrt(xg * xg + 1.0e-6)); + Igc = Igc0 * igc * Sg; + Igcd = Igc0 * igcd_h * Sg; + Igcs = Igc - Igcd; + Igb = Igc0 * igc * (1.0 - Sg); + end // (IGINV >0) + end // (SWIGATE != 0) + + // 4.2.14 GIDL/GISL current + Igidl = 0.0; + Igisl = 0.0; + if (SWGIDL != 0) begin + + // GIDL current computation + if ((AGIDLD_i > 0) && (Vovd < 0)) begin + Vtovd = sqrt(Vovd * Vovd + CGIDLD_i * CGIDLD_i * (VdbPrime * VdbPrime) + 1.0e-6); + temp = -BGIDLDs / Vtovd; + `expl_low(temp, temp2) + Igidl = -AGIDLDs * (VdbPrime * Vovd * Vtovd * temp2); + end + + // GISL current computation + if ((AGIDL_i > 0) && (Vovs < 0)) begin + Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * (VsbPrime * VsbPrime) + 1.0e-6); + temp = -BGIDLs / Vtovs; + `expl_low(temp, temp2) + Igisl = -AGIDLs * (VsbPrime * Vovs * Vtovs * temp2); + end + end // (SWGIDL != 0) + + P_D = 1 + 0.25 * (Gf * kp); + facvsb0 = phib + 2 * phit1; + facvsb = Vsbstar + facvsb0; + vts_i = VFB_i + P_D * facvsb - Vsbstar + Gf * sqrt(phit1 * facvsb ); + vth_i = vts_i - delVg; + end // evaluateStatic + + + ///////////////////////////////////////////////////////////////////////////// + // + // AC bias dependent quantities (calculations for charge contribs) + // + ///////////////////////////////////////////////////////////////////////////// + + + + begin : evaluateDynamic + + // 4.2.16 Quantum mechanical corrections + Vgb = Vgs + Vsb; + COX_qm = COX_i; + if (qq > 0.0) begin + COX_qm = COX_i / (1.0 + qq * pow(qeff * qeff + qlim2, -1.0 * `oneSixth)); end + + // 4.2.17 Intrinsic charge model + if (xg <= 0.0) begin + QG = Voxm; + QI = 0.0; + QD = 0.0; + QB = QG; + end else begin + Fj = 0.5 * (dps / H); + Fj2 = Fj * Fj; + QCLM = (1.0 - GdL) * (qim - 0.5 * (alpha * dps)); + QG = Voxm + 0.5 * (eta_p * dps * (Fj * GdL * `oneThird - 1.0 + GdL)); + temp = alpha * dps * `oneSixth; + QI = GdL * (qim + temp * Fj) + QCLM; + QD = 0.5 * (GdL * GdL * (qim - temp * (1.0 - Fj - 0.2 * Fj2)) + QCLM * (1.0 + GdL)); + QB = QG - QI; + end + Qg = QG * COX_qm; + Qd = -QD * COX_qm; + Qb = -QB * COX_qm; + + // 4.2.18 Extrinsic charge model + Qgs_ov = CGOV_i * Vovs; + Qgd_ov = CGOVD_i * Vovd; + Qgb_ov = CGBOV_i * Vgb; + + // Outer fringe charge + Qfgs = CFR_i * VgsPrime; + Qfgd = CFRD_i * VgdPrime; + +`ifdef NQSmodel + // Variables for NQS model + Gp = 0.0; + Gp2 = 0.0; + a_factrp = 0.0; + marginp = 0.0; + if (SWNQS_i != 0) begin + if (xg <= 0.0) begin + ym = 0.5; + pd = 1.0; + Gp = Gf; + end else begin + ym = 0.5 * ( 1.0 + 0.25 * (dps / H)); + pd = xgm / (xg - x_m); + Gp = Gf / pd; + end + Gp2 = Gp * Gp; + a_factrp = 1.0 + Gp * `invSqrt2; + marginp = 1e-5 * a_factrp; + end `endif // NQSmodel - end // evaluateDynamic + end // evaluateDynamic - ///////////////////////////////////////////////////////////////////////////// - // - // JUNCAP2 contribs - // - ///////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////// + // + // JUNCAP2 contribs + // + ///////////////////////////////////////////////////////////////////////////// - begin : evaluateStaticDynamic - // Source side - VAK = Vjuns; - VMAX = VMAXS; - vbimin = vbimins; - vfmin = vfmins; - vch = vchs; - vbbtlim = vbbtlims; - `juncapcommon(ABSOURCE_i,LSSOURCE_i,LGSOURCE_i,isjunbot,qsjunbot,isjunsti,qsjunsti,isjungat,qsjungat) + ijun_s = 0.0; + ijunbot_s = 0.0; + ijunsti_s = 0.0; + ijungat_s = 0.0; - // Drain side - VAK = Vjund; - VMAX = VMAXD; - vbimin = vbimind; - vfmin = vfmind; - vch = vchd; - vbbtlim = vbbtlimd; - `juncapcommon(ABDRAIN_i,LSDRAIN_i,LGDRAIN_i,idjunbot,qdjunbot,idjunsti,qdjunsti,idjungat,qdjungat) + ijun_d = 0.0; + ijunbot_d = 0.0; + ijunsti_d = 0.0; + ijungat_d = 0.0; + + qjun_s = 0.0; + qjunbot_s = 0.0; + qjunsti_s = 0.0; + qjungat_s = 0.0; + + qjun_d = 0.0; + qjunbot_d = 0.0; + qjunsti_d = 0.0; + qjungat_d = 0.0; + + begin : evaluateStaticDynamic + + if (SWJUNCAP > 0.0) begin + if (SWJUNEXP_i == 1.0) begin + `JuncapExpressCurrent(Vjun_s, MFOR1_s, ISATFOR1_s, MFOR2_s, ISATFOR2_s, MREV_s, ISATREV_s, m0flag_s, xhighf1_s, expxhf1_s, xhighf2_s, expxhf2_s, xhighr_s, expxhr_s, ijun_s) + `JuncapExpressCurrent(Vjun_d, MFOR1_d, ISATFOR1_d, MFOR2_d, ISATFOR2_d, MREV_d, ISATREV_d, m0flag_d, xhighf1_d, expxhf1_d, xhighf2_d, expxhf2_d, xhighr_d, expxhr_d, ijun_d) + begin : evaluateDynamic +// real tmpv, vjv; + `JuncapExpressCharge(Vjun_s, ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qprefsti, qprefgat, qpref2bot, qpref2sti, qpref2gat, vbiinvbot, vbiinvsti, vbiinvgat, one_minus_PBOT, one_minus_PSTI, one_minus_PGAT, vfmin_s, vch_s, zflagbot_s, zflagsti_s, zflaggat_s, qjunbot_s, qjunsti_s, qjungat_s) + `JuncapExpressCharge(Vjun_d, ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qprefsti_d, qprefgat_d, qpref2bot_d, qpref2sti_d, qpref2gat_d, vbiinvbot_d, vbiinvsti_d, vbiinvgat_d, one_minus_PBOT_d, one_minus_PSTI_d, one_minus_PGAT_d, vfmin_d, vch_d, zflagbot_d, zflagsti_d, zflaggat_d, qjunbot_d, qjunsti_d, qjungat_d) + end + end else begin + `juncapcommon(Vjun_s, ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, qprefbot, qpref2bot, vbiinvbot, one_minus_PBOT, idsatbot, CSRHBOT_i, CTATBOT_i, vbibot, wdepnulrbot, VBIRBOTinv, PBOT_i, ftdbot, btatpartbot, atatbot, one_over_one_minus_PBOT, CBBTBOT_i, VBIRBOT_i, wdepnulrinvbot, fbbtbot, VBRBOT_i, VBRinvbot, PBRBOT_i, fstopbot, slopebot, qprefsti, qpref2sti, vbiinvsti, one_minus_PSTI, idsatsti, CSRHSTI_i, CTATSTI_i, vbisti, wdepnulrsti, VBIRSTIinv, PSTI_i, ftdsti, btatpartsti, atatsti, one_over_one_minus_PSTI, CBBTSTI_i, VBIRSTI_i, wdepnulrinvsti, fbbtsti, VBRSTI_i, VBRinvsti, PBRSTI_i, fstopsti, slopesti, qprefgat, qpref2gat, vbiinvgat, one_minus_PGAT, idsatgat, CSRHGAT_i, CTATGAT_i, vbigat, wdepnulrgat, VBIRGATinv, PGAT_i, ftdgat, btatpartgat, atatgat, one_over_one_minus_PGAT, CBBTGAT_i, VBIRGAT_i, wdepnulrinvgat, fbbtgat, VBRGAT_i, VBRinvgat, PBRGAT_i, fstopgat, slopegat, VMAX_s, exp_VMAX_over_phitd_s, vbimin_s, vch_s, vfmin_s, vbbtlim_s, ijunbot_s, qjunbot_s, ijunsti_s, qjunsti_s, ijungat_s, qjungat_s) + ijun_s = ABSOURCE_i * ijunbot_s + LSSOURCE_i * ijunsti_s + LGSOURCE_i * ijungat_s; + `juncapcommon(Vjun_d, ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, qprefbot_d, qpref2bot_d, vbiinvbot_d, one_minus_PBOT_d, idsatbot_d, CSRHBOTD_i, CTATBOTD_i, vbibot_d, wdepnulrbot_d, VBIRBOTinv_d, PBOTD_i, ftdbot_d, btatpartbot_d, atatbot_d, one_over_one_minus_PBOT_d, CBBTBOTD_i, VBIRBOTD_i, wdepnulrinvbot_d, fbbtbot_d, VBRBOTD_i, VBRinvbot_d, PBRBOTD_i, fstopbot_d, slopebot_d, qprefsti_d, qpref2sti_d, vbiinvsti_d, one_minus_PSTI_d, idsatsti_d, CSRHSTID_i, CTATSTID_i, vbisti_d, wdepnulrsti_d, VBIRSTIinv_d, PSTID_i, ftdsti_d, btatpartsti_d, atatsti_d, one_over_one_minus_PSTI_d, CBBTSTID_i, VBIRSTID_i, wdepnulrinvsti_d, fbbtsti_d, VBRSTID_i, VBRinvsti_d, PBRSTID_i, fstopsti_d, slopesti_d, qprefgat_d, qpref2gat_d, vbiinvgat_d, one_minus_PGAT_d, idsatgat_d, CSRHGATD_i, CTATGATD_i, vbigat_d, wdepnulrgat_d, VBIRGATinv_d, PGATD_i, ftdgat_d, btatpartgat_d, atatgat_d, one_over_one_minus_PGAT_d, CBBTGATD_i, VBIRGATD_i, wdepnulrinvgat_d, fbbtgat_d, VBRGATD_i, VBRinvgat_d, PBRGATD_i, fstopgat_d, slopegat_d, VMAX_d, exp_VMAX_over_phitd_d, vbimin_d, vch_d, vfmin_d, vbbtlim_d, ijunbot_d, qjunbot_d, ijunsti_d, qjunsti_d, ijungat_d, qjungat_d) + ijun_d = ABDRAIN_i * ijunbot_d + LSDRAIN_i * ijunsti_d + LGDRAIN_i * ijungat_d; + end + end `ifdef NQSmodel - // Set initial conditions for NQS model + // Set initial conditions for NQS model `include "PSP102_InitNQS.include" `endif // NQSmodel - end // evaluateStaticDynamic - - - ///////////////////////////////////////////////////////////////////////////// - // - // Current contribs - // - ///////////////////////////////////////////////////////////////////////////// - - begin : loadStatic - - // 4.2.15 Total terminal currents - - // Intrinsic MOSFET current - Idse = MULT_i * Ids; - - // Gate (tunneling) current components - Igbe = MULT_i * Igb; - Igse = MULT_i * Igs; - Igde = MULT_i * Igd; - - // GIDL/GISL current - Igidle = MULT_i * Igidl; - Igisle = MULT_i * Igisl; - - // Impact ionization current - Iimpacte = MULT_i * Iimpact; - - // JUNCAP2 - isjun = MULT_i * (ABSOURCE_i * isjunbot + LSSOURCE_i * isjunsti + LGSOURCE_i * isjungat); - idjun = MULT_i * (ABDRAIN_i * idjunbot + LSDRAIN_i * idjunsti + LGDRAIN_i * idjungat); - - // Convert back for NMOS-PMOS and Source-Drain interchange - if (sigVds > 0) begin - I(D, `Bint) <+ CHNL_TYPE * (Iimpacte + Igidle); - I(D, S) <+ CHNL_TYPE * Idse; - I(`Gint, S) <+ CHNL_TYPE * Igse; - I(`Gint, D) <+ CHNL_TYPE * Igde; - I(S, `Bint) <+ CHNL_TYPE * Igisle; - end else begin - I(S, `Bint) <+ CHNL_TYPE * (Iimpacte + Igidle); - I(S, D) <+ CHNL_TYPE * Idse; - I(`Gint, D) <+ CHNL_TYPE * Igse; - I(`Gint, S) <+ CHNL_TYPE * Igde; - I(D, `Bint) <+ CHNL_TYPE * Igisle; - end - I(`Gint, `Bint) <+ CHNL_TYPE * Igbe; - I(`Bjs, S) <+ CHNL_TYPE * isjun; - I(`Bjd, D) <+ CHNL_TYPE * idjun; -`ifdef NQSmodel - I(G, GP) <+ Vrg * ggate; - I(BP, BI) <+ Vrbulk * gbulk; - I(BS, BI) <+ Vrjuns * gjuns; - I(BD, BI) <+ Vrjund * gjund; - I(B, BI) <+ Vrwell * gwell; -`endif // NQSmodel - - I(D, S) <+ Vds * `GMIN; - - end // loadStatic - - ///////////////////////////////////////////////////////////////////////////// - // - // ddt() contribs from charges (Note: MULT is handled explicitly) - // - ///////////////////////////////////////////////////////////////////////////// - - begin : loadDynamic -`ifdef NQSmodel - - // Calculate NQS charge contributions - `include "PSP102_ChargesNQS.include" -`endif // NQSmodel - - // 4.2.19 Total terminal charges - - // Intrinsic MOSFET charges - Qg = MULT_i * Qg; - Qb = MULT_i * Qb; - Qd = MULT_i * Qd; - Qs = -(Qg + Qb + Qd); - - // Total outerFringe + overlap for - // gate-source and gate-drain. - Qfgs = MULT_i * (Qfgs + Qgs_ov); - Qfgd = MULT_i * (Qfgd + Qgd_ov); - - // Gate-bulk overlap charge - Qgb_ov = MULT_i * Qgb_ov; - - // JUNCAP2 - qsjun = MULT_i * (ABSOURCE_i * qsjunbot + LSSOURCE_i * qsjunsti + LGSOURCE_i * qsjungat); - qdjun = MULT_i * (ABDRAIN_i * qdjunbot + LSDRAIN_i * qdjunsti + LGDRAIN_i * qdjungat); - - // Convert back (undo S-D interchange) - if (sigVds < 0) begin - temp = Qd; // Qd <--> Qs - Qd = Qs; - Qs = temp; - temp = Qfgd; // Qfgd <--> Qfgs - Qfgd = Qfgs; - Qfgs = temp; - end - - I(`Gint, S) <+ ddt(CHNL_TYPE * Qg); - I(`Bint, S) <+ ddt(CHNL_TYPE * Qb); - I(D, S) <+ ddt(CHNL_TYPE * Qd); - I(`Gint, S) <+ ddt(CHNL_TYPE * Qfgs); - I(`Gint, D) <+ ddt(CHNL_TYPE * Qfgd); - I(`Gint, `Bint) <+ ddt(CHNL_TYPE * Qgb_ov); - I(`Bjs, S) <+ ddt(CHNL_TYPE * qsjun); - I(`Bjd, D) <+ ddt(CHNL_TYPE * qdjun); - - end // loadDynamic - - - ///////////////////////////////////////////////////////////////////////////// - // - // Noise - // - ///////////////////////////////////////////////////////////////////////////// - - begin : noise - - // 4.2.20 Noise variable calculation - Sfl = 0.0; - mid = 0.0; - mig = 0.0; - migid = 0.0; - c_igid = 0.0; - CGeff = COX_qm * eta_p; - sqid = 0.0; - sqig = 0.0; - if ((xg > 0.0) && (MULT_i > 0) && (BET_i > 0)) begin - N1 = Cox_over_q * alpha * phit; - Nm1 = Cox_over_q * qim1; - Delta_N1 = Cox_over_q * (alpha * dps); - Sfl = (NFA_i - NFB_i * N1 + NFC_i * (N1 * N1)) * ln((Nm1 + 0.5 * Delta_N1) / (Nm1 - 0.5 * Delta_N1)); - Sfl = Sfl + (NFB_i + NFC_i * (Nm1 - 2.0 * N1)) * Delta_N1; - Sfl = Sfl_prefac * Ids * Gvsatinv * Sfl / N1; - - H0 = qim1 / alpha; - t1 = qim / qim1; - sqt2 = 0.5 * `oneSixth * (dps / H0); - t2 = sqt2 * sqt2; - r = H0 / H - 1.0; - lc = `CLIP_LOW(1.0 - 12 * (r * t2), 1e-20); - lcinv2 = 1 / (lc * lc); - g_ideal = BET_i * (FdL * qim1 * Gvsatinv); - CGeff = Gvsat * Gvsat * COX_qm * eta_p / (Gmob_dL * Gmob_dL); - mid = t1 + 12 * t2 - 24 * ((1.0 + t1) * t2 * r); - mid = `CLIP_LOW(mid, 1e-40); - mid = g_ideal * lcinv2 * mid; - mig = t1 / 12 - t2 * (t1 + 0.2 - 12 * t2) - 1.6 * (t2 * (t1 + 1.0 - 12 * t2) * r); - mig = `CLIP_LOW(mig, 1e-40); - mig = lcinv2 / g_ideal * mig; - migid = lcinv2 * sqt2 * (1.0 - 12 * t2 - (t1 + 19.2 * t2 - 12 * (t1 * t2)) * r); - sqid = sqrt(MULT_i * nt * mid); - sqig = sqrt(MULT_i * nt / mig); - c_igid = (sqid == 0) ? 0.0 : (migid * sqig / sqid); // = migid / sqrt(mig * mid); - c_igid = `CLIP_BOTH(c_igid, 0.0, 1.0); - end - shot_igsx = 2.0 * `QELE * abs(Igse); - shot_igdx = 2.0 * `QELE * abs(Igde); - shot_iavl = 2.0 * `QELE * ((mavl + 1) * abs(Iimpacte)); - // JUNCAP2 - sjnoisex = 2.0 * `QELE * abs(isjun); - djnoisex = 2.0 * `QELE * abs(idjun); - if (sigVds > 0) begin - shot_igs = shot_igsx; - shot_igd = shot_igdx; - sjnoise = sjnoisex; - djnoise = djnoisex + shot_iavl; - end else begin - shot_igs = shot_igdx; - shot_igd = shot_igsx; - sjnoise = sjnoisex + shot_iavl; - djnoise = djnoisex; - end -`ifdef NQSmodel + // Parasitic resistances (including noise) rgatenoise = nt0 * ggate; rbulknoise = nt0 * gbulk; rjunsnoise = nt0 * gjuns; rjundnoise = nt0 * gjund; rwellnoise = nt0 * gwell; -`endif // NQSmodel + end // evaluateStaticDynamic - // Important note: - // In Verilog-A, correlated noise sources can only be implemented by using two additional - // internal nodes (NOI and NOI2). When implementing PSP in a circuit simlutor, it is - // generally not necessary to retain these internal nodes and therefore (for execution - // speed reasons) should be avoided. - // Noise contribs - I(NOI2) <+ V(NOI2); - I(NOI2) <+ white_noise(c_igid, "white"); - I(NOII) <+ white_noise(sqig * sqig * (1.0 - c_igid), "white"); - I(NOII) <+ -sqig * V(NOI2); - I(NOIR) <+ V(NOIR); - I(NOIC) <+ ddt(mig * CGeff * V(NOIC)); - I(D,S) <+ flicker_noise(MULT_i * Sfl, 1.0, "flicker"); - I(D,S) <+ white_noise(sqid * sqid * (1.0 - c_igid), "white"); - I(D,S) <+ sqid * V(NOI2); - I(`Gint,S)<+ ddt(0.5 * ((1.0 + sigVds) * mig * CGeff * V(NOIC))); - I(`Gint,D)<+ ddt(0.5 * ((1.0 - sigVds) * mig * CGeff * V(NOIC))); - I(`Gint,S)<+ white_noise(shot_igs, "white"); - I(`Gint,D)<+ white_noise(shot_igd, "white"); - // JUNCAP2 - I(`Bjs,S) <+ white_noise(sjnoise, "shot"); - I(`Bjd,D) <+ white_noise(djnoise, "shot"); + ///////////////////////////////////////////////////////////////////////////// + // + // Current contribs + // + ///////////////////////////////////////////////////////////////////////////// + + begin : loadStatic + + // 4.2.15 Total terminal currents + + // Convert back for NMOS-PMOS and Source-Drain interchange + if (sigVds > 0) begin + I(D, BP) <+ CHNL_TYPE * MULT_i * Iimpact; + I(D, S) <+ CHNL_TYPE * MULT_i * Ids; + I(GP, S) <+ CHNL_TYPE * MULT_i * Igcs; + I(GP, D) <+ CHNL_TYPE * MULT_i * Igcd; + end else begin + I(S, BP) <+ CHNL_TYPE * MULT_i * Iimpact; + I(S, D) <+ CHNL_TYPE * MULT_i * Ids; + I(GP, D) <+ CHNL_TYPE * MULT_i * Igcs; + I(GP, S) <+ CHNL_TYPE * MULT_i * Igcd; + end + I(GP, BP) <+ CHNL_TYPE * MULT_i * Igb; + I(GP, S) <+ CHNL_TYPE * MULT_i * Igsov; + I(GP, D) <+ CHNL_TYPE * MULT_i * Igdov; + I(S, BP) <+ CHNL_TYPE * MULT_i * Igisl; + I(D, BP) <+ CHNL_TYPE * MULT_i * Igidl; + I(BS, S) <+ CHNL_TYPE * MULT_i * ijun_s; + I(BD, D) <+ CHNL_TYPE * MULT_i * ijun_d; + + `NonCollapsableR(ggate, RG_i, rgatenoise, G, GP) + `NonCollapsableR(gbulk, RBULK_i, rbulknoise, BP, BI) + `NonCollapsableR(gjuns, RJUNS_i, rjunsnoise, BS, BI) + `NonCollapsableR(gjund, RJUND_i, rjundnoise, BD, BI) + `NonCollapsableR(gwell, RWELL_i, rwellnoise, B, BI) + + I(D, S) <+ `GMIN * V(D, S); + + end // loadStatic + + ///////////////////////////////////////////////////////////////////////////// + // + // ddt() contribs from charges (Note: MULT is handled explicitly) + // + ///////////////////////////////////////////////////////////////////////////// + `ifdef NQSmodel - // Parasitic resistances - I(GP,G) <+ white_noise(rgatenoise, "white"); - I(BP,BI) <+ white_noise(rbulknoise, "white"); - I(BS,BI) <+ white_noise(rjunsnoise, "white"); - I(BD,BI) <+ white_noise(rjundnoise, "white"); - I(B ,BI) <+ white_noise(rwellnoise, "white"); + begin : loadStaticDynamic + // Calculate NQS charge contributions + `include "PSP102_ChargesNQS.include" + end `endif // NQSmodel - end // noise + + begin : loadDynamic + + // 4.2.19 Total terminal charges + + // Intrinsic MOSFET charges + Qs = -(Qg + Qb + Qd); + + // Total outerFringe + overlap for + // gate-source and gate-drain. + Qfgs = Qfgs + Qgs_ov; + Qfgd = Qfgd + Qgd_ov; + + // JUNCAP2 + qjun_s = ABSOURCE_i * qjunbot_s + LSSOURCE_i * qjunsti_s + LGSOURCE_i * qjungat_s; + qjun_d = ABDRAIN_i * qjunbot_d + LSDRAIN_i * qjunsti_d + LGDRAIN_i * qjungat_d; + + // Convert back (undo S-D interchange) + if (sigVds < 0) begin + temp = Qd; // Qd <--> Qs + Qd = Qs; + Qs = temp; + end + + I(GP, S) <+ ddt(CHNL_TYPE * MULT_i * Qg); + I(BP, S) <+ ddt(CHNL_TYPE * MULT_i * Qb); + I(D, S) <+ ddt(CHNL_TYPE * MULT_i * Qd); + I(GP, S) <+ ddt(CHNL_TYPE * MULT_i * Qfgs); + I(GP, D) <+ ddt(CHNL_TYPE * MULT_i * Qfgd); + I(GP, BP) <+ ddt(CHNL_TYPE * MULT_i * Qgb_ov); + I(BS, S) <+ ddt(CHNL_TYPE * MULT_i * qjun_s); + I(BD, D) <+ ddt(CHNL_TYPE * MULT_i * qjun_d); + + end // loadDynamic + + + ///////////////////////////////////////////////////////////////////////////// + // + // Noise + // + ///////////////////////////////////////////////////////////////////////////// + + begin : noise +// real sf; + + // 4.2.20 Noise variable calculation + Sfl = 0.0; + mid = 0.0; + mig = 0.0; + migid = 0.0; + c_igid = 0.0; + CGeff = COX_qm * eta_p; + sqid = 0.0; + sqig = 0.0; + if ((xg > 0.0) && (MULT_i > 0.0) && (BET_i > 0.0)) begin + N1 = Cox_over_q * alpha * phit; + Nm1 = Cox_over_q * qim1; + Delta_N1 = Cox_over_q * (alpha * dps); + Sfl = (NFA_i - NFB_i * N1 + NFC_i * (N1 * N1)) * ln((Nm1 + 0.5 * Delta_N1) / (Nm1 - 0.5 * Delta_N1)); + Sfl = Sfl + (NFB_i + NFC_i * (Nm1 - 2.0 * N1)) * Delta_N1; + Sfl = Sfl_prefac * Ids * Gvsatinv * Sfl / N1; + Sfl = `CLIP_LOW(Sfl, 0.0); + + H0 = qim1 / alpha; + t1 = qim / qim1; + sqt2 = 0.5 * `oneSixth * (dps / H0); + t2 = sqt2 * sqt2; + r = H0 / H - 1.0; + lc = `CLIP_LOW(1.0 - 12 * (r * t2), 1e-20); + lcinv2 = 1 / (lc * lc); + g_ideal = BET_i * (FdL * qim1 * Gvsatinv); + CGeff = Gvsat * Gvsat * COX_qm * eta_p / (Gmob_dL * Gmob_dL); + mid = t1 + 12 * t2 - 24 * ((1.0 + t1) * t2 * r); + mid = `CLIP_LOW(mid, 1e-40); + mid = g_ideal * lcinv2 * mid; + mig = t1 / 12.0 - t2 * (t1 + 0.2 - 12 * t2) - 1.6 * (t2 * (t1 + 1.0 - 12 * t2) * r); + mig = `CLIP_LOW(mig, 1e-40); + mig = lcinv2 / g_ideal * mig; + migid = lcinv2 * sqt2 * (1.0 - 12 * t2 - (t1 + 19.2 * t2 - 12 * (t1 * t2)) * r); + + // excess noise calculation + if (FNTEXC_i > 0) begin + // recalculate Gvsat, excluding Gmob-effect + temp2_exc = qim * xitsb; + wsat_exc = 100.0 * (temp2_exc / (100.0 + temp2_exc)); + if (THESATG_i < 0) begin + temp_exc = 1 / (1 - THESATG_i * wsat_exc); + end else begin + temp_exc = 1 + THESATG_i * wsat_exc; + end + thesat1_exc= THESAT_i * (temp_exc / Gmob); + zsat_exc = thesat1_exc * thesat1_exc * dps * dps; + if (CHNL_TYPE == `PMOS) begin + zsat_exc = zsat_exc / (1.0 + thesat1_exc * dps); + end + Gvsat_exc = 0.5 * (Gmob * (1.0 + sqrt(1.0 + 2.0 * zsat_exc))); + + gfac = Gmob / (Gvsat_exc * lc); + Sidexc = fac_exc * Ids * Vdse * gfac * gfac; + + // add excess noise to conventional thermal noise + mid = mid + Sidexc / nt0; + mig = mig + Sidexc * (1 + 12 * t2) / (12 * g_ideal * g_ideal * nt0); + migid = migid - Sidexc * sqt2 * (1 + r) / (g_ideal * nt0); + end + sqid = sqrt(nt * mid); + sqig = sqrt(nt / mig); + if (sqid == 0) begin + c_igid = 0.0; + end else begin + c_igid = migid * sqig / sqid; // = migid / sqrt(mig * mid); + end + c_igid = `CLIP_BOTH(c_igid, 0.0, 1.0); + end + shot_igcsx = 2.0 * `QELE * abs(Igcs); + shot_igcdx = 2.0 * `QELE * abs(Igcd); + shot_igsov = 2.0 * `QELE * abs(Igsov); + shot_igdov = 2.0 * `QELE * abs(Igdov); + shot_iavl = 2.0 * `QELE * ((mavl + 1) * abs(Iimpact)); + // JUNCAP2 + jnoisex_s = 2.0 * `QELE * abs(ijun_s); + jnoisex_d = 2.0 * `QELE * abs(ijun_d); + if (sigVds > 0) begin + shot_igs = shot_igcsx + shot_igsov; + shot_igd = shot_igcdx + shot_igdov; + jnoise_s = jnoisex_s; + jnoise_d = jnoisex_d + shot_iavl; + end else begin + shot_igs = shot_igcdx + shot_igsov; + shot_igd = shot_igcsx + shot_igdov; + jnoise_s = jnoisex_s + shot_iavl; + jnoise_d = jnoisex_d; + end + + sf = 1e6 * CGeff * mig; // scale-factor to keep noise at NOI2 at reasonable level + + // Important note: + // In Verilog-A, correlated noise sources can only be implemented by using two additional + // internal nodes (NOI and NOI2). When implementing PSP in a circuit simlutor, it is + // generally not necessary to retain these internal nodes and therefore (for execution + // speed reasons) should be avoided. + + // Noise contribs + I(NOI2) <+ V(NOI2); + I(NOI2) <+ white_noise(sqig * sqig * sf * sf, "igig"); + I(NOII) <+ -V(NOI2) / sf; + I(NOIR) <+ V(NOIR) / mig; + I(NOIC) <+ ddt(CGeff * V(NOIC)); + I(D,S) <+ flicker_noise(MULT_i * Sfl, EF_i, "flicker"); + I(D,S) <+ white_noise(MULT_i * sqid * sqid * (1.0 - c_igid * c_igid), "idid"); +// I(D,S) <+ sigVds * sqrt(MULT_i) * migid * V(NOI2) / sf; +// I(GP,S) <+ ddt(sqrt(MULT_i) * 0.5 * CGeff * V(NOIC)); +// I(GP,D) <+ ddt(sqrt(MULT_i) * 0.5 * CGeff * V(NOIC)); + I(GP,S) <+ white_noise(MULT_i * shot_igs, "igs"); + I(GP,D) <+ white_noise(MULT_i * shot_igd, "igd"); + // JUNCAP2 + I(BS,S) <+ white_noise(MULT_i * jnoise_s, "ibs"); + I(BD,D) <+ white_noise(MULT_i * jnoise_d, "ibd"); + end // noise -`ifdef insideADMS // OPinfo ///////////////////////////////////////////////////////////////////////////// // // Operating point info @@ -2146,23 +2710,14 @@ analog begin ///////////////////////////////////////////////////////////////////////////// begin : OPinfo - - // The output variables defined below are currently not available in - // Verilog-A, but only in the SiMKit-C-code which was generated from - // this source. Similar functionality will be available in Verilog-A - // from Verilog-A version 2.2 onwards. However, a different syntax is - // to be used (see Verilog AMS language reference manual, version 2.2, - // november 2004, Accellera). +// real temp; // Auxiliary variables - id_op = Idse + Iimpacte + Igidle - Igde; - is = -Idse + Igisle - Igse; - ig = Igse + Igde + Igbe; - ib = -Iimpacte - Igbe - Igidle - Igisle; + id_op = Ids + Iimpact - Igcd; + is = -Ids - Igcs; + ig = Igcs + Igcd + Igsov + Igdov + Igb; + ib = -Iimpact - Igb - Igidl - Igisl; - P_D = 1 + 0.25 * (Gf * kp); - facvsb0 = phib + 2 * phit1; - facvsb = Vsbstar + facvsb0; sig1k = 2 * `PI * 1000 * CGeff; sig1k = sig1k * sig1k * mig; @@ -2178,6 +2733,7 @@ analog begin // taken for derivatives w.r.t. terminal voltages when sigVds == -1. sdint = sigVds; + ctype = CHNL_TYPE; if (sigVds < 0) begin @@ -2186,179 +2742,349 @@ analog begin // SD-interchange is also done for the junctions, so that's // what is happening here. Similar precautions have to be taken // for those variables that are derivatives w.r.t. voltage branches - ise = is - idjun; - ige = ig; - ide = id_op - isjun; - ibe = ib + isjun + idjun; - ids = Idse; - idb = Iimpacte + Igidle - isjun; - isb = Igisle - idjun; - igs = Igse; - igd = Igde; - igb = Igbe; + ise = MULT_i * (is - Igdov + Igidl - ijun_d); + ige = MULT_i * ig; + ide = MULT_i * (id_op - Igsov + Igisl - ijun_s); + ibe = MULT_i * (ib + ijun_s + ijun_d); + ids = MULT_i * Ids; + idb = MULT_i * (Iimpact + Igisl - ijun_s); + isb = MULT_i * (Igidl - ijun_d); + igs = MULT_i * (Igcs + Igdov); + igd = MULT_i * (Igcd + Igsov); + igb = MULT_i * Igb; igcs = MULT_i * Igcs; igcd = MULT_i * Igcd; - iavl = Iimpacte; - igisl = Igisle; - igidl = Igidle; - - ijsbot = MULT_i * ABDRAIN_i * idjunbot; - ijsgat = MULT_i * LGDRAIN_i * idjungat; - ijssti = MULT_i * LSDRAIN_i * idjunsti; - ijs = ijsbot + ijsgat + ijssti; - ijdbot = MULT_i * ABSOURCE_i * isjunbot; - ijdgat = MULT_i * LGSOURCE_i * isjungat; - ijdsti = MULT_i * LSSOURCE_i * isjunsti; - ijd = ijdbot + ijdgat + ijdsti; + iavl = MULT_i * Iimpact; + igisl = MULT_i * Igidl; + igidl = MULT_i * Igisl; + if (SWJUNEXP_i == 1) begin + ijsbot = 0.0; + ijsgat = 0.0; + ijssti = 0.0; + ijdbot = 0.0; + ijdgat = 0.0; + ijdsti = 0.0; + idsatsbot = 0.0; + idsatssti = 0.0; + idsatsgat = 0.0; + idsatsbotd = 0.0; + idsatsstid = 0.0; + idsatsgatd = 0.0; + end else begin + ijsbot = MULT_i * ABDRAIN_i * ijunbot_d; + ijsgat = MULT_i * LGDRAIN_i * ijungat_d; + ijssti = MULT_i * LSDRAIN_i * ijunsti_d; + ijdbot = MULT_i * ABSOURCE_i * ijunbot_s; + ijdgat = MULT_i * LGSOURCE_i * ijungat_s; + ijdsti = MULT_i * LSSOURCE_i * ijunsti_s; + idsatsbot = MULT_i * ABSOURCE_i * idsatbot; + idsatssti = MULT_i * LSSOURCE_i * idsatsti; + idsatsgat = MULT_i * LGSOURCE_i * idsatgat; + idsatsbotd = MULT_i * ABDRAIN_i * idsatbot_d; + idsatsstid = MULT_i * LSDRAIN_i * idsatsti_d; + idsatsgatd = MULT_i * LGDRAIN_i * idsatgat_d; + end + ijs = MULT_i * ijun_d; + ijd = MULT_i * ijun_s; vds = Vds; vgs = Vgs; vsb = Vsb; - vto = VFB_i + P_D * facvsb0 + Gf * sqrt(phit1 * facvsb0); - vts = VFB_i + P_D * facvsb - Vsbstar + Gf * sqrt(phit1 * facvsb ); - vth = vts - delVg; + vto = VFB_i + P_D * facvsb0 + Gf * sqrt(phit1 * facvsb0); + vts = vts_i; + vth = vth_i; vgt = vgs - vth; vdss = Vdsat; vsat = Vds - vdss; - temp = Idse + Iimpacte + Igidle - Igde - isjun; // Total drain-current - gm = CHNL_TYPE * ddx(temp, V(`Gint, S)); - gmb = -CHNL_TYPE * ddx(temp, V(S, `Bint)); - gds = -CHNL_TYPE * ddx(temp, V(D, S)) - (gm + gmb); + temp = Ids + Iimpact + Igisl - Igcd - Igsov - ijun_s; // Total drain-current +`ifdef OPderiv + gm = CHNL_TYPE * MULT_i * ddx(temp, V(GP)); + gmb = CHNL_TYPE * MULT_i * ddx(temp, V(BP)); + gds = CHNL_TYPE * MULT_i * ddx(temp, V(S)); - gjs = -ddx(idjun, V(D, `Bjd)); - gjd = -ddx(isjun, V(S, `Bjs)); + gjs = MULT_i * ddx(ijun_d, V(BD)); + gjd = MULT_i * ddx(ijun_s, V(BS)); - css = CHNL_TYPE * ddx(Qd, V(D, S)); - csg = -CHNL_TYPE * ddx(Qd, V(`Gint, S)); - csb = CHNL_TYPE * ddx(Qd, V(S, `Bint)); - csd = css - csg - csb; - cgs = -CHNL_TYPE * ddx(Qg, V(D, S)); - cgg = CHNL_TYPE * ddx(Qg, V(`Gint, S)); - cgb = CHNL_TYPE * ddx(Qg, V(S, `Bint)); - cgd = cgg - cgs - cgb; - cds = -CHNL_TYPE * ddx(Qs, V(D, S)); - cdg = -CHNL_TYPE * ddx(Qs, V(`Gint, S)); - cdb = CHNL_TYPE * ddx(Qs, V(S, `Bint)); - cdd = cdg + cds + cdb; - cbs = -CHNL_TYPE * ddx(Qb, V(D, S)); - cbg = -CHNL_TYPE * ddx(Qb, V(`Gint, S)); - cbb = -CHNL_TYPE * ddx(Qb, V(S, `Bint)); - cbd = cbb - cbs - cbg; - cgsol = -CHNL_TYPE * ddx(Qfgd, V(D, S)); - cgdol = CHNL_TYPE * ddx(Qfgs, V(`Gint, S)); + css = CHNL_TYPE * MULT_i * ddx(Qd, V(D)); + csg = -CHNL_TYPE * MULT_i * ddx(Qd, V(GP)); + csb = -CHNL_TYPE * MULT_i * ddx(Qd, V(BP)); + csd = css - csg - csb; + cgs = -CHNL_TYPE * MULT_i * ddx(Qg, V(D)); + cgg = CHNL_TYPE * MULT_i * ddx(Qg, V(GP)); + cgb = -CHNL_TYPE * MULT_i * ddx(Qg, V(BP)); + cgd = cgg - cgs - cgb; + cds = -CHNL_TYPE * MULT_i * ddx(Qs, V(D)); + cdg = -CHNL_TYPE * MULT_i * ddx(Qs, V(GP)); + cdb = -CHNL_TYPE * MULT_i * ddx(Qs, V(BP)); + cdd = cdg + cds + cdb; + cbs = -CHNL_TYPE * MULT_i * ddx(Qb, V(D)); + cbg = -CHNL_TYPE * MULT_i * ddx(Qb, V(GP)); + cbb = CHNL_TYPE * MULT_i * ddx(Qb, V(BP)); + cbd = cbb - cbs - cbg; + cgsol = CHNL_TYPE * MULT_i * ddx(Qfgd, V(GP)); + cgdol = CHNL_TYPE * MULT_i * ddx(Qfgs, V(GP)); - cjsbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qdjunbot, V(D, `Bjd)); - cjsgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qdjungat, V(D, `Bjd)); - cjssti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qdjunsti, V(D, `Bjd)); - cjs = cjsbot + cjsgat + cjssti; - cjdbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qsjunbot, V(S, `Bjs)); - cjdgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qsjungat, V(S, `Bjs)); - cjdsti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qsjunsti, V(S, `Bjs)); - cjd = cjdbot + cjdgat + cjdsti; + cjsbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qjunbot_d, V(D)); + cjsgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qjungat_d, V(D)); + cjssti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qjunsti_d, V(D)); + cjs = cjsbot + cjsgat + cjssti; + cjdbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qjunbot_s, V(S)); + cjdgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qjungat_s, V(S)); + cjdsti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qjunsti_s, V(S)); + cjd = cjdbot + cjdgat + cjdsti; +`endif // OPderiv end else begin - ise = is - isjun; - ige = ig; - ide = id_op - idjun; - ibe = ib + isjun + idjun; - ids = Idse; - idb = Iimpacte + Igidle - idjun; - isb = Igisle - isjun; - igs = Igse; - igd = Igde; - igb = Igbe; + ise = MULT_i * (is - Igsov + Igisl - ijun_s); + ige = MULT_i * ig; + ide = MULT_i * (id_op - Igdov + Igidl - ijun_d); + ibe = MULT_i * (ib + ijun_s + ijun_d); + ids = MULT_i * Ids; + idb = MULT_i * (Iimpact + Igidl - ijun_d); + isb = MULT_i * (Igisl - ijun_s); + igs = MULT_i * (Igcs + Igsov); + igd = MULT_i * (Igcd + Igdov); + igb = MULT_i * Igb; igcs = MULT_i * Igcs; igcd = MULT_i * Igcd; - iavl = Iimpacte; - igisl = Igisle; - igidl = Igidle; - - ijsbot = MULT_i * ABSOURCE_i * isjunbot; - ijsgat = MULT_i * LGSOURCE_i * isjungat; - ijssti = MULT_i * LSSOURCE_i * isjunsti; - ijs = ijsbot + ijsgat + ijssti; - ijdbot = MULT_i * ABDRAIN_i * idjunbot; - ijdgat = MULT_i * LGDRAIN_i * idjungat; - ijdsti = MULT_i * LSDRAIN_i * idjunsti; - ijd = ijdbot + ijdgat + ijdsti; + iavl = MULT_i * Iimpact; + igisl = MULT_i * Igisl; + igidl = MULT_i * Igidl; + if (SWJUNEXP_i == 1) begin + ijsbot = 0.0; + ijsgat = 0.0; + ijssti = 0.0; + ijdbot = 0.0; + ijdgat = 0.0; + ijdsti = 0.0; + idsatsbot = 0.0; + idsatssti = 0.0; + idsatsgat = 0.0; + idsatsbotd = 0.0; + idsatsstid = 0.0; + idsatsgatd = 0.0; + end else begin + ijsbot = MULT_i * ABSOURCE_i * ijunbot_s; + ijsgat = MULT_i * LGSOURCE_i * ijungat_s; + ijssti = MULT_i * LSSOURCE_i * ijunsti_s; + ijdbot = MULT_i * ABDRAIN_i * ijunbot_d; + ijdgat = MULT_i * LGDRAIN_i * ijungat_d; + ijdsti = MULT_i * LSDRAIN_i * ijunsti_d; + idsatsbot = MULT_i * ABSOURCE_i * idsatbot; + idsatssti = MULT_i * LSSOURCE_i * idsatsti; + idsatsgat = MULT_i * LGSOURCE_i * idsatgat; + idsatsbotd = MULT_i * ABDRAIN_i * idsatbot_d; + idsatsstid = MULT_i * LSDRAIN_i * idsatsti_d; + idsatsgatd = MULT_i * LGDRAIN_i * idsatgat_d; + end + ijs = MULT_i * ijun_s; + ijd = MULT_i * ijun_d; vds = Vds; vgs = Vgs; vsb = Vsb; - vto = VFB_i + P_D * facvsb0 + Gf * sqrt(phit1 * facvsb0); - vts = VFB_i + P_D * facvsb - Vsbstar + Gf * sqrt(phit1 * facvsb ); - vth = vts - delVg; + vto = VFB_i + P_D * facvsb0 + Gf * sqrt(phit1 * facvsb0); + vts = vts_i; + vth = vth_i; vgt = vgs - vth; vdss = Vdsat; vsat = Vds - vdss; - temp = Idse + Iimpacte + Igidle - Igde - idjun; - gm = CHNL_TYPE * ddx(temp, V(`Gint, S)); - gmb = -CHNL_TYPE * ddx(temp, V(S, `Bint)); - gds = CHNL_TYPE * ddx(temp, V(D, S)); + temp = Ids + Iimpact + Igidl - Igcd - Igdov - ijun_d; +`ifdef OPderiv + gm = CHNL_TYPE * MULT_i * ddx(temp, V(GP)); + gmb = CHNL_TYPE * MULT_i * ddx(temp, V(BP)); + gds = CHNL_TYPE * MULT_i * ddx(temp, V(D)); - gjs = -ddx(isjun, V(S, `Bjs)); - gjd = -ddx(idjun, V(D, `Bjd)); + gjs = -MULT_i * ddx(ijun_s, V(S)); + gjd = -MULT_i * ddx(ijun_d, V(D)); - cdd = CHNL_TYPE * ddx(Qd, V(D, S)); - cdg = -CHNL_TYPE * ddx(Qd, V(`Gint, S)); - cdb = CHNL_TYPE * ddx(Qd, V(S, `Bint)); - cds = cdd - cdg - cdb; - cgd = -CHNL_TYPE * ddx(Qg, V(D, S)); - cgg = CHNL_TYPE * ddx(Qg, V(`Gint, S)); - cgb = CHNL_TYPE * ddx(Qg, V(S, `Bint)); - cgs = cgg - cgd - cgb; - csd = -CHNL_TYPE * ddx(Qs, V(D, S)); - csg = -CHNL_TYPE * ddx(Qs, V(`Gint, S)); - csb = CHNL_TYPE * ddx(Qs, V(S, `Bint)); - css = csg + csd + csb; - cbd = -CHNL_TYPE * ddx(Qb, V(D, S)); - cbg = -CHNL_TYPE * ddx(Qb, V(`Gint, S)); - cbb = -CHNL_TYPE * ddx(Qb, V(S, `Bint)); - cbs = cbb - cbd - cbg; - cgsol = CHNL_TYPE * ddx(Qfgs, V(`Gint, S)); - cgdol = -CHNL_TYPE * ddx(Qfgd, V(D, S)); + cdd = CHNL_TYPE * MULT_i * ddx(Qd, V(D)); + cdg = -CHNL_TYPE * MULT_i * ddx(Qd, V(GP)); + cdb = -CHNL_TYPE * MULT_i * ddx(Qd, V(BP)); + cds = cdd - cdg - cdb; + cgd = -CHNL_TYPE * MULT_i * ddx(Qg, V(D)); + cgg = CHNL_TYPE * MULT_i * ddx(Qg, V(GP)); + cgb = -CHNL_TYPE * MULT_i * ddx(Qg, V(BP)); + cgs = cgg - cgd - cgb; + csd = -CHNL_TYPE * MULT_i * ddx(Qs, V(D)); + csg = -CHNL_TYPE * MULT_i * ddx(Qs, V(GP)); + csb = -CHNL_TYPE * MULT_i * ddx(Qs, V(BP)); + css = csg + csd + csb; + cbd = -CHNL_TYPE * MULT_i * ddx(Qb, V(D)); + cbg = -CHNL_TYPE * MULT_i * ddx(Qb, V(GP)); + cbb = CHNL_TYPE * MULT_i * ddx(Qb, V(BP)); + cbs = cbb - cbd - cbg; + cgsol = CHNL_TYPE * MULT_i * ddx(Qfgs, V(GP)); + cgdol = CHNL_TYPE * MULT_i * ddx(Qfgd, V(GP)); - cjsbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qsjunbot, V(S, `Bjs)); - cjsgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qsjungat, V(S, `Bjs)); - cjssti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qsjunsti, V(S, `Bjs)); - cjs = cjsbot + cjsgat + cjssti; - cjdbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qdjunbot, V(D, `Bjd)); - cjdgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qdjungat, V(D, `Bjd)); - cjdsti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qdjunsti, V(D, `Bjd)); - cjd = cjdbot + cjdgat + cjdsti; + cjsbot = -MULT_i * CHNL_TYPE * ABSOURCE_i * ddx(qjunbot_s, V(S)); + cjsgat = -MULT_i * CHNL_TYPE * LGSOURCE_i * ddx(qjungat_s, V(S)); + cjssti = -MULT_i * CHNL_TYPE * LSSOURCE_i * ddx(qjunsti_s, V(S)); + cjs = cjsbot + cjsgat + cjssti; + cjdbot = -MULT_i * CHNL_TYPE * ABDRAIN_i * ddx(qjunbot_d, V(D)); + cjdgat = -MULT_i * CHNL_TYPE * LGDRAIN_i * ddx(qjungat_d, V(D)); + cjdsti = -MULT_i * CHNL_TYPE * LSDRAIN_i * ddx(qjunsti_d, V(D)); + cjd = cjdbot + cjdgat + cjdsti; +`endif // OPderiv end `ifdef LocalModel weff = 0; leff = 0; -`else +`else // LocalModel weff = WE; leff = LE; -`endif - u = (abs(gds) < 1e-18) ? 0 : (gm / gds); - rout = (abs(gds) < 1e-18) ? 0 : (1.0 / gds); - vearly = (abs(gds) < 1e-18) ? 0 : (ide / gds); - beff = (abs(vgt) < 1e-12) ? 0 : (2 * abs(ide) / (vgt * vgt)); - fug = (abs(cgg + cgsol + cgdol) < 1e-30) ? 0.0 : gm / (2 * `PI * (cgg + cgsol + cgdol)); +`endif // LocalModel - sfl = Sfl; - sqrtsff = (abs(gm) < 1e-18) ? 0 : (sqrt(MULT_i * Sfl / 1000) / gm); - sqrtsfw = (abs(gm) < 1e-18) ? 0 : (sqid / gm); - sid = sqid * sqid; - sig = MULT_i * nt * sig1k / (1 + sig1k * mig); - cigid = c_igid; - fknee = (sid == 0) ? 0 : Sfl / sid; - sigs = shot_igsx; - sigd = shot_igdx; - siavl = shot_iavl; - if (sigVds < 0) begin - ssi = djnoisex; - sdi = sjnoisex; - end else begin - ssi = sjnoisex; - sdi = djnoisex; - end +`ifdef OPderiv + if (abs(gds) < 1e-18) begin + u = 0; + rout = 0; + vearly = 0; + end else begin + u = gm / gds; + rout = 1.0 / gds; + vearly = ide / gds; + end + if (abs(vgt) < 1e-12) begin + beff = 0; + end else begin + beff = 2 * abs(ide) / (vgt * vgt); + end + if (abs(cgg + cgsol + cgdol) < 1e-30) begin + fug = 0.0; + end else begin + fug = gm / (2 * `PI * (cgg + cgsol + cgdol)); + end + rg_op = RG_i / MULT_i; + + sfl = MULT_i * Sfl; + if (abs(gm) < 1e-18) begin + sqrtsff = 0; + sqrtsfw = 0; + end else begin + sqrtsff = sqrt(MULT_i * Sfl / 1000.0) / gm; + sqrtsfw = sqrt(MULT_i) * sqid / gm; + end + sid = MULT_i * sqid * sqid; + sig = MULT_i * nt * sig1k / (1 + sig1k * mig); + cigid = c_igid; + if (sid == 0) begin + fknee = 0; + end else begin + fknee = sfl / sid; + end + siavl = MULT_i * shot_iavl; + if (sigVds < 0) begin + sigs = MULT_i * (shot_igcsx + shot_igdov); + sigd = MULT_i * (shot_igcdx + shot_igsov); + ssi = MULT_i * jnoisex_d; + sdi = MULT_i * jnoisex_s; + end else begin + sigs = MULT_i * (shot_igcsx + shot_igsov); + sigd = MULT_i * (shot_igcdx + shot_igdov); + ssi = MULT_i * jnoisex_s; + sdi = MULT_i * jnoisex_d; + end +`endif // OPderiv + + lp_vfb = VFB_i; + lp_stvfb = STVFB_i; + lp_tox = TOX_i; + lp_epsrox = EPSROX_i; + lp_neff = NEFF_i; + lp_vnsub = VNSUB_i; + lp_nslp = NSLP_i; + lp_dnsub = DNSUB_i; + lp_dphib = DPHIB_i; + lp_np = NP_i; + lp_ct = CT_i; + lp_toxov = TOXOV_i; + lp_toxovd = TOXOVD_i; + lp_nov = NOV_i; + lp_novd = NOVD_i; + lp_cf = CF_i; + lp_cfb = CFB_i; + lp_betn = BETN_i; + lp_stbet = STBET_i; + lp_mue = MUE_i; + lp_stmue = STMUE_i; + lp_themu = THEMU_i; + lp_stthemu = STTHEMU_i; + lp_cs = CS_i; + lp_stcs = STCS_i; + lp_xcor = XCOR_i; + lp_stxcor = STXCOR_i; + lp_feta = FETA_i; + lp_rs = RS_i; + lp_strs = STRS_i; + lp_rsb = RSB_i; + lp_rsg = RSG_i; + lp_thesat = THESAT_i; + lp_stthesat = STTHESAT_i; + lp_thesatb = THESATB_i; + lp_thesatg = THESATG_i; + lp_ax = AX_i; + lp_alp = ALP_i; + lp_alp1 = ALP1_i; + lp_alp2 = ALP2_i; + lp_vp = VP_i; + lp_a1 = A1_i; + lp_a2 = A2_i; + lp_sta2 = STA2_i; + lp_a3 = A3_i; + lp_a4 = A4_i; + lp_gco = GCO_i; + lp_iginv = IGINV_i; + lp_igov = IGOV_i; + lp_igovd = IGOVD_i; + lp_stig = STIG_i; + lp_gc2 = GC2_i; + lp_gc3 = GC3_i; + lp_chib = CHIB_i; + lp_agidl = AGIDL_i; + lp_agidld = AGIDLD_i; + lp_bgidl = BGIDL_T; + lp_bgidld = BGIDLD_T; + lp_stbgidl = STBGIDL_i; + lp_stbgidld = STBGIDLD_i; + lp_cgidl = CGIDL_i; + lp_cgidld = CGIDLD_i; + lp_cox = COX_i; + lp_cgov = CGOV_i; + lp_cgovd = CGOVD_i; + lp_cgbov = CGBOV_i; + lp_cfr = CFR_i; + lp_cfrd = CFRD_i; + lp_fnt = FNT_i; + lp_fntexc = FNTEXC_i; + lp_nfa = NFA_i; + lp_nfb = NFB_i; + lp_nfc = NFC_i; + lp_ef = EF_i; + lp_rg = RG_i; + lp_rbulk = RBULK_i; + lp_rwell = RWELL_i; + lp_rjuns = RJUNS_i; + lp_rjund = RJUND_i; + tk = TKD; + cjosbot = MULT_i * ABSOURCE_i * cjobot; + cjossti = MULT_i * LSSOURCE_i * cjosti; + cjosgat = MULT_i * LGSOURCE_i * cjogat; + vbisbot = vbibot; + vbissti = vbisti; + vbisgat = vbigat; + cjosbotd = MULT_i * ABDRAIN_i * cjobot_d; + cjosstid = MULT_i * LSDRAIN_i * cjosti_d; + cjosgatd = MULT_i * LGDRAIN_i * cjogat_d; + vbisbotd = vbibot_d; + vbisstid = vbisti_d; + vbisgatd = vbigat_d; +`ifdef NQSmodel + lp_munqs = MUNQS_i; +`endif // NQSmodel end // OPinfo -`endif // OPinfo + + end // evaluateblock end // analogBlock diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include new file mode 100644 index 000000000..ac83f4e6d --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_nqs_macrodefs.include @@ -0,0 +1,121 @@ +//====================================================================================== +//====================================================================================== +// Filename: PSP102_nqs_macrodefs.include +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +////////////////////////////////////////// +// +// Macros used in PSP-NQS +// +////////////////////////////////////////// + +// Function to calculate bulk charge from surface potential +`define PhiToQb(phi,Qb_tmp) \ + if (abs(phi) <= margin) \ + Qb_tmp = -0.70710678 * phi * Gf * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \ + else begin \ + `expl((-phi), temp) \ + Qb_tmp = Gf * sqrt(temp + phi - 1.0); \ + if (phi > margin) \ + Qb_tmp = -Qb_tmp; \ + end + +// Function used in fq-macro +`define PhiTod2Qis(xphi,d2Qis) \ + if (abs(xphi) <= margin) begin \ + Qb_tmp = -0.70710678 * xphi * Gf * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \ + dQbs = -0.70710678 * Gf * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \ + d2Qis = -0.235702 * Gf * (1.0 - 0.5 * xphi); \ + end else begin \ + `expl((-xphi),temp) \ + Qb_tmp = Gf * sqrt(temp + xphi - 1.0); \ + if (xphi > margin) \ + Qb_tmp = -Qb_tmp; \ + dQbs = 0.5 * Gf2 * (1.0 - temp) / Qb_tmp; \ + d2Qis = (dQbs * dQbs - 0.5 * Gf * Gf) / Qb_tmp + dQbs; \ + end + + +// Function used in QiToPhi +`define sps(sp, xg) \ + if (abs(xg) <= marginp) begin \ + sp = xg / a_factrp; \ + end else begin \ + if (xg < -marginp) begin \ + NQS_yg = -xg; \ + NQS_z = 1.25 * NQS_yg / a_factrp; \ + NQS_eta = (NQS_z + 10.0 - sqrt((NQS_z - 6.0) * (NQS_z - 6.0) + 64.0)) * 0.5; \ + NQS_a = (NQS_yg - NQS_eta) * (NQS_yg - NQS_eta) + Gp2 * (NQS_eta + 1.0); \ + NQS_c = 2.0 * (NQS_yg - NQS_eta) - Gp2; \ + NQS_tau = ln(NQS_a / Gp2) - NQS_eta; \ + `sigma(NQS_a, NQS_c, NQS_tau, NQS_eta, NQS_y0) \ + `expl(NQS_y0, NQS_D0) \ + NQS_xi = 1.0 - Gp2 * NQS_D0 * 0.5; \ + NQS_p = 2.0 * (NQS_yg - NQS_y0) + Gp2 * (NQS_D0 - 1.0); \ + NQS_q = (NQS_yg - NQS_y0) * (NQS_yg - NQS_y0) + Gp2 * (NQS_y0 + 1.0 - NQS_D0); \ + NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \ + NQS_w = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \ + sp = -(NQS_y0 + NQS_w); \ + end else begin \ + NQS_xg1 = 1.0 / ( 1.25 + 7.32464877560822e-01 * Gp); \ + NQS_A_fac = (1.25 * a_factrp * NQS_xg1 - 1.0) * NQS_xg1; \ + NQS_xbar = xg / a_factrp * (1.0 + NQS_A_fac * xg); \ + `expl(-NQS_xbar, NQS_temp) \ + NQS_w = 1.0 - NQS_temp; \ + NQS_x0 = xg + Gp2 * 0.5 - Gp * sqrt(xg + Gp2 * 0.25 - NQS_w); \ + `expl((-NQS_x0), NQS_D0) \ + NQS_xi = 1.0 - Gp2 * 0.5 * NQS_D0; \ + NQS_p = 2.0 * (xg - NQS_x0) + Gp2 * (1.0 - NQS_D0); \ + NQS_q = (xg - NQS_x0) * (xg - NQS_x0) - Gp2 * (NQS_x0 - 1.0 + NQS_D0); \ + NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \ + NQS_u = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \ + sp = NQS_x0 + NQS_u; \ + end \ + end + + +// Function to calculate surface potential from inversion charge +`define QiToPhi(Qi,xg,xphi) \ + temp = Qi / pd + xg; \ + `sps(xphi,temp) + +// Calculation of fk +`define fq(Qi,xg,dQy,d2Qy,fk) \ + `QiToPhi(Qi, xg, xphi) \ + `PhiTod2Qis(xphi, d2Qis) \ + dQis = pd - dQbs; \ + dQis_1 = 1.0 / dQis; \ + fQi = Qi * dQis_1 - 1.0; \ + dfQi = (1.0 - Qi * d2Qis * dQis_1 * dQis_1) * dQis_1; \ + fk0 = dfQi * dQy * dQy + fQi * d2Qy; \ + dpsy2 = dQy * dQy * dQis_1 * dQis_1; \ + zsat = thesat2 * dpsy2; \ + if (CHNL_TYPE == `PMOS) \ + zsat = zsat / (1.0 + thesat1 * dps); \ + temp = sqrt(1.0 + 2.0 * zsat); \ + Fvsat = 2.0 / (1.0 + temp); \ + temp1 = d2Qy - dpsy2 * d2Qis; \ + fk = Fvsat * (fk0 - zsat * fQi * temp1 * Fvsat / temp); + +// Interpolation of surface potential along channel +`define Phiy(y) \ + x_m + H * (1.0 - sqrt(1.0 - 2.0 * dps / H * ((y) - ym))) * inv_phit1 diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102.va b/src/spicelib/devices/adms/psp102/admsva/psp102.va index d2069cecf..50fff1900 100644 --- a/src/spicelib/devices/adms/psp102/admsva/psp102.va +++ b/src/spicelib/devices/adms/psp102/admsva/psp102.va @@ -4,25 +4,36 @@ //====================================================================================== //====================================================================================== // -// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. // // -// Version: 102.1, April 2007 (Simkit 2.5) +// Version: 102.5.0, December 2013 // //====================================================================================== //====================================================================================== // -// Further information can be found in the file readme.txt +// Further information can be found in the file releasenotesPSP102.txt // `include "discipline.h" -`include "SIMKIT_macrodefs.include" +`include "Common102_macrodefs.include" `include "JUNCAP200_macrodefs.include" `include "PSP102_macrodefs.include" +// Note: some verilog-A compilers have problems handling the ddx-operator, +// which occurs in definition of OP-output variables. If the line below is +// commented out, all OP-output variables using the ddx-operator are skipped. +`define OPderiv ///////////////////////////////////////////////////////////////////////////// // @@ -30,19 +41,9 @@ // ///////////////////////////////////////////////////////////////////////////// -// `undef LocalModel -// `define Binning module PSP102VA(D, G, S, B); -//`P( -// info = "PSP MOSFET Model" -// version = `VERS -// revision = `VREV -// simkit:name = "psp1020" -// simkit:desc = "psp_1020" -//) - `include "PSP102_module.include" endmodule diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102_nqs.va b/src/spicelib/devices/adms/psp102/admsva/psp102_nqs.va new file mode 100644 index 000000000..5f3949eb6 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/psp102_nqs.va @@ -0,0 +1,52 @@ +//====================================================================================== +//====================================================================================== +// Filename: psp102_nqs.va +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +`include "discipline.h" + +`define NQSmodel true + +`include "Common102_macrodefs.include" + +`include "JUNCAP200_macrodefs.include" + +`include "PSP102_macrodefs.include" + +// Note: some verilog-A compilers have problems handling the ddx-operator, +// which occurs in definition of OP-output variables. If the line below is +// commented out, all OP-output variables using the ddx-operator are skipped. +`define OPderiv + +///////////////////////////////////////////////////////////////////////////// +// +// PSP global model code +// +///////////////////////////////////////////////////////////////////////////// + +`include "PSP102_nqs_macrodefs.include" + +module PSPNQS102VA(D, G, S, B); + +`include "PSP102_module.include" + +endmodule diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102b.va b/src/spicelib/devices/adms/psp102/admsva/psp102b.va new file mode 100644 index 000000000..533057fb8 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/psp102b.va @@ -0,0 +1,50 @@ +//====================================================================================== +//====================================================================================== +// Filename: psp102b.va +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +`include "discipline.h" + +`define Binning true + +`include "Common102_macrodefs.include" + +`include "JUNCAP200_macrodefs.include" + +`include "PSP102_macrodefs.include" + +// Note: some verilog-A compilers have problems handling the ddx-operator, +// which occurs in definition of OP-output variables. If the line below is +// commented out, all OP-output variables using the ddx-operator are skipped. +`define OPderiv + +///////////////////////////////////////////////////////////////////////////// +// +// PSP global model code (binning) +// +///////////////////////////////////////////////////////////////////////////// + +module PSP102BVA(D, G, S, B); + +`include "PSP102_module.include" + +endmodule diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102b_nqs.va b/src/spicelib/devices/adms/psp102/admsva/psp102b_nqs.va new file mode 100644 index 000000000..31ab5c823 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/psp102b_nqs.va @@ -0,0 +1,54 @@ +//====================================================================================== +//====================================================================================== +// Filename: psp102b_nqs.va +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +`include "discipline.h" + +`define NQSmodel true + +`define Binning true + +`include "Common102_macrodefs.include" + +`include "JUNCAP200_macrodefs.include" + +`include "PSP102_macrodefs.include" + +// Note: some verilog-A compilers have problems handling the ddx-operator, +// which occurs in definition of OP-output variables. If the line below is +// commented out, all OP-output variables using the ddx-operator are skipped. +`define OPderiv + +///////////////////////////////////////////////////////////////////////////// +// +// PSP global model code (binning) +// +///////////////////////////////////////////////////////////////////////////// + +`include "PSP102_nqs_macrodefs.include" + +module PSPNQS102BVA(D, G, S, B); + +`include "PSP102_module.include" + +endmodule diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102e.va b/src/spicelib/devices/adms/psp102/admsva/psp102e.va new file mode 100644 index 000000000..444292e7a --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/psp102e.va @@ -0,0 +1,50 @@ +//====================================================================================== +//====================================================================================== +// Filename: psp102e.va +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +`include "discipline.h" + +`define LocalModel true + +`include "Common102_macrodefs.include" + +`include "JUNCAP200_macrodefs.include" + +`include "PSP102_macrodefs.include" + +// Note: some verilog-A compilers have problems handling the ddx-operator, +// which occurs in definition of OP-output variables. If the line below is +// commented out, all OP-output variables using the ddx-operator are skipped. +`define OPderiv + +///////////////////////////////////////////////////////////////////////////// +// +// PSP local model code +// +///////////////////////////////////////////////////////////////////////////// + +module PSP102EVA(D, G, S, B); + +`include "PSP102_module.include" + +endmodule diff --git a/src/spicelib/devices/adms/psp102/admsva/psp102e_nqs.va b/src/spicelib/devices/adms/psp102/admsva/psp102e_nqs.va new file mode 100644 index 000000000..26ed842e6 --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/psp102e_nqs.va @@ -0,0 +1,54 @@ +//====================================================================================== +//====================================================================================== +// Filename: psp102e_nqs.va +//====================================================================================== +//====================================================================================== +// +// (c) Copyright notice +// +// Since 2012 until today, PSP has been co-developed by NXP Semiconductors and +// Delft University of Technology. For this part of the model, each claim undivided +// ownership and copyrights +// Until and including 2011, PSP has been co-developed by NXP Semiconductors and +// Arizona State University. For this part of the model, NXP Semiconductors claims +// undivided ownership and copyrights. +// +// +// Version: 102.5.0, December 2013 +// +//====================================================================================== +//====================================================================================== +// +// Further information can be found in the file releasenotesPSP102.txt +// + +`include "discipline.h" + +`define NQSmodel true + +`define LocalModel true + +`include "Common102_macrodefs.include" + +`include "JUNCAP200_macrodefs.include" + +`include "PSP102_macrodefs.include" + +// Note: some verilog-A compilers have problems handling the ddx-operator, +// which occurs in definition of OP-output variables. If the line below is +// commented out, all OP-output variables using the ddx-operator are skipped. +`define OPderiv + +///////////////////////////////////////////////////////////////////////////// +// +// PSP local model code +// +///////////////////////////////////////////////////////////////////////////// + +`include "PSP102_nqs_macrodefs.include" + +module PSPNQS102EVA(D, G, S, B); + +`include "PSP102_module.include" + +endmodule diff --git a/src/spicelib/devices/adms/psp102/admsva/readme.ngspice b/src/spicelib/devices/adms/psp102/admsva/readme.ngspice deleted file mode 100644 index 3f5e3d431..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/readme.ngspice +++ /dev/null @@ -1,8 +0,0 @@ -ngspice customizations of package psp102.1 ------------------------------------------- - -- Mon Apr 30 15:28:25 WEDT 2007 (Berlin) - o renamed 'initializeModel/initializeInstance' to 'initial_model/initial_instance'. - (this issue should go away when auto-partionning done in adms.) - o redefined macro P(txt) in order to 'see' instance parameters - o status: psp code created by adms compiles diff --git a/src/spicelib/devices/adms/psp102/admsva/readme.txt b/src/spicelib/devices/adms/psp102/admsva/readme.txt deleted file mode 100644 index 5df9f5b4d..000000000 --- a/src/spicelib/devices/adms/psp102/admsva/readme.txt +++ /dev/null @@ -1,120 +0,0 @@ -====================================================================================== -====================================================================================== - - --------------------------- - Verilog-A definition of PSP - --------------------------- - - - (c) Copyright 2007, All Rights Reserved, NXP Semiconductors - - - Version: PSP 102.1 (including JUNCAP2 200.2), April 2007 (Simkit 2.5) - -====================================================================================== -====================================================================================== - - Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors Research) - R. van Langevelde (Philips Research) - G. Gildenblat, X. Li, and W. Wu (The Arizona State University) - - - -The most recent version of the model code, the documentation, and contact information -can be found on: - - http://PSPmodel.asu.edu/ -or - http://www.nxp.com/Philips_Models/ - -====================================================================================== -====================================================================================== - -This package consists of several files: - - - readme.txt This file - - - psp102.va Main file for global ("geometrical") model - - psp102b.va Main file for global binning model - - psp102e.va Main file for local ("electrical") model - - psp102_nqs.va Main file for global ("geometrical") model with NQS-effects - - psp102b_nqs.va Main file for global binning model with NQS-effects - - psp102e_nqs.va Main file for local ("electrical") model with NQS-effects - - juncap200.va Main file for JUNCAP2 stand-alone model - - - SIMKIT_macrodefs.include Common macro definitions - - PSP102_macrodefs.include Macro definitions for PSP - - PSP102_module.include Actual model code for intrinsic MOS model - - PSP102_binning.include Geometry scaling equation for binning - - PSP102_binpars.include Parameterlist for global PSP binning model - - PSP102_nqs_macrodefs.include Macro definitions for PSP-NQS - - PSP102_InitNQS.include PSP-NQS initialization code - - PSP102_ChargesNQS.include Calculation of NQS-charge contributions - - JUNCAP200_macrodefs.include Macro definitions for JUNCAP2 model - - JUNCAP200_parlist.include JUNCAP2 parameter list - - JUNCAP200_varlist.include JUNCAP2 variable declarations - - JUNCAP200_InitModel.include JUNCAP2 model initialization code - -====================================================================================== -====================================================================================== - -Usage ------ - -Depending which model one wants to use, one should compile one of the seven .va-files -(psp102.va, psp102b.va, psp102e.va, psp102_nqs.va, psp102b_nqs.va, psp102e_nqs.va, and -juncap200.va). The module names are "PSP102VA" and "PSPNQS102VA" for the global PSP-model -(QS and NQS, respectively), and similarly "PSP102BVA" and "PSPNQS102BVA" for the binning -PSP-model, "PSP102EVA" and "PSPNQS102EVA" for the local PSP-model, and "JUNCAP200" for -the JUNCAP2-model. - - -====================================================================================== -====================================================================================== - -Release notes va-code of PSP 102.1, including JUNCAP2 200.2 (April 2007) ------------------------------------------------------------------------- - -Focus in this release has been on improving the simulation speed of PSP and JUNCAP2. -The model equations in this release of PSP 102.1 are identical to those in the -October 2006 release. This version features some minor impelementation changes -w.r.t. the previous release. - -The main changes have been in the SiMKit version generated from this verilog-A -implementation: improvements in the automatic C-code generation process -and compilation of the C-code. The result is reflected in the SiMKit 2.5 version of -PSP, which shows a very significant simulation speed improvement w.r.t SiMKit 2.4. - -The minor implementation changes in the verilog-A code will have some positive effect -on the simulation speed of the verilog-A version as well. Note, however, that the -simulation speed of the verilog-A version of PSP and the improvement w.r.t. the -previous version strongly depend on the verilog-A compiler used. - -PSP 102.1 is backwards compatible with the previous version, PSP 102.0. - - -====================================================================================== -====================================================================================== - -The functionality of the Verilog-A code in this package is the same as that of the -C-code, which is contained in SIMKIT version 2.5. Note that Operating Point information -is available only in the C-code, not in Verilog-A code. - - -The PSP-NQS model is provided as Verilog-A code. In SiMKit 2.5, a test version of -the PSP-NQS model is included (identical to that in SiMKit 2.4). This implementation -circumvents the problem of the SpectreVerilog-A-generated C-code being too large to -compile. Moreover, it is computationally more efficient as it uses less rows in the -simulator matrix. On the other hand, this implementation has some known limitations. -More information is available from the authors. Further improvements are expected in -future releases. - - -This Verilog-A code of PSP is primarily intended as a source for C-code generation -using ADMS. Most of the testing has been done on the C-code which was generated from it. - - -The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale) -for their help with ADMS and the implementation of the model code. Geoffrey -Coram (Analog Devices) is acknowledged for useful comments on the Verilog-A -code. diff --git a/src/spicelib/devices/adms/psp102/admsva/releasenotesPSP102.txt b/src/spicelib/devices/adms/psp102/admsva/releasenotesPSP102.txt new file mode 100644 index 000000000..e2dbbc93a --- /dev/null +++ b/src/spicelib/devices/adms/psp102/admsva/releasenotesPSP102.txt @@ -0,0 +1,102 @@ +====================================================================================== +====================================================================================== + + --------------------------- + Verilog-A definition of PSP + --------------------------- + + + (c) Copyright notice + + Since 2012 until today, PSP has been co-developed by NXP Semiconductors and + Delft University of Technology. For this part of the model, each claim undivided + ownership and copyrights + Until and including 2011, PSP has been co-developed by NXP Semiconductors and + Arizona State University. For this part of the model, NXP Semiconductors claims + undivided ownership and copyrights. + + + Version: PSP 102.5.0 (including JUNCAP2 200.4.0), December 2013 + + This version of PSP is contained in SiMKit 4.2 + +====================================================================================== +====================================================================================== + + Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors) + R. van der Toorn (Delft University of Technology) + + Former contributers: + G. Gildenblat, W. Yao, Z. Zhu, X. Li and W. Wu (Arizona State University) + R. van Langevelde (Philips Research) + + The most recent version of the model code, the documentation, and contact + information can be found on: + + http://psp.ewi.tudelft.nl/ + +====================================================================================== +====================================================================================== + +This package consists of the following files: + + - releasenotesPSP102.txt This file + + - psp102.va Main file for global ("geometrical") model + - psp102b.va Main file for global binning model + - psp102e.va Main file for local ("electrical") model + - psp102_nqs.va Main file for global ("geometrical") model with NQS-effects + - psp102b_nqs.va Main file for global binning model with NQS-effects + - psp102e_nqs.va Main file for local ("electrical") model with NQS-effects + + - Common102_macrodefs.include Common macro definitions + - PSP102_macrodefs.include Macro definitions for PSP + - PSP102_module.include Actual model code for intrinsic MOS model + - PSP102_binning.include Geometry scaling equation for binning + - PSP102_binpars.include Parameterlist for global PSP binning model + - PSP102_nqs_macrodefs.include Macro definitions for PSP-NQS + - PSP102_InitNQS.include PSP-NQS initialization code + - PSP102_ChargesNQS.include Calculation of NQS-charge contributions + - JUNCAP200_macrodefs.include Macro definitions for JUNCAP2 model + - JUNCAP200_parlist.include JUNCAP2 parameter list + - JUNCAP200_varlist1.include JUNCAP2 variable declarations + - JUNCAP200_varlist2.include JUNCAP2 variable declarations + - JUNCAP200_InitModel.include JUNCAP2 model initialization code + +====================================================================================== +====================================================================================== + +Usage +----- + +Depending which model one wants to use, one should compile one of the seven .va-files +(psp102.va, psp102b.va, psp102e.va, psp102_nqs.va, psp102b_nqs.va, and psp102e_nqs.va). +The module names are "PSP102VA" and "PSPNQS102VA" for the global PSP-model (QS and +NQS, respectively), and similarly "PSP102BVA" and "PSPNQS102BVA" for the binning +PSP-model, "PSP102EVA" and "PSPNQS102EVA" for the local PSP-model. + +For the stand-alone version of JUNCAP2, version 200.4.0, please refer to the distribution +of PSP103. + +====================================================================================== +====================================================================================== + +Release notes vA-code of PSP 102.5.0 (December 2013) +---------------------------------------------------- + +Changes: + +- Added excess noise model. +- Solved minor numerical issue in avalanche current calculation (occurring when A4 is + large and the body is forward biased). +- Fixed missing T-scaling in OP-output variables lp_bgidl and lp_bgidld. + +PSP 102.5.0 is backwards compatible with the previous version, PSP 102.4.0. + +====================================================================================== +====================================================================================== + +The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale) +for their help with ADMS and the implementation of the model code. Geoffrey +Coram (Analog Devices) is acknowledged for input concerning the Verilog-A +implementation of the model.