Revert "bsim6.va, macro for hypsmooth, to avoid derivatives of this function"
This commit is contained in:
parent
b6f5cfb8ac
commit
12cbb8bf9b
|
|
@ -654,8 +654,13 @@ analog function real lln;
|
|||
endfunction
|
||||
|
||||
// Hyperbolic smoothing function
|
||||
`define hypsmooth(x,c) \
|
||||
(0.5 * ((x) + sqrt((x)*(x) + 4.0*(c)*(c))))
|
||||
analog function real hypsmooth;
|
||||
input x , c;
|
||||
real x , c;
|
||||
begin
|
||||
hypsmooth = 0.5 * (x + sqrt(x*x + 4.0*c*c));
|
||||
end
|
||||
endfunction
|
||||
/***************************/
|
||||
/* Instance Parameters */
|
||||
/***************************/
|
||||
|
|
@ -2786,7 +2791,7 @@ DevTemp = $temperature + DTEMP;
|
|||
T1DEP = sqrt(2.0 * epssi / (`q * NDEP_i));
|
||||
litl = sqrt((epssi / epsox) * TOXE * XJ_i);//SCBE Rout
|
||||
|
||||
NFACTOR_t = NFACTOR_i * `hypsmooth((1.0 + TNFACTOR * (TRatio - 1.0)),1e-3);
|
||||
NFACTOR_t = NFACTOR_i * hypsmooth((1.0 + TNFACTOR * (TRatio - 1.0)),1e-3);
|
||||
ETA0_t = ETA0_i * (1.0 + TETA0 * (TRatio - 1.0));
|
||||
if(ASYMMOD != 0)
|
||||
ETA0R_t = ETA0R_i * (1.0 + TETA0 * (TRatio - 1.0));
|
||||
|
|
@ -2794,14 +2799,14 @@ DevTemp = $temperature + DTEMP;
|
|||
eta_mu = (TYPE != `ntype) ? (`Oneby3 * ETAMOB) : (0.5 * ETAMOB);
|
||||
|
||||
U0_t = U0_i * pow(TRatio, UTE_i);
|
||||
UA_t = UA_i * `hypsmooth(1.0 + UA1_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
UC_t = UC_i * `hypsmooth(1.0 + UC1_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
UA_t = UA_i * hypsmooth(1.0 + UA1_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
UC_t = UC_i * hypsmooth(1.0 + UC1_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
UD_t = UD_i * pow(TRatio, UD1_i);
|
||||
UCS_t = UCS_i * pow(TRatio, UCSTE_i);
|
||||
if(ASYMMOD != 0) begin
|
||||
U0R_t = U0R_i * pow(TRatio, UTE_i);
|
||||
UAR_t = UAR_i * `hypsmooth(1.0 + UA1_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
UCR_t = UCR_i * `hypsmooth(1.0 + UC1_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
UAR_t = UAR_i * hypsmooth(1.0 + UA1_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
UCR_t = UCR_i * hypsmooth(1.0 + UC1_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
UDR_t = UDR_i * pow(TRatio, UD1_i);
|
||||
UCSR_t = UCSR_i * pow(TRatio, UCSTE_i);
|
||||
end
|
||||
|
|
@ -2827,32 +2832,32 @@ DevTemp = $temperature + DTEMP;
|
|||
VSATCV_t = 100.0;
|
||||
end
|
||||
|
||||
DELTA_t = 1.0 / ( `hypsmooth((1.0/DELTA_i) * (1.0 + TDELTA * delTemp)-2.0 , 1.0E-3) + 2.0);
|
||||
PTWG_t = PTWG_i * `hypsmooth(1.0 - PTWGT_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
DELTA_t = 1.0 / ( hypsmooth((1.0/DELTA_i) * (1.0 + TDELTA * delTemp)-2.0 , 1.0E-3) + 2.0);
|
||||
PTWG_t = PTWG_i * hypsmooth(1.0 - PTWGT_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
if(ASYMMOD != 0)
|
||||
PTWGR_t = PTWGR_i * `hypsmooth(1.0 - PTWGT_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
PTWGR_t = PTWGR_i * hypsmooth(1.0 - PTWGT_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
|
||||
A1_t = A1_i * `hypsmooth(1.0 + A11_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
A2_t = A2_i * `hypsmooth(1.0 + A21_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
A1_t = A1_i * hypsmooth(1.0 + A11_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
A2_t = A2_i * hypsmooth(1.0 + A21_i*delTemp - 1.0E-6, 1.0E-3);
|
||||
|
||||
BETA0_t = BETA0_i * pow(TRatio, IIT_i);
|
||||
BGIDL_t = BGIDL_i * `hypsmooth(1.0 + TGIDL_i * delTemp - 1.0E-6, 1.0E-3);
|
||||
BGISL_t = BGISL_i * `hypsmooth(1.0 + TGIDL_i * delTemp - 1.0E-6, 1.0E-3);
|
||||
BGIDL_t = BGIDL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0E-6, 1.0E-3);
|
||||
BGISL_t = BGISL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0E-6, 1.0E-3);
|
||||
igtemp = lexp(IGT_i * lln(TRatio)); //pow(TRatio, IGT_i);
|
||||
|
||||
//***Diode Model temperature Code Start***//
|
||||
CJS_t = CJS * `hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJD_t = CJD * `hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJSWS_t = CJSWS * `hypsmooth(1.0 + TCJSW * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJSWD_t = CJSWD * `hypsmooth(1.0 + TCJSW * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJSWGS_t = CJSWGS * `hypsmooth(1.0 + TCJSWG * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJSWGD_t = CJSWGD * `hypsmooth(1.0 + TCJSWG * delTemp - 1.0E-6, 1.0E-3);
|
||||
PBS_t = `hypsmooth(PBS - TPB * delTemp - 0.01, 1.0E-3) + 0.01;
|
||||
PBD_t = `hypsmooth(PBD - TPB * delTemp - 0.01, 1.0E-3) + 0.01;
|
||||
PBSWS_t = `hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0E-3) + 0.01;
|
||||
PBSWD_t = `hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0E-3) + 0.01;
|
||||
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;
|
||||
CJS_t = CJS * hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJD_t = CJD * hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJSWS_t = CJSWS * hypsmooth(1.0 + TCJSW * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJSWD_t = CJSWD * hypsmooth(1.0 + TCJSW * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJSWGS_t = CJSWGS * hypsmooth(1.0 + TCJSWG * delTemp - 1.0E-6, 1.0E-3);
|
||||
CJSWGD_t = CJSWGD * hypsmooth(1.0 + TCJSWG * delTemp - 1.0E-6, 1.0E-3);
|
||||
PBS_t = hypsmooth(PBS - TPB * delTemp - 0.01, 1.0E-3) + 0.01;
|
||||
PBD_t = hypsmooth(PBD - TPB * delTemp - 0.01, 1.0E-3) + 0.01;
|
||||
PBSWS_t = hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0E-3) + 0.01;
|
||||
PBSWD_t = hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0E-3) + 0.01;
|
||||
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;
|
||||
T1y = lln(TRatio);
|
||||
|
|
@ -2872,12 +2877,12 @@ DevTemp = $temperature + DTEMP;
|
|||
JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weffcj) + 1.0) * lexp(Eg0 * XTSSWGD * (TRatio - 1) / Vtm);
|
||||
|
||||
//All NJT*'s smoothed to 0.01 to prevent divide by zero / negative values
|
||||
NJTS_t = `hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSSW_t = `hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSSWG_t = `hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSD_t = `hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSSWD_t = `hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSSWGD_t = `hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTS_t = hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSSWG_t = hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSSWD_t = hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0E-3) + 0.01;
|
||||
//***Diode Model temperature Code End***//
|
||||
|
||||
// Effective Source/Drain junction area and perimeter
|
||||
|
|
@ -2938,7 +2943,7 @@ DevTemp = $temperature + DTEMP;
|
|||
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;
|
||||
T2y = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0E-3) + 10.0;
|
||||
VjsmRev = -BVS - Nvtms * lln((T2y - 1.0) / XJBVS);
|
||||
T1y = XJBVS * lexp(-(BVS + VjsmRev) / Nvtms);
|
||||
IVjsmRev = Isbs * (1.0 + T1y);
|
||||
|
|
@ -2965,7 +2970,7 @@ DevTemp = $temperature + DTEMP;
|
|||
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;
|
||||
T2y = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0E-3) + 10.0;
|
||||
VjdmRev = -BVD - Nvtmd * lln((T2y - 1.0) / XJBVD);
|
||||
T1y = XJBVD * lexp(-(BVD + VjdmRev) / Nvtmd);
|
||||
IVjdmRev = Isbd * (1.0 + T1y);
|
||||
|
|
@ -3200,9 +3205,9 @@ DevTemp = $temperature + DTEMP;
|
|||
//********************************************Threshold Voltage for Operating Point Information**************************************************************//
|
||||
gam = sqrt(2.0 * `q * epssi*NDEP_i * inv_Vt)/Cox;
|
||||
q_vth = 0.5;
|
||||
T0 = `hypsmooth((2*phib+Vs*inv_Vt),1e-3);
|
||||
T0 = hypsmooth((2*phib+Vs*inv_Vt),1e-3);
|
||||
nq = 1.0+ gam/(2.0*sqrt(T0));
|
||||
psip_th = `hypsmooth((Vs*inv_Vt+2*phib+ln(q_vth)+2*q_vth+ln(2*nq/gam * (2*q_vth*nq/gam + 2*sqrt(T0)))),1e-3);
|
||||
psip_th = hypsmooth((Vs*inv_Vt+2*phib+ln(q_vth)+2*q_vth+ln(2*nq/gam * (2*q_vth*nq/gam + 2*sqrt(T0)))),1e-3);
|
||||
VTH = VFB_i+ (psip_th-Vs*inv_Vt)*Vt + Vt*gam*sqrt(psip_th)+ Vth_shift;
|
||||
//******************************************************************************************************************//
|
||||
|
||||
|
|
@ -3400,7 +3405,7 @@ DevTemp = $temperature + DTEMP;
|
|||
Vgst2Vtm = qia + 2.0 * nVt;
|
||||
if (DIBLfactor > 0) begin
|
||||
T3 = Vgst2Vtm / (Vdssat + Vgst2Vtm);
|
||||
T4 = `hypsmooth((1.0 + PDIBLCB_i * Vbsx),1e-3);
|
||||
T4 = hypsmooth((1.0 + PDIBLCB_i * Vbsx),1e-3);
|
||||
T5 = 1/T4;
|
||||
VaDIBL = Vgst2Vtm / DIBLfactor * T3 * PVAGfactor * T5;
|
||||
Moc = 1.0 + diffVds / VaDIBL;
|
||||
|
|
@ -3676,12 +3681,12 @@ DevTemp = $temperature + DTEMP;
|
|||
T6 = 0.0;
|
||||
end else begin
|
||||
T1 = (- Vgd_noswap - EGIDL_i + Vfbsdr) / T0y;
|
||||
T1 = `hypsmooth(T1, 1.0E-2);
|
||||
T1 = hypsmooth(T1, 1.0E-2);
|
||||
T2 = BGIDL_t / (T1 + 1.0E-3);
|
||||
if (CGIDL_i !=0) begin
|
||||
T3 = Vdb_noswap*Vdb_noswap*Vdb_noswap;
|
||||
T4 = CGIDL_i + abs(T3) + 1.0E-9;
|
||||
T5 = `hypsmooth(T3/T4, 1.0E-6) - 1.0E-6;
|
||||
T5 = hypsmooth(T3/T4, 1.0E-6) - 1.0E-6;
|
||||
end else
|
||||
T5 = 1.0;
|
||||
T6 = AGIDL_i * Weff * T1 * lexp(-T2) * T5;
|
||||
|
|
@ -3693,12 +3698,12 @@ DevTemp = $temperature + DTEMP;
|
|||
T6 = 0.0;
|
||||
end else begin
|
||||
T1 = (- Vgs_noswap - EGISL_i + Vfbsdr) / T0y;
|
||||
T1 = `hypsmooth(T1, 1.0E-2);
|
||||
T1 = hypsmooth(T1, 1.0E-2);
|
||||
T2 = BGISL_t / (T1 + 1.0E-3);
|
||||
if (CGISL_i !=0) begin
|
||||
T3 = Vsb_noswap*Vsb_noswap*Vsb_noswap;
|
||||
T4 = CGISL_i + abs(T3) + 1.0E-9;
|
||||
T5 = `hypsmooth(T3/T4, 1.0E-6) - 1.0E-6;
|
||||
T5 = hypsmooth(T3/T4, 1.0E-6) - 1.0E-6;
|
||||
end else
|
||||
T5 = 1.0;
|
||||
T6 = AGISL_i * Weff * T1 * lexp(-T2) * T5;
|
||||
|
|
@ -4227,7 +4232,7 @@ end
|
|||
// Edge FET Model Implementation
|
||||
//****************************************************
|
||||
if (EDGEFET == 1) begin
|
||||
NFACTOREDGE_t = NFACTOREDGE * `hypsmooth((1.0 + TNFACTOREDGE * (TRatio - 1.0)),1e-3);
|
||||
NFACTOREDGE_t = NFACTOREDGE * hypsmooth((1.0 + TNFACTOREDGE * (TRatio - 1.0)),1e-3);
|
||||
ETA0EDGE_t = ETA0EDGE * (1.0 + TETA0EDGE * (TRatio - 1.0));
|
||||
|
||||
cdsc = CITEDGE + NFACTOREDGE_t + CDSCDEDGE * Vdsx - CDSCBEDGE * Vbsx;
|
||||
|
|
|
|||
Loading…
Reference in New Issue