模型的相关理论原理这里不作描述,直接上代码:
1 `include"disciplines.vams" 2 `include"constants.vams" 3 module STT-MTJ(p,n,Vstate); 4 input p,n; 5 output Vstate; 6 electrical p,n,Vstate; 7 //===================== 模型参量初始化 ============================== 8 parameter real e = 1.6e-19; // 电子电荷量, 1.6*10^-19C 9 parameter real m = 9.1e-31; // 电子质量, 9.1*10^-31kg 10 parameter real hbar = 6.626e-34; // 约化普朗克常量 11 parameter real C = 0.557; // 欧拉常数 12 parameter real alpha = 0.027; // 吉尔伯特阻尼系数 13 parameter real ub = 9.274e-24; // 波尔磁子常数, 9.274*10^-24J/T 14 parameter real Kb = 1.38e-23; // 玻尔兹曼常数, 1.38*10^-23J/K 15 parameter real P = 0.52; // 电子自旋极化率 16 parameter real tox = 0.85e-9; // 绝缘层MgO的厚度, 0.85nm 17 parameter real tfl = 1.3e-9; // 自由层厚度, 1.3nm 18 parameter real r = 65e-9; // MTJ半径,65nm 19 parameter real F = 332.2; // R*A相关阻力系数,332.2 20 parameter real PhiBar = 0.4; // 绝缘层MgO势垒高度, 0.4eV 21 parameter real TMR0 = 0.7; // 零偏压下的TMR值, 0.7 22 parameter real Vh = 0.5; // TMRreal=0.5*TMR0时MTJ结上的电压,0.5V 23 parameter real u0 = 1.2566e-6; // Permeability in free space. 24 parameter real Ms = 456e3; // 饱和磁化强度 25 parameter real Hk = 113e3; // 各向异性磁场强度 26 parameter real T = 300; // 温度, 300K 27 parameter real tau0 = 1.0e-9; // 频率,1ns,1kHz 28 parameter real InitState = 0; // 初始状态,P=0, AP=1 29 30 real Area; // 磁隧道结面积 31 real VF; // 自由层体积 32 real R0; // MTJ结偏压为零时的电阻值 33 real TMRreal; // MTJ上的实际TMR值 34 real Vmtj; // MTJ上的电压 35 real RP,RAP,Rreal; // MTJ上的电阻 36 real gamma; // 旋磁比 37 real gP,gAP; // 自旋极化效率因子 38 real IcP,IcAP; // 开关电流 39 real tau; // 翻转时间 40 real tauNB; // 数据保持时间 41 real E; // 42 real Eps; // 热稳定系数 43 real Ireal,IrealAP,Imtj; // MTJ上的实际电流 44 real width; // 脉冲宽度 45 real start; // 开始时间 46 integer state; 47 48 analog begin 49 @(initial_step)begin 50 Area = `M_PI*r*r; 51 VF = Area*tfl; 52 R0 = tox*exp(1.025*tox*sqrt(PhiBar))/(F*sqrt(PhiBar)*Area); 53 RP = R0; 54 Rreal = RP; 55 gamma = 2*ub/hbar; 56 gP = 1/(-4+pow(sqrt(P)+1/sqrt(p),3)*0.5); 57 gAP = 1/(-4+pow(sqrt(P)+1/sqrt(p),3)); 58 IcP = alpha*gamma*e/(ub*gP)*u0*Ms*Hk*VF; 59 IcAP = alpha*gamma*e/(ub*gAP)*u0*Ms*Hk*VF; 60 E = u0*Ms*Hk*VF/2; 61 Eps = E/(Kb*T); 62 state = InitState; 63 end 64 65 Vmtj = V(p,n); 66 Imtj = Vmtj/Rreal; 67 TMRreal = TMR0/(1+Vmtj*Vmtj/(Vh*Vh)); 68 RAP = RP*(1+TMRreal); 69 70 @(cross(Vmtj))begin 71 start = $abstime; 72 end 73 $bound_step(0.05ns); 74 75 if(state==0)begin //初始状态为“0” 76 Ireal = Imtj; 77 Rreal = RP; //MTJ磁化方向为平行态 78 if(Ireal>=0)begin //有电流通过,记录电流脉冲宽度 79 width = $abstime-start; 80 if(Ireal>=IcP)begin //通过的电流大于开关电流,计算翻转时间 81 tau = (C/2+ln(`M_PI*`M_PI*Eps/4)/2)*e*Ms*Vol(1+P*P)/(2*ub*P*(Ireal-IcP)); 82 if(width>=tau)begin //电流脉冲宽度大于翻转时间,则磁化状态翻转,否则不变 83 state = 1; 84 end 85 else state = 0; 86 end 87 else begin //电流小于开关电流,计算保持时间 88 tauNB = tau0*exp(Eps*(1-(Ireal/IcP))); 89 if(width>=tauNB)begin //电流脉冲宽度大于保持时间,则磁化状态翻转,否则不变 90 state = 1; 91 end 92 else state = 0; 93 end 94 end 95 end 96 else begin //初始状态为“1” 97 IrealAP = -Imtj; 98 Rreal = RAP; 99 if(IrealAP>=0)begin 100 width = $abstime-start; 101 if(IrealAP>=IcAP)begin 102 tau = (C/2+ln(`M_PI*`M_PI*Eps/4)/2)*e*Ms*VF(1+P*P)/(ub*P*(IrealAP-IcAP)); 103 if(width>=tau)begin 104 state = 0; 105 end 106 else state = 1; 107 end 108 else begin 109 tauNB = tau0*exp(Eps*(1-(IrealAP/IcAP))); 110 if(width>=tauNB)begin 111 state = 0; 112 end 113 else state = 1; 114 end 115 end 116 end 117 V(Vstate) <+ state; 118 I(p,n) <+ Vmtj/Rreal; 119 end 120 endmodule