STT-MTJ(自旋转移矩磁隧道结)模型的Verilog-A语言描述(仅参考)

模型的相关理论原理这里不作描述,直接上代码:

  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
原文地址:https://www.cnblogs.com/vilicute/p/12786163.html