MOS-AK/ESSDERC/ESSCIRC Workshop (Montreux 2006)
Verilog-A:
An Introduction
for Compact Modelers
Geoffrey Coram
Outline
The
Problem
Modeling Languages
Diode Example
Guidelines
Admonishments
Compiler Optimizations
Conclusion
References (and Further Examples)
2
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Many models, many simulators
VBIC
ACM
USIM
BSIM
HiCUM
Mextram
PSP
HiSIM
HVEKV
MM20
Eldo
ADS
Spectre
Smash
HSIM
APLAC Nanosim
HSPICE
Golden
Gate
AMS
from McAndrew, BMAS 2003
3
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
The Solution
VBIC
HiCUM
Mextram
PSP
HiSIM
HVEKV
MM20
Modeling Interface
USIM
BSIM
Eldo
ACM
ADS
Spectre
Smash
HSIM
APLAC Nanosim
HSPICE
Golden
Gate
AMS
from McAndrew, BMAS 2003
4
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Modeling Languages
Programming
languages:
FORTRAN
(SPICE2)
C (SPICE3)
+ Fast, direct access to simulator
– Must compute derivatives
– No standard interface
– Intimate knowledge of simulator required
MATLAB
+ Excellent for data fitting
– Does not run directly in any analog simulator
5
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Behavioral Modeling Languages
VHDL-AMS
First
analog behavioral modeling language
working group (IEEE 1076.1)
Painfully slow to come to fruition …
Europe prefers VHDL (for digital)
Runs in:
AMS Designer (Cadence), DiscoveryAMS (Synopsys),
ADVance MS (Mentor), Smash (Dolphin), …
– only AMS simulators!

– No clear definition of “VHDL-A”
(except by R. Shi’s MCAST model compiler)
6
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Behavioral Modeling Languages
Verilog-A
Verilog-AMS
 Pushed
by Cadence, came to market earlier
 Verilog-A from Open Verilog International became part
of Accellera Verilog-AMS
 IEEE 1800 authorized to develop SystemVerilog-AMS
 Verilog-AMS runs in the same AMS simulators as
VHDL-AMS
+ Verilog-A runs in Spectre, HSpice, ADS, Eldo…
and internal simulators of semiconductor companies
+ Clear definition of “A”
+ Verilog-AMS LRM 2.2 was driven by the requirements
for compact modeling
7
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
V-AMS LRM 2.2 Additions
Highlights
output
for compact modeling:
/ operating point “parameters”
vdsat, id_chan
also gm, cgs using new ddx() operator

$simparam
to access simulator quantities
(gmin)
$param_given
paramsets
– replace and extend Spice .model
cards
8
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
VHDL-AMS Diode
-- Modified from http://www.syssim.ecs.soton.ac.uk/vhdl-ams/examples/smpr.htm
library IEEE;
use IEEE.math_real.all;
use IEEE.electrical_systems.all;
use IEEE.FUNDAMENTAL_CONSTANTS.all;
entity diode is
generic (Isat: current := 1.0e-14); -- Saturation current [Amps]
port (terminal p, n : electrical);
end entity diode;
architecture ideal of diode is
quantity v across i through p to n;
constant TempC : real := 27.0; -- Ambient Temperature [Degrees]
constant vt : real := PHYS_K*(273.15 + TempC )/PHYS_Q; -- Thermal Voltage
begin
i == Isat*(limit_exp(v/vt) - 1.0);
end architecture ideal;
9
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
VHDL-AMS Diode
-- Modified from http://www.syssim.ecs.soton.ac.uk/vhdl-ams/examples/smpr.htm
library IEEE;
use IEEE.math_real.all;
use IEEE.electrical_systems.all;
use IEEE.FUNDAMENTAL_CONSTANTS.all;
is is a keyword!
entity diode is
generic (Isat: current := 1.0e-14); -- Saturation current [Amps]
port (terminal p, n : electrical);
end entity diode;
TempC is a constant!
architecture ideal of diode is
quantity v across i through p to n;
constant TempC : real := 27.0; -- Ambient Temperature [Degrees]
constant vt : real := PHYS_K*(273.15 + TempC )/PHYS_Q; -- Thermal Voltage
begin
i == Isat*(limit_exp(v/vt) - 1.0);
end architecture ideal;
10
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Verilog-A Diode
`include "disciplines.vams"
module diode(a,c);
inout a,c; electrical a,c;
parameter real is = 10p from (0:inf);
real id;
(*desc = "conductance "*) real gd;
analog begin
id = is * (limexp(V(a,c) / $vt) – 1.0);
gd = ddx(id, V(a));
I(a,c) <+ id + V(a,c)*$simparam("gmin", 1e-12);
end
endmodule
11
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Verilog-A Diode
`include "disciplines.vams"
module diode(a,c);
inout a,c; electrical a,c;
parameter real is = 10p from (0:inf);
real id;
(*desc = "conductance "*) real gd;
analog begin
id = is * (limexp(V(a,c) / $vt) – 1.0);
gd = ddx(id, V(a));
I(a,c) <+ id + V(a,c)*$simparam("gmin", 1e-12);
end
thermal voltage – uses
endmodule
simulation temperature
12
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Verilog-A Diode
`include "disciplines.vams" disciplines define
through and across
module diode(a,c);
inout a,c; electrical a,c; variables
parameter real is = 10p from (0:inf);
real id;
(*desc = "conductance "*) real gd;
analog begin
id = is * (limexp(V(a,c) / $vt) – 1.0);
gd = ddx(id, V(a));
I(a,c) <+ id + V(a,c)*$simparam("gmin", 1e-12);
end
endmodule
13
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Verilog-A Diode
`include "disciplines.vams"
modules
module diode(a,c);
combine entity
inout a,c; electrical a,c;
and architecture;
parameter real is = 10p from (0:inf);
real id;
replace Spice
(*desc = "conductance "*) real gd;
primitives
analog begin
id = is * (limexp(V(a,c) / $vt) – 1.0);
gd = ddx(id, V(a));
I(a,c) <+ id + V(a,c)*$simparam("gmin", 1e-12);
end
endmodule
14
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Verilog-A Diode
`include "disciplines.vams"
parameters have
module diode(a,c);
ranges (and defaults)
inout a,c; electrical a,c;
parameter real is = 10p from (0:inf);
real id;
(*desc = "conductance "*) real gd;
analog begin
id = is * (limexp(V(a,c) / $vt) – 1.0);
gd = ddx(id, V(a));
I(a,c) <+ id + V(a,c)*$simparam("gmin", 1e-12);
end
endmodule
15
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Verilog-A Diode
`include "disciplines.vams"
module diode(a,c);
inout a,c; electrical a,c;
parameter real is = 10p from (0:inf);
real id;
(*desc = "conductance "*) real gd;
analog begin
id = is * (limexp(V(a,c) / $vt) – 1.0);
gd = ddx(id, V(a));
I(a,c) <+ id + V(a,c)*$simparam("gmin", 1e-12);
end
built-in function with
endmodule
improved convergence
16
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Verilog-A Jump Start
Looks
much like C
Intuitive
and easy to read and learn
Start with an existing model and modify
Based
on through and across variables
Set
up is for KCL and KVL
Understand the “contribution” operator
I(di,si) <+ Ids;
// current di to si
V(d ,di) <+ I(b_rd)*rd; // voltage d to di
Dynamic
flows are done via ddt()
I(t,b) <+ ddt(C * V(t,b));
17
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Best Practices
Models
formulated in currents I(V) and
charges Q(V)
most
natural for modified nodal analysis (MNA)
Q(V) not C(V) to ensure conservation of charge

ddt(Q(V)) != ddt(C(V) * V) != C(V) * ddt(V)
No
access to previous timesteps
watch
non-quasi-static formulations
allows model to run in RF simulator
Noises
as current sources
No discontinuities
18
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Discontinuities
Spice
requires continuous derivatives
Consider this code:
if (vbs == 0.0) begin
qbs = 0.0;
capbs = czbs+czbssw+czbsswg;
end else if (vbs < 0.0) begin
qbs = …
…
I(b,s) <+ ddt(qbs);
19
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Discontinuities
Resulting
C code:
Automatic derivative
if (vbs == 0.0) {
differs from
intended value
qbs = 0.0;
dqbs_dvbs = 0.0;
//capbs=czbs+czbssw+czbsswg;
} else if (vbs < 0.0) {
qbs = …
…
20
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Discontinuities
HiSIM2
4
3.5
3
x1e-3
Verilog-A
(beta code)
Clipping in C code
may affect values
and derivatives
differently
HiSIM Verilog-A (beta code)
ac drain current (real part)
hisim ir(m1,d)
2.5
2
1.5
1
.5
0
-80
-40
0
40
80
vd, x1e-3
120
160
if ( Vds <= `epsm10 ) begin
Pds = 0.0 ;
Psl = Ps0 ;
21
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
200
Compiler Optimizations
Common
subexpressions
id = is * (exp(vd/vtm) – 1.0);
gd = is/vtm * exp(vd/vtm);
Eliminating
internal nodes
if (rs == 0.0)
V(b_res) <+ 0.0;
else
I(b_res) <+ V(b_res) / rs;
Dependency
replace
22
trees
analysis() and initial_step
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
analysis()
Consider
this code:
if (analysis("tran")) begin
qd = …
…
No
capacitance in:
small-signal
ac analysis,
harmonic balance, envelope following
Pseudo-transient homotopy
23
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
analysis()
Consider
this code:
if (analysis("noise")) begin
flicker =
strongInversionNoiseEval(vds,
temp);
…
But
what about PNOISE, HBNoise, …?
Compiler/Simulator
24
MUST do this optimization
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Events
Consider
this code:
@(initial_step) begin
isdrain = jsat * ad;
What
happens for a dc sweep?
don’t
want re-computing for bias sweep
need re-computing for temperature sweep
for transient, initial_step
is true for every iteration at time=0
Even
Compiler/Simulator
25
MUST do this optimization
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
ADMS “Magic” Names
ADMS
uses special block names to
identify sections of code
Eg
PSP Verilog-A:
begin : initializeModel
NSUB0_i = `CLIP_LOW(NSUB0,1e20);
//…
Doesn’t
26
hurt for other compilers …
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Software Practices
Use
consistent indentation
Align code vertically on =
Use meaningful names
use
maximum size (8) to help vertical alignment
Include
comments: brief description,
reference documentation
Physical constants are not dated and
could change
model
results would then change
define physical constants for a model
27
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
PSP Model Code
// 4.2.4 Surface potential at source side
Gf2
= Gn2 * f_s;
inv_Gf2
= 1.0 / Gf2;
Gf
= sqrt(Gf2);
xi
= 1.0 + Gf * `invSqrt2;
inv_xi
= 1.0 / xi;
Ux
= Vsbstar * inv_phit1;
xn_s
= phib * inv_phit1 + Ux;
if (xn_s < `se)
delta_ns
= exp(-xn_s) * inv_f;
else
delta_ns
= `ke * inv_f / `P3(xn_s - `se);
margin
= 1e-5 * xi;
`sp_s(x_s, xg, xn_s, delta_ns)
28
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
PSP Model Code
// 4.2.4 Surface potential at source side
Gf2
= Gn2 * f_s;
inv_Gf2
= 1.0 / Gf2; equation number from
Gf
= sqrt(Gf2); documentation
xi
= 1.0 + Gf *
and explanation
inv_xi
= 1.0 / xi;
Ux
= Vsbstar * inv_phit1;
xn_s
= phib * inv_phit1 + Ux;
if (xn_s < `se)
delta_ns
= exp(-xn_s) * inv_f;
else
delta_ns
= `ke * inv_f / `P3(xn_s - `se);
margin
= 1e-5 * xi;
`sp_s(x_s, xg, xn_s, delta_ns)
29
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
PSP Model Code
// 4.2.4 Surface potential at source side
Gf2
= Gn2 * f_s;
alignment for
inv_Gf2
= 1.0 / Gf2;
readability
Gf
= sqrt(Gf2);
xi
= 1.0 + Gf * `invSqrt2;
inv_xi
= 1.0 / xi;
Ux
= Vsbstar * inv_phit1;
xn_s
= phib * inv_phit1 + Ux;
if (xn_s < `se)
delta_ns
= exp(-xn_s) * inv_f;
else
delta_ns
= `ke * inv_f / `P3(xn_s - `se);
margin
= 1e-5 * xi;
`sp_s(x_s, xg, xn_s, delta_ns)
30
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
PSP Model Code
// 4.2.4 Surface potential at source side
Gf2
= Gn2 * f_s;
inv_Gf2
= 1.0 / Gf2;
Gf
= sqrt(Gf2);
xi
= 1.0 + Gf * `invSqrt2;
inv_xi
= 1.0 / xi;
Ux
= Vsbstar * inv_phit1;
indentation
xn_s
= phib * inv_phit1 + Ux;
if (xn_s < `se)
of blocks
delta_ns
= exp(-xn_s) * inv_f;
else
delta_ns
= `ke * inv_f / `P3(xn_s - `se);
margin
= 1e-5 * xi;
`sp_s(x_s, xg, xn_s, delta_ns)
31
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Other Model Code
//----Self Heating Effect
//(implemented only on mobility)-----PD = (VDE-VS)*Id;
no reference to
if (SH_switch ==1) begin
documentation
I(TH) <+ PD;
RTHNOM = RTHNOM_298K*(1+alpha_SHE*(Tempp-TNOMK));
RTH = RTHNOM*(1+alpha_SHE*(Tempp+V(TH)-TNOMK));
I(TH) <+ - V(TH)/(RTH);
I(TH) <+ - ddt(CTH*V(TH));
end
else begin
inconsistent
I(TH) <+ 0;
end
indentation
Tratio_SH=(Tempp+V(TH)*SH_switch)/TNOMK;
BEX=BEX0/pow( abs(VG-VS) +1e-1,par_SHE);
KP_T=KP0*pow(Tratio_SH,BEX);
32
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Other Model Code
//----Self Heating Effect
//(implemented only on mobility)-----PD = (VDE-VS)*Id;
if (SH_switch ==1) begin
I(TH) <+ PD;
RTHNOM = RTHNOM_298K*(1+alpha_SHE*(Tempp-TNOMK));
RTH
= RTHNOM*(1+alpha_SHE*(Tempp+V(TH)-TNOMK));
I(TH) <+ - V(TH)/(RTH);
I(TH) <+ - ddt(CTH*V(TH));
end else begin
I(TH) <+ 0;
end
correct
indentation
Tratio_SH=(Tempp+V(TH)*SH_switch)/TNOMK;
BEX=BEX0/pow( abs(VG-VS) +1e-1,par_SHE);
KP_T=KP0*pow(Tratio_SH,BEX);
33
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Other Model Code
// new model for mobility reduction,
//linked to the charges model
// !! mb 98/10/11 (r10) introduced fabs(Eeff)
(jpm) //
cryptic comments – where is Eeff??
if ((qb + eta_qi*qi) > 0.0) begin
E0_Q_1 = 1.0 + T0*(qb + eta_qi*qi); end
else begin
E0_Q_1 = 1.0 - T0*(qb + eta_qi*qi); end
T0_GAMMA_1 = 1.0 + T0*GAMMA_sqrt_PHI;
// !! mb 97/06/02 ekv v2.6
beta = KP_Weff * T0_GAMMA_1 / (Leq * E0_Q_1+1e-60);
// !! mb 97/07/18
34
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Coding Style
Verilog-A
can be very readable
Characterization
engineers and
simulator people will read it
Make
35
a good impression!
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Conclusion
Verilog-A
is a powerful and easy-to-use
compact modeling language
Writing
a good compact model still
requires care and rigor
Many
36
examples now available
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
References
Designer’s
Guide
http://www.designers-guide.org/
Forum
Verilog-A model library (VBIC, MOS11, JFET, etc.)
MCAST
(Prof. CJ Richard Shi)
http://www.ee.washington.edu/research/
mscad/shi/mcast.html
Automatic compiler beats hand-coded C
37
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Examples
Verilog-A
model library at
http://www.designers-guide.org/VerilogAMS/

VBIC, MOS11, JFET, etc.
 Silvaco
“public domain” models (non-commercial use)
https://src.silvaco.com/ResourceCenter/en/
downloads/verilogA.jsp
 BSIM3,
BSIM4, BJT, etc.
 But: watch out for @(initial_step)!
PSP
http://pspmodel.asu.edu/
Mextram
http://hitec.ewi.tudelft.nl/mug/
HiCUM
http://www.iee.et.tu-dresden.de/iee/
eb/hic_new/hic_intro.html
38
Coram: Verilog-A Introduction for Compact Modelers (MOS-AK Montreux 2006)
Descargar

verilog-a compact modeling - MOS