Files

146 lines
5.0 KiB
Plaintext

/*
Copyright 2002-2005 Tiburon Design Automation, Inc. All rights reserved.
This software has been provided pursuant to a License Agreement
containing restrictions on its use. This software contains
valuable trade secrets and proprietary information of
Tiburon Design Automation, Inc. and is protected by law. It may
not be copied or distributed in any form or medium, disclosed
to third parties, reverse engineered or used in any manner not
provided for in said License Agreement except with the prior
written authorization from Tiburon Design Automation, Inc.
Verilog-A definition of diode
Note that GMIN is not picked up from Options card
$RCSfile: diode.va,v $ $Revision: 1.8 $ $Date: 2012/07/09 19:37:45 $
*/
`include "constants.vams"
`include "disciplines.vams"
`define SPICE_GMIN 1.0e-12
`define LARGE_REAL 1.0e99
`define DEFAULT_TNOM 27
`define MAX_EXPL 2.688117142e+43
`define MIN_EXPL 3.720075976e-44
`define EXPL_THRESHOLD 100.0
`define DEXP(A,B) \
if (A > `EXPL_THRESHOLD) begin \
B = `MAX_EXPL*(1.0+(A)-`EXPL_THRESHOLD); \
end else if (A < -`EXPL_THRESHOLD) begin \
B = `MIN_EXPL; \
end else begin \
B = exp(A); \
end
module va_diode(anode,cathode);
// %%DEVICE_CLASS=DIODE%%
inout anode, cathode;
electrical anode, cathode, internal;
parameter real Area = 1.0 from (0:inf]; //Area scaling factor
parameter real Is = 1e-14 from [0:inf]; //Saturation current [A]
parameter real Tnom = `DEFAULT_TNOM from (-`P_CELSIUS0:inf); //Measurement temperature [C]
parameter real Rs = 0.0 from [0:inf]; //Ohmic res [Ohm]
parameter real N = 1.0 from [0:inf]; //Emission coef
parameter real Tt = 0.0 from [0:inf]; //Transit time [s]
parameter real Cjo = 0.0 from [0:inf]; //Junction capacitance [F]
parameter real Vj = 1.0 exclude 0; //Junction potential [v]
parameter real M = 0.5 from [0:inf]; //Grading coef
parameter real Eg = 1.11 from (0:inf]; //Activation energy [eV]
parameter real Xti = 3.0 from [0:inf]; //IS temp exp.
parameter real Kf = 0.0; //Flicker noise coef
parameter real Af = 1.0 from (0:inf); //Flicker noise exponent
parameter real Fc = 0.5 from [0:1]; //Forward bias junct parm
parameter real Bv = `LARGE_REAL from [0:inf]; //Reverse breakdown voltage [v]
parameter real Ibv = 0.001 from [0:inf]; //Current at BV [A]
real Vd, Id, Qd;
real f1, f2, f3, Fcp;
real Ibv_calc, Vth;
real Is_temp, Vth_nom, T_nom, T;
real exponent;
analog begin
Vth = $vt;
T = $temperature;
f1 = (Vj/(1 - M))*(1 - pow((1 - Fc), 1 - M));
f2 = pow((1 - Fc), (1 + M));
f3 = 1 - Fc * (1 + M);
Fcp = Fc * Vj;
if (Ibv !=0)
Ibv_calc = Ibv;
else
Ibv_calc = Is * Bv / Vth;
Vd = V(anode, internal);
// Temperature dependence
T_nom = Tnom + `P_CELSIUS0;
Vth_nom = $vt(T_nom);
`DEXP((Eg / Vth_nom - Eg / Vth),exponent);
Is_temp = Is * pow(T/T_nom, Xti / N) * exponent;
// Intrinsic diode
// BV is not adjusted to match Ibv if I(BV) <> Ibv
if (Vd < 0) begin
if (Vd < -Bv) // Past breakdown
begin
`DEXP(-(Bv + Vd) / Vth,exponent);
Id = -Area * Is_temp * (exponent + Bv / Vth);
end
else if (Vd == -Bv) // At breakdown
Id = -Area * Ibv_calc;
else if (Vd <= -5 * N * Vth) // -Bv < Vd < -5 nKT/q
Id = -Area * Is_temp + Vd * `SPICE_GMIN;
else // -5 nKT/q <= Vd < 0
begin
`DEXP(Vd / Vth,exponent);
Id = Area * Is_temp * (exponent - 1) + Vd * `SPICE_GMIN;
end
end
else // Fwd bias:
begin
`DEXP(Vd / (N*Vth),exponent);
Id = Area * Is_temp * (exponent - 1) +
Vd * `SPICE_GMIN;
end
// Capacitance (junction and diffusion)
if (Vd <= Fcp)
Qd = Tt * Id + Area * Cjo * Vj
* (1 - pow((1 - Vd / Vj), (1 - M)))/(1 - M);
else
Qd = Tt * Id + Area * Cjo
* (f1 + (1 / f2) * (f3 * (Vd - Fcp) + (0.5 * M / Vj)
* (Vd * Vd - Fcp * Fcp)));
I(anode, internal) <+ Id;
I(anode, internal) <+ ddt(Qd);
if (Rs > 0.0) begin
I(internal, cathode) <+ V(internal, cathode) / (Rs / Area);
I(internal, cathode) <+ white_noise(4 * `P_K * T / (Rs / Area),
"Rs");
end
else
V(internal, cathode) <+ 0.0;
I(anode, internal) <+ white_noise(2 * `P_Q * abs(Id), "shot");
I(anode, internal) <+ flicker_noise(Kf * pow(abs(Id), Af), 1.0, "flicker");
end
endmodule