146 lines
5.0 KiB
Plaintext
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
|
|
|