/* Copyright @ 2018 Stanford University. The terms under which the software and associated documentation (the Software) is provided are as the following: DISCLAIMER: 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. Stanford University 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: LIST OF CONDITIONS: 1. The users agree not to charge for the code itself but may charge for additions, extensions, or support. 2. In any product based on the Software, the users agree to acknowledge the 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. Redistributions to others of source code must retain the copyright notice, disclaimer, and list of conditions. 5. Redistributions to others in binary form must reproduce the copyright notice, disclaimer, and list of conditions in the documentation and/or other materials provided with the distribution. Agreed to by Prof. Eric Pop, Stanford August 10, 2018 */ // Author: Saurabh Suryavanshi, saurabhv@stanford.edu // Update: August 10, 2018 // Details: The model is compatible with all the simulations of the previous version. // All units are in SI standards unless specified otherwise // Tested on : HSPICE 2013 `include "constants.vams" `include "disciplines.vams" `define SMALL_VAL 1e-10 `define LARGE_VAL 25 module s2dsb_100(d, g, s); inout d, g, s; // Bidirectional external ports electrical d, g, s; // interal nodes electrical di, si; // Intrinsic transistor nodes thermal dt, th_gnd; // Thermal calculation // Integer Flags parameter integer type = 1 from [-1:1] exclude 0; // type 1 = NFET and type -1 = PFET parameter integer SELFHEAT = 0 from [0:1]; // Self heat on if SELFHEAT = 1, Off if 0 //Constatns parameter real kb = 1.38e-23 from [0: 1]; // Boltzmann constat parameter real q = `P_Q from [0:inf); // Electronic Charge parameter real me = 9.1e-31 from [0:inf); // Free electron mass parameter real meff = 0.45*me from [0:inf); // Effectice mass of electron in 1l MoS2 parameter real h_bar = 1.05e-34 from [0:inf); // Value of h_bar parameter real eps0 = 8.85e-12 from [0:inf); // permittivity of free space // Device parameters parameter real version = 1.00 from [0: 10]; // 2D_FET model version = 1.0. parameter real W = 1e-6 from [0:inf); // Width of the device [m] parameter real L = 1e-8 from (0:inf); // Length of gate [m] parameter real LU = 15e-9 from (0:inf); // Overlap gate, 0 is there is no overlap [m] parameter real t_2D = 0.615e-9 from (0:inf); // Thickness of channel material [m] parameter real gate_d = 5.3e-9 from [0:inf); // Top gate oxide thickness [m] parameter real t_ox = 30e-9 from [0:inf); // Bottom gate oxide thickness [m] parameter real tm = 10e-9 from [5e-9: 100e-9]; // Thickness of the gate metal used in calculations of parasitics parameter real Vt0 = -3.8 from [-10: 10]; // device threshold voltage parameter real eps = 7.8 from [-10: 10]; // Device dielectric constant // Mobility calculation fixed parameters parameter real mu_eff_300K = 5e-4 from [0:inf); // effective mobility at 300K parameter real mu_exp = -0.75 from (-4:4); parameter real chi = 20 from (0:inf); parameter real beta0 = 4 from (0:inf); parameter real theta = 2 from (0:inf); parameter real xi = 0.33 from (0:inf); // parameters extracted from IV parameter real delta = 0.07 from [0:inf); parameter real alpha = 3.5 from [0:inf); parameter real n0 = 1.7 from [0:inf); parameter real nd = 0.05 from [0:inf); // Contact resistance parameter real Rc_1 = 300000*1e-6 from (0:inf); // contact resistance parameter 1 parameter real Rc_2 = 5 from (0:inf); // contact resistance parameter 1 parameter real Rc_3 = 800e-6 from (0:inf); // contact resistance parameter 1 // Thermal parameters parameter real T0 = 225 from [0: inf); // Ambient temperautre parameter real kox = 1.4 from (0: inf); // Thermal conductivity, kox cannot be zero parameter real km = 100.0 from [0: inf); // Thermal conductivity parameter real k2D = 32 from [0: inf); // Thermal conductivity parameter real ksi = 100.0 from [0: inf); // Thermal conductivity of Si parameter real Rcox = 6.7e-8 from [0: inf); // Thermal resistance of1L MoS2 and oxide contact // self-heating thermal resistance calcualtion parameter real Weff = W+t_ox*2.0 from [0: inf); // Effective width for the calculation of the heating effect parameter real Rth_ox = 1 /( (`M_PI *kox) /ln(6*(t_ox/W +1)) + kox/t_ox * W) from [0: inf); parameter real Rth_int = Rcox / W from [0: inf); parameter real Rth_si = 1/(2*ksi) *sqrt((L + 2*LU)/Weff) from [0: inf); parameter real Rth0 = (Rth_ox + Rth_int + Rth_si) / (L) from [0: inf); parameter real LH = sqrt(t_2D*t_ox*k2D/kox) from [0: inf); // thermal healing length 2D-oxide parameter real LHM = sqrt(tm*t_ox*km/kox) from [0: inf); // thermal healing length oxide-metal parameter real RT = LHM/(km*tm*(W + 2*LHM)) from [0: inf); // Themral resistance of metal contacts // general variables real phit = 0; real kT = 0; // mobility parameter real mu = 0; // l_critical real LC = 0; real f2 = 0; real f2_num = 0; // num for f2 calculation real f2_den = 0; // den for f2 calculation // variables for tranmission calcualtions real vt = 0; real Tr = 0; real lambda = 0; // varibles for current calcualtions real Fsat_int = 0; real Fsat_num = 0; real Fsat_den = 0; real Fsat = 0; real FF = 0; real FF_int = 0; real n = 0; real Qn = 0; real Qn_int = 0; real Cox = 0; real Ids = 0; // Temperature calcualtion variables real Tsh = 0; real T = 0; real TnomK = 0; real x_th = 0; real Rth = 0; real g_th = 0; real RcSource; real RcDrain; // Final contact resistance real Vdsi = 0; real Vgsi = 0; real Vgdi = 0; real dir = 1.0; real Vgs = 0; real Vds = 0; real Vgsraw; real Vgdraw; analog begin Vgsraw = type*(V(g,si)); Vgdraw = type*(V(g,di)); // Following statements will switch the source and drain, if voltage of opposite polarity is applied to drain. // type takes care of P-type devices. if (Vgsraw >= Vgdraw) begin Vds = type*(V(d,s)); Vgs = type*(V(g,s)); Vdsi = type*(V(di,si)); Vgsi = Vgsraw; Vgdi = Vgdraw; dir = 1.0; end else begin Vds = type*(V(s,d)); Vgs = type*(V(g,d)); Vdsi = type*(V(si,di)); Vgsi = Vgdraw; Vgdi = Vgsraw; dir = -1.0; end TnomK = T0; // T0 is the ambient temperature Tsh = Temp(dt,th_gnd); // Additional temperature due to self-heating. dt is the thermal node. T = TnomK+Tsh; // Total temperature due to self-heating phit = $vt(T); // Thermal voltage kT = q*phit; // phonon limited mobility mu = mu_eff_300K *pow((T/300),mu_exp); // l_critical calculation f2_num = Vdsi/(theta*phit); f2_den = pow(( 1 + pow(f2_num, beta0)), 1/beta0); f2 = f2_num/f2_den; LC = L*(1-f2) + xi * L * f2; // transmission calculation vt = sqrt(2*kb*T/(meff*`M_PI)); lambda = 2*phit*mu/vt; Tr = lambda/(lambda + LC); // Current calcualtion Fsat_int = limexp(-Vdsi/(chi*phit)); Fsat_num = 1 - Fsat_int; Fsat_den = 1 + Tr*Fsat_int/(2-Tr); Fsat = Tr*Fsat_num/((2-Tr)*Fsat_den); n = n0 + nd*Vdsi; FF_int = (Vgsi - (Vt0 - delta*Vdsi -0.5*alpha*phit))/(n*phit); FF = 1 / (1 + limexp(FF_int)); Cox = eps*eps0/gate_d; Qn_int = (Vgsi - (Vt0 - delta*Vdsi - FF*phit))/(n*phit); if (Qn_int < `LARGE_VAL) begin Qn = Cox*n*phit * ln( 1.0 + limexp(Qn_int) ); end else begin Qn = Cox*n*phit*Qn_int; end Ids = W*Qn*vt*Fsat; RcDrain = (Rc_1*limexp(-Rc_2*Vds)+Rc_3)/W; // To avoide the issue of zero contact resistance RcSource = RcDrain; // Final Current I(di,si) <+ type*dir*Ids ; I(d,di) <+ (V(d,di)/RcDrain); I(si,s) <+ (V(si,s)/RcSource); // Self heating x_th = tanh(L/(2*LH)); g_th = 1/(Rth0*L); Rth = Rth0*(1 + g_th*LH*RT*x_th - 2*x_th*LH/L)/(1 + g_th * LH * RT * x_th); if (SELFHEAT) begin Pwr(dt) <+ -(Ids*Vdsi); Pwr(dt) <+ Temp(dt)/Rth; end else begin Temp(dt,th_gnd) <+ 0.0; // collapse the node if not in use end end // analog module ends endmodule