From b0bc524b889f0005e189b5093e1b9f1db8986e74 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 8 Mar 2018 22:21:20 +0100 Subject: [PATCH] admsva/bsim6.va, enable __SHMOD__, need to split more variables --- .../devices/adms/bsim6/admsva/bsim6.va | 121 +++++++++--------- 1 file changed, 61 insertions(+), 60 deletions(-) diff --git a/src/spicelib/devices/adms/bsim6/admsva/bsim6.va b/src/spicelib/devices/adms/bsim6/admsva/bsim6.va index 6be3f53d8..54838c077 100755 --- a/src/spicelib/devices/adms/bsim6/admsva/bsim6.va +++ b/src/spicelib/devices/adms/bsim6/admsva/bsim6.va @@ -64,7 +64,7 @@ `define __TNOISW__ `define __RGATEMOD__ `define __RBODYMOD__ -//`define __SHMOD__ +`define __SHMOD__ // Normalized pinch-off voltage including PD @@ -1736,6 +1736,7 @@ endfunction real PSiso,PDiso,PSsha,PDsha,PSmer,PDmer,ASiso,ADiso,ASsha,ADsha,ASmer,ADmer; real T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12; real T0y, T1y, T2y, T3y; +real T0u, T0v, T0x, T1u, T1v, T2u; real Tb; real epssi, epsox, ni, Weff, Leff, Weff1, Leff1, Wact, Lact, Weffcj, Eg, Eg0; real dLIV, dWIV, dLB, dWB, dLCV, dWCV, dWJ, Cox, epsratio; @@ -2283,12 +2284,12 @@ analog begin // Geometrical scaling T0y = NDEPL1 * max( pow(Inv_L, NDEPLEXP1) - pow(Inv_Llong, NDEPLEXP1), 0) + NDEPL2 * max( pow(Inv_L, NDEPLEXP2) - pow(Inv_Llong, NDEPLEXP2), 0); - T1y = NDEPW * max( pow(Inv_W, NDEPWEXP) - pow(Inv_Wwide, NDEPWEXP), 0) + NDEPWL * pow(Inv_W * Inv_L, NDEPWLEXP); - NDEP_i = NDEP_i * (1.0 + T0y + T1y); + T1v = NDEPW * max( pow(Inv_W, NDEPWEXP) - pow(Inv_Wwide, NDEPWEXP), 0) + NDEPWL * pow(Inv_W * Inv_L, NDEPWLEXP); + NDEP_i = NDEP_i * (1.0 + T0y + T1v); T0y = NFACTORL * max( pow(Inv_L, NFACTORLEXP) - pow(Inv_Llong, NFACTORLEXP), 0); - T1y = NFACTORW * max( pow(Inv_W, NFACTORWEXP) - pow(Inv_Wwide, NFACTORWEXP), 0) + NFACTORWL * pow(Inv_WL, NFACTORWLEXP); - NFACTOR_i = NFACTOR_i * (1.0 + T0y + T1y); + T1v = NFACTORW * max( pow(Inv_W, NFACTORWEXP) - pow(Inv_Wwide, NFACTORWEXP), 0) + NFACTORWL * pow(Inv_WL, NFACTORWLEXP); + NFACTOR_i = NFACTOR_i * (1.0 + T0y + T1v); T0y = (1.0 + CDSCDL * max( pow(Inv_L, CDSCDLEXP) - pow(Inv_Llong, CDSCDLEXP), 0) ); CDSCD_i = CDSCD_i * T0y; @@ -2314,22 +2315,22 @@ analog begin end T0y = UAL * max( pow(Inv_L, UALEXP) - pow(Inv_Llong, UALEXP), 0); - T1y = UAW * max( pow(Inv_W, UAWEXP) - pow(Inv_Wwide, UAWEXP), 0) + UAWL * pow(Inv_WL, UAWLEXP); - UA_i = UA_i * (1.0 + T0y + T1y); + T1v = UAW * max( pow(Inv_W, UAWEXP) - pow(Inv_Wwide, UAWEXP), 0) + UAWL * pow(Inv_WL, UAWLEXP); + UA_i = UA_i * (1.0 + T0y + T1v); if(ASYMMOD != 0) - UAR_i = UAR_i * (1.0 + T0y + T1y); + UAR_i = UAR_i * (1.0 + T0y + T1v); T0y = EUL * max( pow(Inv_L, EULEXP) - pow(Inv_Llong, EULEXP), 0); - T1y = EUW * max( pow(Inv_W, EUWEXP) - pow(Inv_Wwide, EUWEXP), 0) + EUWL * pow(Inv_WL, EUWLEXP); - EU_i = EU_i * (1.0 + T0y + T1y); + T1v = EUW * max( pow(Inv_W, EUWEXP) - pow(Inv_Wwide, EUWEXP), 0) + EUWL * pow(Inv_WL, EUWLEXP); + EU_i = EU_i * (1.0 + T0y + T1v); T0y = 1.0 + UDL * max( pow(Inv_L, UDLEXP) - pow(Inv_Llong, UDLEXP), 0); UD_i = UD_i * T0y; if(ASYMMOD != 0) UDR_i = UDR_i * T0y; T0y = UCL * max( pow(Inv_L, UCLEXP) - pow(Inv_Llong, UCLEXP), 0); - T1y = UCW * max( pow(Inv_W, UCWEXP) - pow(Inv_Wwide, UCWEXP), 0) + UCWL * pow(Inv_WL, UCWLEXP); - UC_i = UC_i * (1.0 + T0y + T1y); + T1v = UCW * max( pow(Inv_W, UCWEXP) - pow(Inv_Wwide, UCWEXP), 0) + UCWL * pow(Inv_WL, UCWLEXP); + UC_i = UC_i * (1.0 + T0y + T1v); if(ASYMMOD != 0) - UCR_i = UCR_i * (1.0 + T0y + T1y); + UCR_i = UCR_i * (1.0 + T0y + T1v); T0y = max( pow(Inv_L, DSUB) - pow(Inv_Llong, DSUB), 0); ETA0_i = ETA0_i * T0y; if(ASYMMOD != 0) @@ -2353,10 +2354,10 @@ analog begin end T0y = VSATL * max( pow(Inv_L, VSATLEXP) - pow(Inv_Llong, VSATLEXP), 0); - T1y = VSATW * max( pow(Inv_W, VSATWEXP) - pow(Inv_Wwide, VSATWEXP), 0) + VSATWL * pow(Inv_WL, VSATWLEXP); - VSAT_i = VSAT_i * (1.0 + T0y + T1y); + T1v = VSATW * max( pow(Inv_W, VSATWEXP) - pow(Inv_Wwide, VSATWEXP), 0) + VSATWL * pow(Inv_WL, VSATWLEXP); + VSAT_i = VSAT_i * (1.0 + T0y + T1v); if(ASYMMOD != 0) - VSATR_i = VSATR_i * (1.0 + T0y + T1y); + VSATR_i = VSATR_i * (1.0 + T0y + T1v); PSAT_i = max(PSAT_i * (1.0 + PSATL * max( pow(Inv_L, PSATLEXP) - pow(Inv_Llong, PSATLEXP), 0)), 0.25); if(ASYMMOD != 0) @@ -2378,22 +2379,22 @@ analog begin PIGCD_i = PIGCD * (1.0 + PIGCDL * Inv_L); T0y = NDEPCVL1 * max( pow(Inv_Lact, NDEPCVLEXP1) - pow(Inv_Llong, NDEPCVLEXP1), 0) + NDEPCVL2 * max( pow(Inv_Lact, NDEPCVLEXP2) - pow(Inv_Llong, NDEPCVLEXP2), 0); - T1y = NDEPCVW * max( pow(Inv_Wact, NDEPCVWEXP) - pow(Inv_Wwide, NDEPCVWEXP), 0) + NDEPCVWL * pow(Inv_Wact * Inv_Lact, NDEPCVWLEXP); - NDEPCV_i = NDEPCV_i * (1.0 + T0y + T1y); + T1v = NDEPCVW * max( pow(Inv_Wact, NDEPCVWEXP) - pow(Inv_Wwide, NDEPCVWEXP), 0) + NDEPCVWL * pow(Inv_Wact * Inv_Lact, NDEPCVWLEXP); + NDEPCV_i = NDEPCV_i * (1.0 + T0y + T1v); T0y = VFBCVL * max( pow(Inv_Lact, VFBCVLEXP) - pow(Inv_Llong, VFBCVLEXP), 0); - T1y = VFBCVW * max( pow(Inv_Wact, VFBCVWEXP) - pow(Inv_Wwide, VFBCVWEXP), 0) + VFBCVWL * pow(Inv_WL, VFBCVWLEXP); - VFBCV_i = VFBCV_i * (1.0 + T0y + T1y); + T1v = VFBCVW * max( pow(Inv_Wact, VFBCVWEXP) - pow(Inv_Wwide, VFBCVWEXP), 0) + VFBCVWL * pow(Inv_WL, VFBCVWLEXP); + VFBCV_i = VFBCV_i * (1.0 + T0y + T1v); T0y = VSATCVL * max( pow(Inv_Lact, VSATCVLEXP) - pow(Inv_Llong, VSATCVLEXP), 0); - T1y = VSATCVW * max( pow(Inv_W, VSATCVWEXP) - pow(Inv_Wwide, VSATCVWEXP), 0) + VSATCVWL * pow(Inv_WL, VSATCVWLEXP); - VSATCV_i = VSATCV_i * (1.0 + T0y + T1y); + T1v = VSATCVW * max( pow(Inv_W, VSATCVWEXP) - pow(Inv_Wwide, VSATCVWEXP), 0) + VSATCVWL * pow(Inv_WL, VSATCVWLEXP); + VSATCV_i = VSATCV_i * (1.0 + T0y + T1v); PCLMCV_i = PCLMCV_i * (1.0 + PCLMCVL * max( pow(Inv_Lact, PCLMCVLEXP) - pow(Inv_Llong, PCLMCVLEXP), 0)); PCLMCV_i = max(PCLMCV_i,0); T0y = K1L * max( pow(Inv_L, K1LEXP) - pow(Inv_Llong, K1LEXP), 0); - T1y = K1W * max( pow(Inv_W, K1WEXP) - pow(Inv_Wwide, K1WEXP), 0) + K1WL * pow(Inv_WL, K1WLEXP); - K1_i = K1_i * (1.0 + T0y + T1y); + T1v = K1W * max( pow(Inv_W, K1WEXP) - pow(Inv_Wwide, K1WEXP), 0) + K1WL * pow(Inv_WL, K1WLEXP); + K1_i = K1_i * (1.0 + T0y + T1v); T0y = K2L * max( pow(Inv_L, K2LEXP) - pow(Inv_Llong, K2LEXP), 0); T1y = K2W * max( pow(Inv_W, K2WEXP) - pow(Inv_Wwide, K2WEXP), 0) + K2WL * pow(Inv_WL, K2WLEXP); @@ -2693,10 +2694,10 @@ analog begin `endif T0y = TOXE * TOXE; - T1y = TOXE * POXEDGE_i; - T2y = T1y * T1y; + T1v = TOXE * POXEDGE_i; + T2y = T1v * T1v; ToxRatio = exp(NTOX_i * ln(TOXREF / TOXE))/ T0y; - ToxRatioEdge = exp(NTOX_i * ln(TOXREF / T1y)) /T2y; + ToxRatioEdge = exp(NTOX_i * ln(TOXREF / T1v)) /T2y; Aechvb = (TYPE == `ntype) ? 4.97232e-7 : 3.42537e-7; Bechvb = (TYPE == `ntype) ? 7.45669e11 : 1.16645e12; @@ -2757,12 +2758,12 @@ DevTemp = $temperature + DTEMP; Eg = BG0SUB - TBGASUB * DevTemp * DevTemp / (DevTemp + TBGBSUB); Eg0 = BG0SUB - TBGASUB * Tnom * Tnom / (Tnom + TBGBSUB); - T1y = (DevTemp / Tnom) * sqrt(DevTemp / Tnom); - ni = NI0SUB * T1y * lexp(Eg / (2.0 * Vtm0) - Eg / (2.0 * Vtm)); + T1u = (DevTemp / Tnom) * sqrt(DevTemp / Tnom); + ni = NI0SUB * T1u * lexp(Eg / (2.0 * Vtm0) - Eg / (2.0 * Vtm)); `ifdef __SHMOD__ if ((SHMOD != 0) && (RTH0 > 0)) begin - T0 = lln(NDEP_i/ni); - phib = sqrt(T0 * T0 + 1.0E-6); + T0v = lln(NDEP_i/ni); + phib = sqrt(T0v * T0v + 1.0E-6); end else begin phib = lln(NDEP_i/ni); end @@ -2771,8 +2772,8 @@ DevTemp = $temperature + DTEMP; `endif `ifdef __SHMOD__ if ((SHMOD != 0) && (RTH0 > 0)) begin - T0 = lln(NDEP_i*NSD/ni*ni); - Vbi = sqrt(T0 * T0 + 1.0E-6); + T0u = lln(NDEP_i*NSD/ni*ni); + Vbi = sqrt(T0u * T0u + 1.0E-6); end else begin Vbi = lln(NDEP_i*NSD/ni*ni); end @@ -2859,13 +2860,13 @@ DevTemp = $temperature + DTEMP; PBSWGS_t = hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0E-3) + 0.01; PBSWGD_t = hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0E-3) + 0.01; - T0y = Eg0 / Vtm0 - Eg / Vtm; + T0x = Eg0 / Vtm0 - Eg / Vtm; T1y = lln(TRatio); - T3y = lexp((T0y + XTIS * T1y) / NJS); + T3y = lexp((T0x + XTIS * T1y) / NJS); JSS_t = JSS * T3y; JSWS_t = JSWS * T3y; JSWGS_t = JSWGS * T3y; - T3y = lexp((T0y + XTID * T1y) / NJD); + T3y = lexp((T0x + XTID * T1y) / NJD); JSD_t = JSD * T3y; JSWD_t = JSWD * T3y; JSWGD_t = JSWGD * T3y; @@ -2937,14 +2938,14 @@ DevTemp = $temperature + DTEMP; if(Isbs > 0.0) begin Nvtms = Vtm * NJS; XExpBVS = lexp(-BVS / Nvtms) * XJBVS; - T2y = max(IJTHSFWD / Isbs, 10.0); - Tb = 1.0 + T2y - XExpBVS; + T2u = max(IJTHSFWD / Isbs, 10.0); + Tb = 1.0 + T2u - XExpBVS; VjsmFwd = Nvtms * lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVS))); - T0y = lexp(VjsmFwd / Nvtms); - IVjsmFwd = Isbs * (T0y - XExpBVS / T0y + XExpBVS - 1.0); - SslpFwd = Isbs * (T0y + XExpBVS / T0y) / Nvtms; - T2y = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0E-3) + 10.0; - VjsmRev = -BVS - Nvtms * lln((T2y - 1.0) / XJBVS); + T0x = lexp(VjsmFwd / Nvtms); + IVjsmFwd = Isbs * (T0x - XExpBVS / T0x + XExpBVS - 1.0); + SslpFwd = Isbs * (T0x + XExpBVS / T0x) / Nvtms; + T2u = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0E-3) + 10.0; + VjsmRev = -BVS - Nvtms * lln((T2u - 1.0) / XJBVS); T1y = XJBVS * lexp(-(BVS + VjsmRev) / Nvtms); IVjsmRev = Isbs * (1.0 + T1y); SslpRev = -Isbs * T1y / Nvtms; @@ -2964,14 +2965,14 @@ DevTemp = $temperature + DTEMP; if(Isbd > 0.0) begin Nvtmd = Vtm * NJD; XExpBVD = lexp(-BVD / Nvtmd) * XJBVD; - T2y = max(IJTHDFWD / Isbd, 10.0); - Tb = 1.0 + T2y - XExpBVD; + T2u = max(IJTHDFWD / Isbd, 10.0); + Tb = 1.0 + T2u - XExpBVD; VjdmFwd = Nvtmd * lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVD))); - T0y = lexp(VjdmFwd / Nvtmd); - IVjdmFwd = Isbd * (T0y - XExpBVD / T0y + XExpBVD - 1.0); - DslpFwd = Isbd * (T0y + XExpBVD / T0y) / Nvtmd; - T2y = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0E-3) + 10.0; - VjdmRev = -BVD - Nvtmd * lln((T2y - 1.0) / XJBVD); + T0x = lexp(VjdmFwd / Nvtmd); + IVjdmFwd = Isbd * (T0x - XExpBVD / T0x + XExpBVD - 1.0); + DslpFwd = Isbd * (T0x + XExpBVD / T0x) / Nvtmd; + T2u = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0E-3) + 10.0; + VjdmRev = -BVD - Nvtmd * lln((T2u - 1.0) / XJBVD); T1y = XJBVD * lexp(-(BVD + VjdmRev) / Nvtmd); IVjdmRev = Isbd * (1.0 + T1y); DslpRev = -Isbd * T1y / Nvtmd; @@ -3011,16 +3012,16 @@ DevTemp = $temperature + DTEMP; tmp1_stress_vth = LKVTH0 / T0y + WKVTH0 / T1y + PKVTH0 / (T0y * T1y); kstress_vth0 = 1.0 + tmp1_stress_vth; - T0y = (TRatio - 1.0); - ku0_temp = kstress_u0 * (1.0 + TKU0 * T0y) + 1.0e-9; + T0x = (TRatio - 1.0); + ku0_temp = kstress_u0 * (1.0 + TKU0 * T0x) + 1.0e-9; Inv_sa = 0; Inv_sb = 0;//Initialization of for loop i=0; while (i < NF) begin T0y = 1.0 / NF / (SA + 0.5*L_mult + i * (SD +L_mult)); - T1y = 1.0 / NF / (SB + 0.5*L_mult + i * (SD +L_mult)); + T1v = 1.0 / NF / (SB + 0.5*L_mult + i * (SD +L_mult)); Inv_sa = Inv_sa + T0y; - Inv_sb = Inv_sb + T1y; + Inv_sb = Inv_sb + T1v; i = i + 1; end @@ -3053,15 +3054,15 @@ DevTemp = $temperature + DTEMP; local_scc = SCC; if(!$param_given(SCA) && !$param_given(SCB) && !$param_given(SCC)) begin if($param_given(SC) && SC > 0.0) begin - T1y = SC + Wdrn; + T1v = SC + Wdrn; T2y = 1.0 / SCREF; - local_sca = SCREF * SCREF / (SC * T1y); + local_sca = SCREF * SCREF / (SC * T1v); local_scb = ( (0.1 * SC + 0.01 * SCREF) * - exp(-10.0 * SC * T2y) - (0.1 * T1y + 0.01 * SCREF) * - exp(-10.0 * T1y * T2y) ) / Wdrn; + exp(-10.0 * SC * T2y) - (0.1 * T1v + 0.01 * SCREF) * + exp(-10.0 * T1v * T2y) ) / Wdrn; local_scc = ( (0.05 * SC + 0.0025 * SCREF) * - exp(-20.0 * SC * T2y) - (0.05 * T1y + 0.0025 * SCREF) * - exp(-20.0 * T1y * T2y) ) / Wdrn; + exp(-20.0 * SC * T2y) - (0.05 * T1v + 0.0025 * SCREF) * + exp(-20.0 * T1v * T2y) ) / Wdrn; end else `STROBE("Warning: (Instance BSIM6) No WPE as none of SCA, SCB, SCC, SC is given and/or SC not positive.");