//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Copyright @ 2013 Massachusetts Institute of Technology (MIT) //The terms under which the software and associated documentation (the Software) is provided are as the following: //The Software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the Software or the use or other dealings in the Software. //MIT grants, free of charge, to any users the right to modify, copy, and redistribute the Software, both within the user's organization and externally, subject to the following restrictions: //1. The users agree not to charge for the NEEDS code itself but may charge for additions, extensions, or support. //2. In any product based on the Software, the users agree to acknowledge the MIT VS GaNFET Model Research Group that developed the software. This acknowledgment shall appear in the product documentation. //3. The users agree to obey all U.S. Government restrictions governing redistribution or export of the software. //4. The users agree to reproduce any copyright notice which appears on the software on any copy or modification of such made available to others. //Agreed to by //Dimitri A. Antoniadis, MIT //Dec 23 2013 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // VerilogA for MVS-G-HV GaN HEMT model based self-consistent transport/capacitance models for HV applications // Model details: U. Radhakrishna, et al, IEDM 2013. // Implemented on 8/06/2015, 2015 by U. Radhakrishna `include "disciplines.vams" `include "constants.vams" // Mathematical Constants `define M_LN10 (2.3025850093) `define M_MAXEXP (34.0) module mvsg (d, g, s, b); inout d, g, s, b; electrical d, g, s, b; electrical di, gi, si, fp1, fp2, fp3, fp4, drc, src; thermal dt; // Instance parameters Default value Range Units Desc parameter real w = 3e3 from(0.0:inf]; // um Width per Finger parameter real l = 1.0 from(0.0:inf]; // um Length parameter real ngf = 1.0 from(0.0:inf]; // Number of Fingers // Model parameters Default value Range Units Desc parameter real version = 1.00 from[0.0:inf]; // Version parameter real tnom = 27.0 from[-273.15:inf]; // tnom for temperature model parameter integer type = 1 from[-1:1] exclude 0; // nFET=1 pFET=-1 parameter real cg = 1.70e-03 from(0.0:inf]; // F/m^2 Gate Cap/Area parameter real cifm = 0 from[0.0:inf); // F/m Inner fringing cap on each side (not used) parameter real cofsm = 1.6e-9 from[0.0:inf]; // F/m Gate - Source Outer Fringing Cap/Width parameter real cofdm = 1.0e-19 from[0.0:inf]; // F/m Gate - Drain Outer Fringing Cap/Width parameter real cofdsm = 8.0e-10 from[0.0:inf]; // F/m Source - Drain Outer Fringing Cap/Width parameter real cofdsubm = 0.0e-14 from[0.0:inf]; // F/m Sub - Drain Outer Fringing Cap/Width parameter real cofssubm = 0.0e-14 from[0.0:inf]; // F/m Sub - Source Outer Fringing Cap/Width parameter real cofgsubm = 3e-10 from[0.0:inf]; // F/m Sub - Gate Outer Fringing Cap/Width parameter real rsh = 100.0 from[-inf:inf]; // Ohms/Sq 2-DEG Sheet Resistance parameter real rcs = 0.21e-2 from[-inf:inf]; // Ohms*m Source contact resistance * Width parameter real rcd = 0.21e-2 from[-inf:inf]; // Ohms*m Drain contact resistance * Width parameter real vx0 = 1.2e5 from(0.0:inf]; // m/s Source injection velocity parameter real mu0 = 0.100 from(0.0:inf]; // m^2/Vs Low-field Mobility parameter real beta = 1.16 from(0.0:inf]; // m/s Linear to Saturation Parameter parameter real vto = -3.9 from[-inf:inf]; // V Threshold Voltage parameter real ss = 0.10 from(0.0:inf]; // V/dec Sub-threshold Slope parameter real delta1 = 0.005 from[0.0:inf]; // DIBL Coefficient parameter real delta2 = 0.00 from[0.0:inf]; // DIBL Coefficient parameter real dibsat = 10.0 from[0.0:inf]; // V DIBL Saturation Voltage parameter real nd = 0.0 from[0.0:inf]; // Punchthrough factor for Subth Slope parameter real alpha = 3.5 from[0.0:inf]; // Weak to Strong Inversion Transition Factor parameter real lambda = 0.0 from[0.0:inf]; // 1/V CLM Parameter parameter real vtheta = 0.0 from[0.0:inf]; // Scattering: velocity reduction parameter with Vg parameter real mtheta = 0.0 from[0.0:inf]; // Scattering: mobility reduction parameter with Vg parameter real vzeta = 4e-3 from[-inf:inf]; // VXO dependence on temperature parameter real vtzeta = -1e-3 from[-inf:inf]; // vto dependence on temperature parameter real epsilon = 3.0 from[0.0:inf]; // Mobility dependence on temperature parameter real rct1 = 0.0 from[-inf:inf); // Rsh and Rc temperature coefficient parameter real rct2 = 0.0 from[-inf:inf); // Rsh and Rc temperature coefficient // Source access region parameter parameter real lgs = 2.0 from[0.0:inf]; // um Source access region distance parameter real vtors = -650 from[-inf:inf]; // V SAR Threshold Voltage parameter real cgrs = 80e-5 from[0:inf]; // F/m^2 SAR to Drain Cap/Area parameter real vx0rs = 1.0e5 from(0.0:inf]; // m/s SAR Source injection velocity parameter real mu0rs = 0.100 from(0.0:inf]; // m^2/Vs SAR Low-field Mobility parameter real betars = 1.1 from(0.0:inf]; // Linear to Saturation Parameter parameter real delta1rs = 4e-4 from[0.0:inf]; // SAR DIBL Coefficient parameter real srs = 0.065 from(0.0:inf]; // V/dec SAR Sub-threshold Slope parameter real ndrs = 0.0 from[0.0:inf]; // SAR Punchthrough factor for Subth Slope parameter real vthetars = 0.0 from[0.0:inf]; // SAR Scattering: velocity reduction parameter with Vg parameter real mthetars = 0.0 from[0.0:inf]; // SAR Scattering: mobility reduction parameter with Vg parameter real alphars = 3.5 from[0.0:inf]; // SAR Weak to Strong Inversion Transition Factor // Drain access region parameter parameter real lgd = 7.0 from[0.0:inf]; // um Drain access region distance parameter real vtord = -650.0 from[-inf:inf]; // V DAR Threshold Voltage parameter real cgrd = 70e-5 from[0:inf]; // F/m^2 DAR to Drain Cap/Area parameter real vx0rd = 1.0e5 from(0.0:inf]; // m/s DAR Source injection velocity parameter real mu0rd = 0.100 from(0.0:inf]; // m^2/Vs DAR Low-field Mobility parameter real betard = 1.1 from(0.0:inf]; // Linear to Saturation Parameter parameter real delta1rd = 4e-4 from[0.0:inf]; // DAR DIBL Coefficient parameter real srd = 0.08 from(0.0:inf]; // V/dec DAR Sub-threshold Slope parameter real ndrd = 0.0 from[0.0:inf]; // DAR Punchthrough factor for Subth Slope parameter real vthetard = 0.0 from[0.0:inf]; // DAR Scattering: velocity reduction parameter with Vg parameter real mthetard = 0.0 from[0.0:inf]; // DAR Scattering: mobility reduction parameter with Vg parameter real alphard = 3.5 from[0.0:inf]; // DAR Weak to Strong Inversion Transition Factor // Field-Plate 1 parameters parameter integer flagfp1 = 1 from[0:1]; // Flag parameter: GFP=1 or SFP=0 parameter real lgfp1 = 3.5 from[0.0:inf]; // um FP Length parameter real vtofp1 = -44.5 from[-inf:inf]; // V FP Threshold Voltage parameter real cgfp1 = 2.0e-4 from[0:inf]; // F/m^2 FP to Drain Cap/Area parameter integer flagfp1s = 1 from[0:1]; // Flag parameter: cfp1s select=1 or cfp1s not select=0 parameter real cfp1s = 1e-19 from[0:inf]; // F/m FP (source-side) to Source Cap/Width parameter real ccfp1 = 0.9e-10 from[0:inf]; // F/m Source or Gate to Drain (under FP) Cap/Width parameter real cbfp1 = 0.0 from[0:inf]; // F/m Body to Drain (under FP) Cap/Width parameter real vx0fp1 = 1.2e5 from(0.0:inf]; // m/s FP Source injection velocity parameter real mu0fp1 = 0.2 from(0.0:inf]; // m^2/Vs FP Low-field Mobility parameter real betafp1 = 1.16 from(0.0:inf]; // Linear to Saturation Parameter parameter real delta1fp1 = 0.00 from[0.0:inf]; // FP DIBL Coefficient parameter real sfp1 = 3.2 from(0.0:inf]; // V/dec FP Sub-threshold Slope parameter real ndfp1 = 0.0 from[0.0:inf]; // FP Punchthrough factor for Subth Slope parameter real vthetafp1 = 0.0 from[0.0:inf]; // FP Scattering: velocity reduction parameter with Vg parameter real mthetafp1 = 0.0 from[0.0:inf]; // FP Scattering: mobility reduction parameter with Vg parameter real alphafp1 = 1e-2 from[0.0:inf]; // FP Weak to Strong Inversion Transition Factor // Field-Plate 2 parameters parameter integer flagfp2 = 0 from[0:1]; // Flag parameter: GFP=1 or SFP=0 parameter real lgfp2 = 3.5 from[0.0:inf]; // um FP Length parameter real vtofp2 = -60.0 from[-inf:inf]; // V FP Threshold Voltage parameter real cgfp2 = 9.0e-5 from[0:inf]; // F/m^2 FP to Drain Cap/Area parameter integer flagfp2s = 0 from[0:1]; // Flag parameter: cfp2s select=1 or cfp2s not select=0 parameter real cfp2s = 0.0 from[0:inf]; // F/m FP (source-side) to Source Cap/Width parameter real ccfp2 = 0.65e-10 from[0:inf]; // F/m Source or Gate to Drain (under FP) Cap/Width parameter real cbfp2 = 0.0 from[0:inf]; // F/m Body to Drain (under FP) Cap/Width parameter real vx0fp2 = 1.9e5 from(0.0:inf]; // m/s FP Source injection velocity parameter real mu0fp2 = 0.29 from(0.0:inf]; // m^2/Vs FP Low-field Mobility parameter real betafp2 = 1.16 from(0.0:inf]; // Linear to Saturation Parameter parameter real delta1fp2 = 0.00 from[0.0:inf]; // FP DIBL Coefficient parameter real sfp2 = 4.1 from(0.0:inf]; // V/dec FP Sub-threshold Slope parameter real ndfp2 = 0.0 from[0.0:inf]; // FP Punchthrough factor for Subth Slope parameter real vthetafp2 = 0.0 from[0.0:inf]; // FP Scattering: velocity reduction parameter with Vg parameter real mthetafp2 = 0.0 from[0.0:inf]; // FP Scattering: mobility reduction parameter with Vg parameter real alphafp2 = 1.3e3 from[0.0:inf]; // FP Weak to Strong Inversion Transition Factor // Field-Plate 3 parameters parameter integer flagfp3 = 1 from[0:1]; // Flag parameter: GFP=1 or SFP=0 parameter real lgfp3 = 0.0 from[0.0:inf]; // um FP Length parameter real vtofp3 = -120.0 from[-inf:inf]; // V FP Threshold Voltage parameter real cgfp3 = 1.0e-3 from[0:inf]; // F/m^2 FP to Drain Cap/Area parameter integer flagfp3s = 0 from[0:1]; // Flag parameter: cfp3s select=1 or cfp3s not select=0 parameter real cfp3s = 0.0 from[0:inf]; // F/m FP (source-side) to Source Cap/Width parameter real ccfp3 = 0.0 from[0:inf]; // F/m Source or Gate to Drain (under FP) Cap/Width parameter real cbfp3 = 0.0 from[0:inf]; // F/m Body to Drain (under FP) Cap/Width parameter real vx0fp3 = 1.0e5 from(0.0:inf]; // m/s FP Source injection velocity parameter real mu0fp3 = 0.17 from(0.0:inf]; // m^2/Vs FP Low-field Mobility parameter real betafp3 = 1.0 from(0.0:inf]; // Linear to Saturation Parameter parameter real delta1fp3 = 0.01 from[0.0:inf]; // FP DIBL Coefficient parameter real sfp3 = 0.1 from(0.0:inf]; // V/dec FP Sub-threshold Slope parameter real ndfp3 = 0.0 from[0.0:inf]; // FP Punchthrough factor for Subth Slope parameter real vthetafp3 = 0.0 from[0.0:inf]; // FP Scattering: velocity reduction parameter with Vg parameter real mthetafp3 = 0.0 from[0.0:inf]; // FP Scattering: mobility reduction parameter with Vg parameter real alphafp3 = 3.5 from[0.0:inf]; // FP Weak to Strong Inversion Transition Factor // Gate Diode parameters parameter integer flagfp4 = 1 from[0:1]; // Flag parameter: GFP=1 or SFP=0 parameter real lgfp4 = 0.0 from[0.0:inf]; // um FP Length parameter real vtofp4 = -220.0 from[-inf:inf]; // V FP Threshold Voltage parameter real cgfp4 = 1.0e-3 from[0:inf]; // F/m^2 FP to Drain Cap/Area parameter integer flagfp4s = 0 from[0:1]; // Flag parameter: cfp4s select=1 or cfp4s not select=0 parameter real cfp4s = 0.0 from[0:inf]; // F/m FP (source-side) to Source Cap/Width parameter real ccfp4 = 0.0 from[0:inf]; // F/m Source or Gate to Drain (under FP) Cap/Width parameter real cbfp4 = 0.0 from[0:inf]; // F/m Body to Drain (under FP) Cap/Width parameter real vx0fp4 = 1.0e5 from(0.0:inf]; // m/s FP Source injection velocity parameter real mu0fp4 = 0.17 from(0.0:inf]; // m^2/Vs FP Low-field Mobility parameter real betafp4 = 1.0 from(0.0:inf]; // Linear to Saturation Parameter parameter real delta1fp4 = 0.01 from[0.0:inf]; // FP DIBL Coefficient parameter real sfp4 = 0.1 from(0.0:inf]; // V/dec FP Sub-threshold Slope parameter real ndfp4 = 0.0 from[0.0:inf]; // FP Punchthrough factor for Subth Slope parameter real vthetafp4 = 0.0 from[0.0:inf]; // FP Scattering: velocity reduction parameter with Vg parameter real mthetafp4 = 0.0 from[0.0:inf]; // FP Scattering: mobility reduction parameter with Vg parameter real alphafp4 = 3.5 from[0.0:inf]; // FP Weak to Strong Inversion Transition Factor parameter real rgsp = 0.0 from[0.0:inf]; // Ohms*m Gate resistance * Width // Gate leakage parameter integer igmod = 0 from[0: 1]; // Choice of gate leakage model set to 0 parameter real vjg = 1 from(0.0:inf); // V Gate diode cut in voltage [V] parameter real pg_param1 = 0.45 from[0.0:inf); // 1/V Something like 1/eta parameter real pg_params = 0.3 from[0.0:inf); // 1/V G-S something like 1/eta*Vt parameter real ijs = 0.00e3 from[0.0:inf); // A/m G-S reverse leakage current normalized to width [A/cm] parameter real vgsats = 3 from[0.0:inf); // V G-S high injection effect parameter real fracs = 1 from[0.0:inf); // G-S fractional change in ideality factor due to high injection parameter real alphags = 10 from[0.0:inf); // G-S high injection smoothing parameter parameter real pg_paramd = 0.38 from[0.0:inf); // 1/V G-D something like 1/eta*Vt [1/V] parameter real ijd = 0.00e3 from[0.0:inf); // A/m G-D reverse leakage current normalized to width [A/cm] parameter real vgsatd = 3 from[0.0:inf); // V G-D high injection effect parameter real fracd = 1 from[0.0:inf); // G-D fractional change in ideality factor due to high injection parameter real alphagd = 10 from[0.0:inf); // G-D high injection smoothing parameter parameter real pgsrecs = 0.8 from[0.0:inf); // G-S something like 1/eta parameter real irecs = 000e-12 from[0.0:inf); // A/m G-S reverse leakage current normalized to width [A/cm] parameter real vgsatqs = 3.4 from[0.0:inf); // V G-S mimics depletion saturation parameter real vbdgs = 600 from[0.0:inf); // V G-S soft breakdown voltage of GD diode parameter real pbdgs = 4 from[0.0:inf); // G-S fitting parameter parameter real kbdgates = 0.0 from[0.0:inf); // G-S fitting parameter parameter real betarecs = 0.35 from[0.0:inf); // G-S fitting parameter parameter real pgsrecd = 0.957 from[0.0:inf); // G-D something like 1/eta parameter real irecd = 0e-18 from[0.0:inf); // A/m G-D reverse leakage current normalized to width [A/cm] parameter real vgsatqd = 0.55 from[0.0:inf); // V G-D mimics depletion saturation parameter real vbdgd = 600 from[0.0:inf); // V G-D soft breakdown voltage of GS diode parameter real pbdgd = 4 from[0.0:inf); // G-D fitting parameter parameter real kbdgated = 0.0 from[0.0:inf); // G-D fitting parameter parameter real betarecd = 0.734 from[0.0:inf); // G-D fitting parameter parameter real rth = 125 from [0:inf); // K/W Thermal resistance parameter real cth = 1e-4 from [0:inf); // s.W/K Thermal capacitance parameter real minr = 1.0e-3 from[0.0:inf]; // Ohms Minimum resistance parameter real minl = 1.0e-3 from[0.0:inf]; // um Minimum length parameter real minc = 1.0e-15 from[0.0:inf]; // F Minimum capacitance analog function real absfunc; input x; real x; begin absfunc=sqrt( x * x + 4.0 * 1e-5 ); end endfunction analog function real mmax; input x,y; real x,y; begin mmax=0.5*( x + y + sqrt( ( x - y ) * ( x - y ) + 4.0 * 1e-5 )); end endfunction analog function real sd_dir; inout vgsout,vdsout; input type,vgsin,vgdin,vdsin; real vgsout,vdsout,type,vgsin,vgdin,vdsin; real vgsType, vgdType, vdsType; begin vgsType = vgsin * type; vgdType = vgdin * type; vdsType = vdsin * type; vgsout = vgsType; vdsout = vdsType; sd_dir = 1.0; end endfunction // sd_dir analog function real calc_iq; output idsout,qgsout,qgdout,qcout,qbout,qsout; input vgsin,vdsin,qcbflag,vcin,vbin,qgsflag,dirin,tambin,tnomin,phitin,w,lin,cgin,cs,cc,cb,vto,ss; input delta1,delta2,nd,alpha,vel0,mu0,beta,mtheta,vtheta; input vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type; // IO real idsout,qgsout,qgdout,qcout,qbout,qsout,vgsin,vdsin,qcbflag,vcin,vbin,qgsflag,dirin; real tambin,tnomin,phitin,w,lin,cgin,cs,cc,cb,vto,ss,delta1,delta2,nd,alpha,vel0,mu0,beta,mtheta,vtheta; real vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type; // Local real alpha_phit, delta, n, vtof, vsatdibl, ffs, two_n_phit, qref, etas, qinvs, muf, vx, vxf; real alpha_phit0, n0, ffs0, two_n_phit0, qref0, etas0, qinvs0, muf0, vx0, vxf0; real ff, eta, qinvv; real ff0, eta0, qinvv0; real vdsats, vdsats1, vdsat, vdsat1, fsd, vdx, fds, vsx, ffd, etad, qinvd, vdsc, fsat, vel; real vdsats0, vdsats10, vdsat0, vdsat10, fsd0, vdx0, fds0, vsx0, ffd0, etad0, qinvd0; real qs2, qs3, qd2, qd3, qsqd, qinvdd, qd1, qs, qd, etac, etab, etags; real exparg, myarg, absvdsin, vgdin; real exparg0, myarg0; begin absvdsin = absfunc( vdsin ); vgdin = vgsin - vdsin; alpha_phit = alpha * phitin; n = ss / ( `M_LN10 * phitin ) + nd * absvdsin; vtof = vto + vtzeta * ( tambin - tnomin ); if (beta != 0 && dibsat != 0) vsatdibl = absvdsin / ( pow(( 1.0 + pow( absvdsin / dibsat, beta)),( 1.0/beta ))); else vsatdibl = 0; delta = ( delta1 - vsatdibl * delta2 ) * absvdsin; two_n_phit = 2.0 * n * phitin; qref = cgin * two_n_phit; // Qinvv myarg = vtof - delta - alpha_phit / 2.0; exparg = (( mmax( vgsin,vgdin ) - myarg ) / ( alpha_phit )); if (exparg > `M_MAXEXP) ff = 0.0; else if (exparg < -`M_MAXEXP) ff =1.0; else ff = 1.0 / ( 1.0 + exp( exparg )); eta = ( mmax( vgsin,vgdin ) - ( vtof - delta - 0.1 * alpha_phit * ff )) / two_n_phit; if (eta > `M_MAXEXP) qinvv = qref * eta; else if (eta < -`M_MAXEXP) qinvv = 0; else qinvv = qref * ln( 1.0 + exp( eta )); // velocity muf = mu0 / (( pow(( tambin / tnomin ), epsilon )) * ( 1.0 + mtheta * qinvv /cgin )); vx = vel0 * (( 1.0 + vzeta * tnomin ) / ( 1.0 + vzeta * tambin )) * ( 1.0 + lambda * absvdsin /lin) / ( 1.0 + vtheta * qinvv/ cgin ); vxf = 2.0 * ff * phitin * muf / lin + ( 1 - ff ) * vx; vdsats = vx * lin / muf; vdsats1 = vdsats * sqrt( 1.0 + 2.0 * qinvv / cgin / vdsats ) - vdsats; vdsat = vdsats * ( 1.0 - ff ) + two_n_phit * ff; vdsat1 = vdsats1 * ( 1.0 - ff ) + two_n_phit * ff; fsd = 1.0 / pow( 1.0 + pow( mmax( 0,( vdsin / vdsat1 )),beta ),1.0 / beta); vdx = vdsin * fsd; fds = 1.0 / pow( 1.0 + pow( mmax( 0,( -vdsin / vdsat1 )),beta),1.0 / beta); vsx = -vdsin * fds; // Qinvs exparg = ( vgsin - myarg ) / ( alpha_phit ); if (exparg > `M_MAXEXP) ffs = 0.0; else if (exparg < -`M_MAXEXP) ffs = 1.0; else ffs = 1.0 /( 1.0 + exp( exparg )); etas = ( vgdin - vsx - ( vtof - delta - 0.1 * alpha_phit * ffs )) / two_n_phit; if (etas > `M_MAXEXP) qinvs = qref * etas; else if (etas < -`M_MAXEXP) qinvs = 0; else qinvs = qref * ln( 1.0 + exp( etas )); // Qinvd exparg = ( vgdin - myarg ) / ( alpha_phit ); if (exparg > `M_MAXEXP) ffd = 0.0; else if (exparg < -`M_MAXEXP) ffd = 1.0; else ffd = 1.0 / ( 1.0 + exp( exparg )); etad = ( vgsin - vdx - ( vtof - delta - 0.1 * alpha_phit * ffd )) / two_n_phit; if (etad > `M_MAXEXP) qinvd = qref * etad; else if (etad < -`M_MAXEXP) qinvd = 0; else qinvd = qref * ln( 1.0 + exp( etad )); // Current vdsc = ( qinvs - qinvd ) / cgin; myarg = vdsc / vdsat; fsat = myarg / ( pow( 1.0 + pow( absfunc( myarg ),beta), 1.0 / beta)); vel = vxf * fsat; idsout = dirin * type * w * ngf * 0.5 * ( qinvs + qinvd ) * vel; // charge calc n0 = ss / ( `M_LN10 * phitin ); two_n_phit0 = 2.0 * n0 * phitin; qref0 = cgin * two_n_phit0; // Qinvv0 myarg0 = vtof - alpha_phit / 2.0; exparg0 = (( mmax( vgsin,vgdin ) - myarg0 )/( alpha_phit )); if (exparg0 > `M_MAXEXP) ff0 = 0.0; else if (exparg0 < -`M_MAXEXP) ff0 = 1.0; else ff0 = 1.0 / ( 1.0 + exp( exparg0 )); eta0 = ( mmax( vgsin,vgdin ) - ( vtof - 0.1 * alpha_phit * ff0 )) / two_n_phit0; if (eta0 > `M_MAXEXP) qinvv0 = qref0 * eta0; else if (eta0 < -`M_MAXEXP) qinvv0 = 0; else qinvv0 = qref0 * ln( 1.0 + exp( eta0 )); // velocity0 muf0 = mu0 / (( pow(( tambin / tnomin ),epsilon ))); vx0 = vel0 * (( 1.0 + vzeta * tnomin ) / ( 1.0 + vzeta * tambin )); vxf0 = 2.0 * ff0 * phitin * muf0 / lin + ( 1 - ff0 ) * vx0; vdsats0 = vx0 * lin / muf0; vdsats10 = vdsats0 * sqrt( 1.0 + 2.0 * qinvv0 / cgin / vdsats0 ) - vdsats0; vdsat0 = vdsats0 * ( 1.0 - ff0 ) + two_n_phit0 * ff0; vdsat10 = vdsats10 * ( 1.0 - ff0 ) + two_n_phit0 * ff0; fsd0 = 1.0 / pow( 1.0 + pow( mmax(0,( vdsin / vdsat10 )),beta ),1.0 / beta); vdx0 = vdsin * fsd0; fds0 = 1.0 / pow( 1.0 + pow( mmax(0,( -vdsin / vdsat10 )),beta ),1.0 / beta); vsx0 = -vdsin * fds0; exparg0 = ( vgsin - myarg0 ) / ( alpha_phit ); if (exparg0 > `M_MAXEXP) ffs0 = 0.0; else if (exparg0 < -`M_MAXEXP) ffs0 = 1.0; else ffs0 = 1.0 / ( 1.0 + exp( exparg0 )); etas0 = ( vgdin - vsx0 - ( vtof - 0.1 * alpha_phit * ffs0 )) / two_n_phit0; if (etas0 > `M_MAXEXP) qinvs0 = qref0 * etas0; else if (etas0 < -`M_MAXEXP) qinvs0 = 0; else qinvs0 = qref0 * ln( 1.0 + exp( etas0 )); exparg0 = ( vgdin - myarg0 ) / ( alpha_phit ); if (exparg0 > `M_MAXEXP) ffd0 = 0.0; else if (exparg0 < -`M_MAXEXP) ffd0 = 1.0; else ffd0 = 1.0 / ( 1.0 + exp( exparg0 )); etad0 = ( vgsin - vdx0 - ( vtof - 0.1 * alpha_phit * ffd0 )) / two_n_phit0; if (etad0 > `M_MAXEXP) qinvd0 = qref0 * etad0; else if (etad0 < -`M_MAXEXP) qinvd0 = 0; else qinvd0 = qref0 * ln( 1.0 + exp( etad0 )); qs2 = qinvs0 * qinvs0 + 1e-38; qs3 = qs2 * qinvs0 + 1e-57; qd2 = qinvd0 * qinvd0 + 1e-38; qd3 = qd2 * qinvd0 + 1e-57; qsqd = qinvs0 * qinvd0 + 1e-38; qinvdd = 2.0 / 3.0 * ( qs2 + qd2 + qsqd ) / ( qinvs0 + qinvd0 + 2e-19 ); qd1 = 2.0 * ( 2.0 * qs3 + 3.0 * qd3 + 4.0 * qs2 * qinvd0 + 6.0 * qd2 * qinvs0 ) / ( 15.0 * ( qs2+ qd2 + 2 * qsqd )); qs = qinvdd - qd1; qd = qd1; qgsout = w * ngf * lin * type * qs; qgdout = w * ngf * lin * type * qd; if (qcbflag==1) begin etac = ( vcin - ( vtof - 0.5 * alpha_phit )) / two_n_phit0; if (etac > `M_MAXEXP) exparg = etac; else if (etac < -`M_MAXEXP) exparg = 0; else exparg = ln( 1.0 + exp( etac )); qcout = w * ngf * type * cc * two_n_phit0 * exparg; etab = ( vbin - ( vtof - 0.5 * alpha_phit )) / two_n_phit0; if (etab > `M_MAXEXP) exparg = etab; else if (etab < -`M_MAXEXP) exparg = 0; else exparg = ln( 1.0 + exp( etab )); qbout = w * ngf * type * cb * two_n_phit0 * exparg; end else begin qcout = 0; qbout = 0; end if (qgsflag==1) begin etags = ( vgsin - ( vtof - 0.5 * alpha_phit )) / two_n_phit0; if (etags > `M_MAXEXP) exparg = etags; else if (etags < -`M_MAXEXP) exparg = 0; else exparg = ln( 1.0 + exp( etags )); qsout = w * ngf * type * cs * two_n_phit0 * exparg; end else begin qsout = 0; end calc_iq = idsout; end endfunction analog function real calc_ig; output igout; input vgin, phitin; input vgsatin, alphagin, fracin, pg_paramin, pbdgin, vbdgin, tambin, tnomin; input w, ngf,ijin, kbdgatein, vgsatqin, betarecin, irecin, pgsrecin, pg_param1, vjg; //IO real igout; real vgin, phitin; real vgsatin, alphagin, fracin, pg_paramin, pbdgin, vbdgin, tambin, tnomin; real w, ngf,ijin, kbdgatein, vgsatqin, betarecin, irecin, pgsrecin, pg_param1, vjg; // Local real alpha_phit, t0, ffvgin, pgin, iginbd, tfacdiode, igindiode; real frecgin, iginrec; begin alpha_phit = alphagin * phitin; t0 = exp( pg_param1 / phitin * - vjg ); ffvgin = 1.0 / ( 1.0 + exp(( vgin - ( vgsatin - alphagin * alpha_phit / 2.0))/( alphagin * alpha_phit ))); pgin = ( fracin * pg_paramin + ( 1 - fracin) * pg_paramin * ffvgin ); iginbd = ( exp( pbdgin * ( -vgin - vbdgin ) ) - exp( -pbdgin * vbdgin ) ); tfacdiode = pow( ( tambin / tnomin ) , 3.0 ); igindiode = w * ngf * ijin * tfacdiode * t0 * ( exp( pgin / phitin * vgin ) - ( kbdgatein * iginbd ) - 1.0 ); frecgin = -vgin / pow(( 1.0 + pow( absfunc( vgin / vgsatqin ), betarecin )), 1.0 / betarecin ); iginrec = -w * ngf * irecin * tfacdiode * 1.0 * ( exp( pgsrecin / phitin * frecgin ) - 1.0 ); igout = igindiode + iginrec; calc_ig = igout; end endfunction // Local variables real weff, leff, leffs, leffd, lefffp1, lefffp2, lefffp3, lefffp4; real mygmin, mycmin; real rd, rs, rg; real dir, dirrs, dirrd, dirfp1, dirfp2, dirfp3, dirfp4; real vdsi, vgsi, vigs, vigd, vgsrs, vdsrs, vgsrd, vdsrd, vgsfp1, vdsfp1, vcfp1, vbfp1; real vgsfp2, vdsfp2, vcfp2, vbfp2, vgsfp3, vdsfp3, vcfp3, vbfp3; real vgsfp4, vdsfp4, vcfp4, vbfp4; real tambk, tnomk, tsh, tdut, phit, pdiss; real ids, qgs, qgd, qc, qb, qs, igs, igd; real idsrs, qgsrs, qgdrs, qcrs, qbrs, qsrs; real idsrd, qgsrd, qgdrd, qcrd, qbrd, qsrd; real idsfp1, qgsfp1, qgdfp1, qcfp1, qbfp1, qsfp1; real idsfp2, qgsfp2, qgdfp2, qcfp2, qbfp2, qsfp2; real idsfp3, qgsfp3, qgdfp3, qcfp3, qbfp3, qsfp3; real idsfp4, qgsfp4, qgdfp4, qcfp4, qbfp4, qsfp4; real qofs, qofd, qofds, qofdsub, qofssub, qofgsub; analog begin @(initial_step) begin weff = w * 1e-6; leff = l * 1e-6; leffs = lgs * 1e-6; leffd = lgd * 1e-6; lefffp1 = lgfp1 * 1e-6; lefffp2 = lgfp2 * 1e-6; lefffp3 = lgfp3 * 1e-6; lefffp4 = lgfp4 * 1e-6; tnomk = tnom + `P_CELSIUS0; mygmin = $simparam("gmin",1e-12); mygmin = $simparam("gdev",mygmin); mycmin = $simparam("cmin",0); end // Temperature dependence of voltage independent terms tambk = $temperature; tsh = Temp(dt); tdut = tambk + tsh; rd = ( rcd / weff ) * ( 1 + rct1 * ( tdut-tnomk ) + rct2 * ( tdut - tnomk ) * ( tdut -tnomk )) / ngf; rs = ( rcs / weff ) * ( 1 + rct1 * ( tdut-tnomk ) + rct2 * ( tdut - tnomk ) * ( tdut -tnomk )) / ngf; rg = ( rgsp / weff / ngf); phit = `P_K * tdut / `P_Q; // Determines source for intrinsic transistor dir = sd_dir(vgsi,vdsi,type,V(gi,si),V(gi,di),V(di,si)); // Determines source for SAR transistor vigs = vtors + 1.0 / (rsh * cgrs * mu0) + min(V(d), V(s)); dirrs = sd_dir(vgsrs,vdsrs,type,(vigs - V(src)),(vigs - V(si)),V(si,src)); // Determines source for DAR transistor vigd = vtord + 1.0 / (rsh * cgrd * mu0) + min(V(d), V(s)); dirrd = sd_dir(vgsrd,vdsrd,type,(vigd - V(fp4)),(vigs - V(drc)),V(drc,fp4)); // Determines source for fp transistors if (flagfp1 == 1) begin dirfp1 = sd_dir(vgsfp1,vdsfp1,type,V(gi,di),V(gi,fp1),V(fp1,di)); vcfp1 = type * V(s,di); end else begin dirfp1 = sd_dir(vgsfp1,vdsfp1,type,V(s,di),V(s,fp1),V(fp1,di)); vcfp1 = type * V(gi,di); end vbfp1 = type * V(b,di); if (flagfp2 == 1) begin dirfp2 = sd_dir(vgsfp2,vdsfp2,type,V(gi,fp1),V(gi,fp2),V(fp2,fp1)); vcfp2 = type * V(s,fp1); end else begin dirfp2 = sd_dir(vgsfp2,vdsfp2,type,V(s,fp1),V(s,fp2),V(fp2,fp1)); vcfp2 = type * V(gi,fp1); end vbfp2 = type * V(b,fp1); if (flagfp3 == 1) begin dirfp3 = sd_dir(vgsfp3,vdsfp3,type,V(gi,fp2),V(gi,fp3),V(fp3,fp2)); vcfp3 = type * V(s,fp2); end else begin dirfp3 = sd_dir(vgsfp3,vdsfp3,type,V(s,fp2),V(s,fp3),V(fp3,fp2)); vcfp3 = type * V(gi,fp2); end vbfp3 = type * V(b,fp2); if (flagfp4 == 1) begin dirfp4 = sd_dir(vgsfp4,vdsfp4,type,V(gi,fp3),V(gi,fp4),V(fp4,fp3)); vcfp4 = type * V(s,fp3); end else begin dirfp4 = sd_dir(vgsfp4,vdsfp4,type,V(s,fp3),V(s,fp4),V(fp4,fp3)); vcfp4 = type * V(gi,fp3); end vbfp4 = type * V(b,fp3); // current and charge calculations idsfp4 = 0; qgsfp4 = 0; qgdfp4 = 0; qcfp4 = 0; qbfp4 = 0; if (lefffp4>=(minl * 1e-6)) begin idsfp4 = calc_iq(idsfp4,qgsfp4,qgdfp4,qcfp4,qbfp4,qsfp4,vgsfp4,vdsfp4,1,vcfp4,vbfp4,flagfp4s,dirfp4,tdut,tnomk,phit,weff,lefffp4,cgfp4,cfp4s,ccfp4,cbfp4,vtofp4,sfp4,delta1fp4,0.0,ndfp4,alphafp4,vx0fp4,mu0fp4,betafp4,mthetafp4,vthetafp4,vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type); I(fp4,fp3) <+ idsfp4 + mygmin * V(fp4,fp3); end else begin V(fp4,fp3) <+ 0; end if (flagfp4==1) begin I(gi,fp3) <+ ddt(qgsfp4) + ddt(minc * V(gi,fp3)); I(gi,fp4) <+ ddt(qgdfp4) + ddt(minc * V(gi,fp4)); I(s,fp3) <+ ddt(qcfp4) + ddt(minc * V(s,fp3)); I(s,fp4) <+ 0; I(gi,si) <+ ddt(qsfp4) + ddt(minc * V(gi,si)); end else begin I(s,fp3) <+ ddt(qgsfp4) + ddt(minc * V(s,fp3)); I(s,fp4) <+ ddt(qgdfp4) + ddt(minc * V(s,fp4)); I(gi,fp3) <+ ddt(qcfp4) + ddt(minc * V(gi,fp3)); I(gi,fp4) <+ 0; I(gi,si) <+ 0; end I(b,fp3) <+ ddt(qbfp4) + ddt(minc * V(b,fp3)); idsfp3 = 0; qgsfp3 = 0; qgdfp3 = 0; qcfp3 = 0; qbfp3 = 0; if (lefffp3>=(minl * 1e-6)) begin idsfp3 = calc_iq(idsfp3,qgsfp3,qgdfp3,qcfp3,qbfp3,qsfp3,vgsfp3,vdsfp3,1,vcfp3,vbfp3,flagfp3s,dirfp3,tdut,tnomk,phit,weff,lefffp3,cgfp3,cfp3s,ccfp3,cbfp3,vtofp3,sfp3,delta1fp3,0.0,ndfp3,alphafp3,vx0fp3,mu0fp3,betafp3,mthetafp3,vthetafp3,vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type); I(fp3,fp2) <+ idsfp3 + mygmin * V(fp3,fp2); end else begin V(fp3,fp2) <+ 0; end if (flagfp3==1) begin I(gi,fp2) <+ ddt(qgsfp3) + ddt(minc * V(gi,fp2)); I(gi,fp3) <+ ddt(qgdfp3) + ddt(minc * V(gi,fp3)); I(s,fp2) <+ ddt(qcfp3) + ddt(minc * V(s,fp2)); I(s,fp3) <+ 0; I(gi,si) <+ ddt(qsfp3) + ddt(minc * V(gi,si)); end else begin I(s,fp2) <+ ddt(qgsfp3) + ddt(minc * V(s,fp2)); I(s,fp3) <+ ddt(qgdfp3) + ddt(minc * V(s,fp3)); I(gi,fp2) <+ ddt(qcfp3) + ddt(minc * V(gi,fp2)); I(gi,fp3) <+ 0; I(gi,si) <+ 0; end I(b,fp2) <+ ddt(qbfp3) + ddt(minc * V(b,fp2)); idsfp2 = 0; qgsfp2 = 0; qgdfp2 = 0; qcfp2 = 0; qbfp2 = 0; if (lefffp2>=(minl * 1e-6)) begin idsfp2 = calc_iq(idsfp2,qgsfp2,qgdfp2,qcfp2,qbfp2,qsfp2,vgsfp2,vdsfp2,1,vcfp2,vbfp2,flagfp2s,dirfp2,tdut,tnomk,phit,weff,lefffp2,cgfp2,cfp2s,ccfp2,cbfp2,vtofp2,sfp2,delta1fp2,0.0,ndfp2,alphafp2,vx0fp2,mu0fp2,betafp2,mthetafp2,vthetafp2,vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type); I(fp2,fp1) <+ idsfp2 + mygmin * V(fp2,fp1); end else begin V(fp2,fp1) <+ 0; end if (flagfp2==1) begin I(gi,fp1) <+ ddt(qgsfp2) + ddt(minc * V(gi,fp1)); I(gi,fp2) <+ ddt(qgdfp2) + ddt(minc * V(gi,fp2)); I(s,fp1) <+ ddt(qcfp2) + ddt(minc * V(s,fp1)); I(s,fp2) <+ 0; I(gi,si) <+ ddt(qsfp2) + ddt(minc * V(gi,si)); end else begin I(s,fp1) <+ ddt(qgsfp2) + ddt(minc * V(s,fp1)); I(s,fp2) <+ ddt(qgdfp2) + ddt(minc * V(s,fp2)); I(gi,fp1) <+ ddt(qcfp2) + ddt(minc * V(gi,fp1)); I(gi,fp2) <+ 0; I(gi,si) <+ 0; end I(b,fp1) <+ ddt(qbfp2) + ddt(minc * V(b,fp1)); idsfp1 = 0; qgsfp1 = 0; qgdfp1 = 0; qcfp1 = 0; qbfp1 = 0; if (lefffp1>=(minl * 1e-6)) begin idsfp1 = calc_iq(idsfp1,qgsfp1,qgdfp1,qcfp1,qbfp1,qsfp1,vgsfp1,vdsfp1,1,vcfp1,vbfp1,flagfp1s,dirfp1,tdut,tnomk,phit,weff,lefffp1,cgfp1,cfp1s,ccfp1,cbfp1,vtofp1,sfp1,delta1fp1,0.0,ndfp1,alphafp1,vx0fp1,mu0fp1,betafp1,mthetafp1,vthetafp1,vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type); I(fp1,di) <+ idsfp1 + mygmin * V(fp1,di); end else begin V(fp1,di) <+ 0; end if (flagfp1==1) begin I(gi,di) <+ ddt(qgsfp1) + ddt(minc * V(gi,di)); I(gi,fp1) <+ ddt(qgdfp1) + ddt(minc * V(gi,fp1)); I(s,di) <+ ddt(qcfp1) + ddt(minc * V(s,di)); I(s,fp1) <+ 0; I(gi,si) <+ ddt(qsfp1) + ddt(minc * V(gi,si)); end else begin I(s,di) <+ ddt(qgsfp1) + ddt(minc * V(s,di)); I(s,fp1) <+ ddt(qgdfp1) + ddt(minc * V(s,fp1)); I(gi,di) <+ ddt(qcfp1) + ddt(minc * V(gi,di)); I(gi,fp1) <+ 0; I(gi,si) <+ 0; end I(b,di) <+ ddt(qbfp1) + ddt(minc * V(b,di)); idsrs = calc_iq(idsrs,qgsrs,qgdrs,qcrs,qbrs,qsrs,vgsrs,vdsrs,0,0,0,0,dirrs,tdut,tnomk,phit,weff,leffs,cgrs,0,0,0,vtors,srs,delta1rs,0.0,ndrs,alphars,vx0rs,mu0rs,betars,mthetars,vthetars,vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type); I(si,src) <+ idsrs + mygmin * V(si,src); idsrd = calc_iq(idsrd,qgsrd,qgdrd,qcrd,qbrd,qsrd,vgsrd,vdsrd,0,0,0,0,dirrd,tdut,tnomk,phit,weff,leffd,cgrd,0,0,0,vtord,srd,delta1rd,0.0,ndrd,alphard,vx0rd,mu0rd,betard,mthetard,vthetard,vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type); I(drc,fp4) <+ idsrd + mygmin * V(drc,fp4); ids = calc_iq(ids,qgs,qgd,qc,qb,qs,vgsi,vdsi,0,0,0,0,dir,tdut,tnomk,phit,weff,leff,cg,0,0,0,vto,ss,delta1,delta2,nd,alpha,vx0,mu0,beta,mtheta,vtheta,vtzeta,dibsat,epsilon,vzeta,lambda,ngf,type); I(di,si) <+ ids + mygmin * V(di,si); I(gi,si) <+ ddt(qgs) + ddt(minc * V(gi,si)); I(gi,di) <+ ddt(qgd) + ddt(minc * V(gi,di)); igs = 0; igd = 0; if (igmod == 1) begin igs = calc_ig(igs,vgsi,phit,vgsats,alphags,fracs,pg_params,pbdgs,vbdgs,tdut,tnomk,weff,ngf,ijs,kbdgates,vgsatqs,betarecs,irecs,pgsrecs,pg_param1,vjg); igd = calc_ig(igd,vgsi-vdsi,phit,vgsatd,alphagd,fracd,pg_paramd,pbdgd,vbdgd,tdut,tnomk,weff,ngf,ijd,kbdgated,vgsatqd,betarecd,irecd,pgsrecd,pg_param1,vjg); I(gi,si) <+ igs + mygmin * V(gi,si); I(gi,di) <+ igd + mygmin * V(gi,di); end // resistors if (rd < minr) begin V(d,drc) <+ 0; end else begin I(d,drc) <+ V(d,drc) / rd; end if (rs < minr) begin V(src,s) <+ 0; end else begin I(src,s) <+ V(src,s) / rs; end if (rg < minr) begin V(g,gi) <+ 0; end else begin I(g,gi) <+ V(g,gi) / rg; end qofs = weff * ngf * cofsm * V(g,s); I(g,s) <+ ddt(qofs); qofd = weff * ngf * cofdm * V(g,d); I(g,d) <+ ddt(qofd); qofds = weff * ngf * cofdsm * V(d,s); I(d,s) <+ ddt(qofds); qofdsub = weff * ngf * cofdsubm * V(d,b); I(d,b) <+ ddt(qofdsub); qofssub = weff * ngf * cofssubm * V(s,b); I(s,b) <+ ddt(qofssub); qofgsub = weff * ngf * cofgsubm * V(g,b); I(g,b) <+ ddt(qofgsub); // cmin from internal nodes to ground I(di) <+ ddt(mycmin * V(di)); I(gi) <+ ddt(mycmin * V(gi)); I(si) <+ ddt(mycmin * V(si)); I(fp4) <+ ddt(mycmin * V(fp4)); I(fp3) <+ ddt(mycmin * V(fp3)); I(fp2) <+ ddt(mycmin * V(fp2)); I(fp1) <+ ddt(mycmin * V(fp1)); // Self-heating if (rth !=0) begin pdiss = -( ids * V(di,si) + idsrd * V(drc,fp4) + idsrs * V(si,src) + idsfp1 * V(fp1,di) + idsfp2 * V(fp2,fp1) + idsfp3 * V(fp3,fp2) + idsfp4 * V(fp4,fp3) + V(src,s) * V(src,s) / rs + V(drc,d) * V(drc,d) / rd); Pwr(dt) <+ ddt( (cth + mycmin) * Temp(dt)); Pwr(dt) <+ pdiss; Pwr(dt) <+ Temp(dt) / rth; end else Pwr(dt) <+ Temp(dt) * 1e9; //else // Temp(dt) <+ 0.0; end endmodule