// // Verilog-A definition of the basic IGBT Model. // // See the following reference for complete documentation // P. O. Lauritzen, G. K. Andersen, M. Helsper, "A basic IGBT model with easy parameter extraction" // IEEE PESC, Vancouver, BC, Canada, June 2001 // // Last revision: 2010/04/17 // Authors: Ivica Stevanovic, ABB Switzerland, Corporate Research // John Warner, SIMetrix // // Revisions: // 2010/04/13 Initial version (Ivica Stevanovic, ABB) // 2010/04/16 MAST system of equations mapped to the voltages and nodes (John Warner, SIMetrix) // 2010/04/17 Version implemented in SIMetrix (Ivica Stevanovic, ABB) // Disclaimer: // ABB may not be held liable in case of any errors in this code or third party rights infringed by this code. // `include "disciplines.vams" `include "constants.vams" // // Start of IGBT model code // module igbt3(a, g, k); // // Node definitions (the local temperature rise is external) // inout a, g, k; electrical a, g, k ; // Internal nodes. These are used to solve the 9 unknowns // in the original MAST design. // listed in the "equations" section of the MAST file. // The voltages on these nodes represent the solution. // e.g. V(n_udep) holds the value of the MAST variable udep. electrical n_iCak, n_iCab, n_udep, n_iCag, n_ip46, n_u34, n_u5ki, n_iCgk, n_vki ; parameter real kp = 150; // MOSFET Transconductance Coefficient (A) parameter real VT = 5; // Threshold Voltage (V) parameter real b = 2; // Mobility reduction fitting parameter (nu) parameter real kv = 1; // Turn-on Voltage fitting parameter (nu) parameter real T0 = 1.0e-6 from(0:inf); // Base transit time at low Voltagee (s) parameter real tB = 2.0e-6 from(0:inf); // Base carrier lifetime (s) parameter real tA = 160.0e-9 from(0:inf); // equivalent lifetime of anode emitter efficiency (s) parameter real ILH = 4 from(0:inf); // Transition from low to high level injection (A) parameter real vj = 0.6; // Junction built-in voltage (V) parameter real vpt = 600.0; // punch through voltage (V) parameter real rH = 0.0; // high voltage & current parameter (1/I), where // rH=vpt/(vj*IH), IH being the current when this effect begins parameter real Cox = 1.0e-9 from(0:inf); // gate-anode oxide capacitance (F) parameter real Cgk0 = 1.0e-9 from(0:inf); // gate-cathode capacitance at zero bias (F) parameter real Cak0 = 2.0e-9 from(0:inf); // anode-cathode capacitance at zero bias (F) parameter real gamma= 0.2; // Base body effect parameter (V^0.5) parameter real rK = 0.1; // Cathode parasitic resistance (Ohm) parameter real LK = 0.1e-9; // Cathode parasitic inductance (H) parameter real temp = 25; // Device temperature (deg C) parameter real fc = 0.5; // Parameter for junction capacitance real kb, q; // Constants real u45, u5G, uox, uGKi, uAK, ulim; // Normalized voltages real vGKi; // Internal gate-cathode voltage real id, iA, ip34, in34, in45, in56, iK; // internal currents real qp4, qp5, q34, q56, bq, qAG; // diffusion and depletion charges real cqm; real y, yu, uu5Kpt; // y is the normalized base width real tt; // base transit time real u34, u5Ki, udep; // normalized internal voltages real ip46, iCak, iCab, iCag, iCgk; // internal currents real vKi; // external to internal cathode voltage real Cab0; // anode-base capacitance at zero bias real vth; // thermal voltage real uj; // Normalized built-in voltage real upt; // Normalized punch through voltage real ruH; // Normalizedhigh voltage and current parameter real qAG0; real QB, QpB; real Qi, Qi2; real tK; // cathode efficiency becomes relevant as a separate parameter only when // iA reverses in ZCS applications real IAS, IKS, Qak0, Qak1, Qak2; real limexp_udep ; real gmin; analog begin begin: initializeParameters kb = `P_K; q = `P_Q; gmin = 1.0e-12; Cab0 = 2.0*Cak0; // anode-base capacitance at zero bias vth = kb*(temp+273.0)/q; // Thermal voltage uj = vj/vth; upt = vpt/vth; ruH = rH/vth; qAG0 = Cox*gamma*sqrt(vth); QB = 2*T0*ILH; Qi = QB/(sqrt(exp(uj))); Qi2 = Qi*Qi; QpB = Qi2/QB; tK = tA; IAS = Qi2/QB/tA; IKS = Qi2/QB/tK; Qak0 = 2.0*Cak0*vj; Qak1 = Cak0*vth; Qak2 = Cak0*vth/uj/4.0; end //initializeParameters // retrieve solutions to the 9 unknowns vKi = V(n_vki) ; udep = V(n_udep) ; u34 = V(n_u34) ; u5Ki = V(n_u5ki) ; ip46 = V(n_ip46) ; iCag = V(n_iCag) ; iCak = V(n_iCak) ; iCgk = V(n_iCgk) ; iCab = V(n_iCab) ; vGKi = V(g) -V(k)-vKi ; uGKi = vGKi/vth ; uAK = (V(a)-V(k))/vth ; //I(a,g) <+ gmin*V(a,g); //I(g,k) <+ gmin*V(g,k); //I(a,k) <+ gmin*V(a,k); //Gate & cathode depletion charge calculations u5G=u5Ki-uGKi ; // limexp def outside conditional to comply with VA rules limexp_udep = limexp(-udep) ; if (udep>0) qAG=qAG0*sqrt(abs(limexp_udep+udep-1)) ; else qAG=-qAG0*sqrt(abs(limexp_udep+udep-1)) ; uox=qAG/Cox/vth ; if (u5Ki>0) q56=Qak0*sqrt(1+u5Ki/uj) ; else q56=Qak0+u5Ki*Qak1-u5Ki*u5Ki*Qak2 ; q34=vth*Cab0*u34 ; // Current calculations in34= IAS*(limexp(u34)-1) ; in56=-IKS*(limexp(-u5Ki)-1) ; if (vGKi<=VT) id = 0 ; else id = kp/2.0*(pow((vGKi/VT-1),b))*tanh(kv*vth*u5Ki/(vGKi-VT)) ; in45 = iCak+id+iCag+in56 ; //electron current into base iA=ip46+in45 ; ip34=iA-in34-iCab ; iK = iA-iCag+iCgk ; // Variable base width calculations uu5Kpt = 40*(u5Ki/upt-0.87) ; ulim = limexp(uu5Kpt) ; yu = ((uj+u5Ki)/(upt+(ip46-id)*ruH)+0.9*ulim)/(1+ulim) ; if (yu>=0) y=1-sqrt(abs(yu)) ; else y=1 ; tt=T0*y ; // Diffusion charge calculations qp5=QpB*limexp(-u5Ki) ; bq=tt*(in45-ip46)+QB-2*qp5 ; //"B" term in quadratic solution cqm=QB*(qp5+tt*ip46) ; if (bq*bq>cqm*1.0e4) //qp4= 2*cqm/(bq+sqrt(bq*bq+8*cqm)) ; qp4=cqm/bq; else begin qp4=0.25*(-bq+sqrt(abs(bq*bq+8*cqm))) ; end u45=tt*(in45+ip46)/(2*qp4+QB) ; // MAST Equations section // We must define an equation to solve. We do this using a // branch contribution to define a current for the unknown // node. The current must solve to zero as there is no other // connection to the node. So for example, the original MAST // expression for udep is "udep: u5G=(udep+uox)". We rearrange this to // u5G-(udep+uox) then assign in a branch contribution to I(n_udep). // The simulator will then solve for u5G-(udep+uox)=0. // // It would be closer to the original MAST code to use Verilog-A // indirect contributions, but SIMetrix has not implemented these // just yet. The following does exactly the same thing. // MAST: iCak: iCak=d_by_dt(q56) I(n_iCak) <+ iCak -ddt(q56) ; // MAST: iCab: iCab=d_by_dt(q34) I(n_iCab) <+ iCab -ddt(q34) ; // MAST: udep: u5G=udep+uox I(n_udep) <+ u5G-(udep+uox) ; // MAST: iCag: iCag=+d_by_dt(qAG) I(n_iCag) <+ iCag -ddt(qAG) ; // ip46: ip34-ip46=(qp4-QpB)*y/tB+d_by_dt(qp4*y) I(n_ip46) <+ ip34-ip46 - ((qp4-QpB)*y/tB+ddt(qp4*y)) ; // u34: qp4*(qp4+QB)=Qi2*limexp(u34) I(n_u34) <+ qp4*(qp4+QB) - Qi2*limexp(u34) ; // u5Ki: uAK=u34+u45+u5Ki+vKi/vt I(n_u5ki) <+ uAK-(u34+u45+u5Ki+vKi/vth) ; // MAST: iCgk: iCgk=d_by_dt(Cgk0*vGKi) I(n_iCgk) <+ iCgk- ddt(Cgk0*vGKi) ; // vKi: vKi=iK*rK+d_by_dt(LK*iK) I(n_vki) <+ vKi-(iK*rK+ddt(LK*iK)) ; I(a) <+ iA ; I(g) <+ -iCag+iCgk ; I(k) <+ - iK ; end endmodule