193 lines
6.9 KiB
Plaintext
193 lines
6.9 KiB
Plaintext
SEE (single event effects) generator
|
|
|
|
The SEE generator generates current pulses, which resemble the
|
|
charge generation and flow causes by a penetrating particle.
|
|
|
|
How to use it:
|
|
Select LET and charge collection depth cdepth, define them as parameters.
|
|
Identify all nodes of a circuit netlist which are pn junctions,
|
|
and thus are sensitive to pulses.
|
|
|
|
Set up the SEEgenerator by adding for example
|
|
|
|
* charge collection depth (in µm)
|
|
.param d = 1
|
|
* LET (linear energy transfer) in MeV*cm²/mg
|
|
.param let = 12
|
|
aseegen1 NULL mon [%id(xcell.n1 m1) %id(xcell.n2 m2) %id(xcell.n1 m1) %id(xcell.n2 m2)] seemod1
|
|
.model seemod1 seegen (tdelay = 11n tperiod=25n let='let' cdepth='d')
|
|
|
|
to the netlist.
|
|
|
|
Each sensitive node from the (flattend) netlist may be added to the output vector of assegen1
|
|
(in brackets [...]), together with its reference node, for example GND for NMOS, nwell potential
|
|
for PMOS. This procedure is currently to be done manually, a semi-automated setup using
|
|
a GUI is in preparation.
|
|
|
|
Instead of NULL, one may give a control signal to aseegen1, to start the pulse sequence.
|
|
'mon' is a monitoring output, showing each pulse as a voltage equivalent to the current.
|
|
|
|
After a transient simulation, plotting the data output versus a non-radiated device
|
|
may reveal the SEE influence.
|
|
|
|
Several examples are gieven in ./src/axamples/xspice/see: inverters, SRAM cell, opamp,
|
|
also as loop with varying LET to detect the threshold.
|
|
|
|
As literature please see for example
|
|
Ygor Quadros de Aguiar, Frédéric Wrobel. Jean-Luc Autran, Rubén García Alía
|
|
Single-Event Effects, from Space to Accelerator Environments
|
|
Springer 2025
|
|
|
|
Detailed description (will be added to the manual):
|
|
|
|
NAME_TABLE:
|
|
|
|
C_Function_Name: cm_seegen
|
|
Spice_Model_Name: seegen
|
|
Description: "single event effect generator"
|
|
|
|
|
|
PORT_TABLE:
|
|
|
|
Port_Name: ctrl mon
|
|
Description: "control input" "monitor"
|
|
Direction: in out
|
|
Default_Type: v v
|
|
Allowed_Types: [v,vd,i,id] [v]
|
|
Vector: no no
|
|
Vector_Bounds: - -
|
|
Null_Allowed: yes yes
|
|
|
|
|
|
PORT_TABLE:
|
|
|
|
Port_Name: out
|
|
Description: "output"
|
|
Direction: out
|
|
Default_Type: i
|
|
Allowed_Types: [i,id]
|
|
Vector: yes
|
|
Vector_Bounds: [1 -]
|
|
Null_Allowed: no
|
|
|
|
|
|
PARAMETER_TABLE:
|
|
|
|
Parameter_Name: tfall trise
|
|
Description: "pulse fall time" "pulse rise time"
|
|
Data_Type: real real
|
|
Default_Value: 500e-12 20e-12
|
|
Limits: - -
|
|
Vector: no no
|
|
Vector_Bounds: - -
|
|
Null_Allowed: yes yes
|
|
|
|
|
|
PARAMETER_TABLE:
|
|
|
|
Parameter_Name: tdelay inull
|
|
Description: "pulse delay" "max current"
|
|
Data_Type: real real
|
|
Default_Value: 0 0
|
|
Limits: - -
|
|
Vector: no no
|
|
Vector_Bounds: - -
|
|
Null_Allowed: yes yes
|
|
|
|
|
|
PARAMETER_TABLE:
|
|
|
|
Parameter_Name: tperiod ctrlthres
|
|
Description: "pulse repetition" "control voltage threshold"
|
|
Data_Type: real real
|
|
Default_Value: 0 0.5
|
|
Limits: - -
|
|
Vector: no no
|
|
Vector_Bounds: - -
|
|
Null_Allowed: yes yes
|
|
|
|
|
|
PARAMETER_TABLE:
|
|
|
|
Parameter_Name: let cdepth
|
|
Description: "lin energy transfer" "charge collection depth"
|
|
Data_Type: real real
|
|
Default_Value: 10 1
|
|
Limits: - -
|
|
Vector: no no
|
|
Vector_Bounds: - -
|
|
Null_Allowed: yes yes
|
|
|
|
|
|
PARAMETER_TABLE:
|
|
|
|
Parameter_Name: angle perlim
|
|
Description: "particle angle" "pulse repetition"
|
|
Data_Type: real boolean
|
|
Default_Value: 0 TRUE
|
|
Limits: [0 1.57079] -
|
|
Vector: no no
|
|
Vector_Bounds: - -
|
|
Null_Allowed: yes yes
|
|
|
|
STATIC_VAR_TABLE:
|
|
|
|
Static_Var_Name: last_t_value
|
|
Data_Type: pointer
|
|
Vector: no
|
|
Description: "next pulse start time"
|
|
|
|
STATIC_VAR_TABLE:
|
|
|
|
Static_Var_Name: pulse_number
|
|
Data_Type: pointer
|
|
Vector: no
|
|
Description: "number of pulse"
|
|
|
|
STATIC_VAR_TABLE:
|
|
|
|
Static_Var_Name: last_ctrl
|
|
Data_Type: pointer
|
|
Vector: no
|
|
Description: "last control value"
|
|
|
|
Description
|
|
This code model generates "double exponentially" formed current pulses according to
|
|
|
|
i(t) = inull * (exp(-(t-tdelay)/tfall) - (exp(-(t-tdelay)/trise) for t > tdelay
|
|
i(t) = 0 for t < tdelay
|
|
|
|
with inull given as parameter input or (if not given), calculated as
|
|
inull = 1.035e-14 * let/cos(angle) * cdepth / (tfall - trise)
|
|
with data for silicon, cdepth in µm, let in MeV*cm²/mg, angle in radians.
|
|
|
|
Minimum is one pulse output (a node pair, or a single node with the other grounded).
|
|
Several output node pairs may be defined per code model instance. Parameter tperiod
|
|
may then be used to create pulses in sequence. Per default only one sequence is running,
|
|
with one pulse for each node.
|
|
Parameter perlim, set to FALSE, allows running and repeating the sequence until
|
|
the end of the simulation. The first pulse is issued in the first
|
|
node pair of the node list in the vector [], the second (after time tperiod has elapsed),
|
|
is injected by the second node (pair) of the list and so on. When the sequence is repeated,
|
|
again the output starts pulsing at port (node pair) number 1.
|
|
|
|
The control input ctrl (voltage or current) may be used
|
|
to start or repeat the whole sequence, depending on the circuit status. A rising voltage
|
|
at ctrl, when crossing the threshold given by ctrlthres, will initiate the sequence (including
|
|
tdelay and tperiod). If set to NULL, the pulse (sequence) will start immediately after tdelay.
|
|
|
|
'mon' is a monitoring output, showing each pulse as a voltage equivalent to the current. It
|
|
may be used just for plotting, or for re-triggering an action.
|
|
|
|
This model will work in transient analysis.
|
|
|
|
Example ngspice usage (with control)
|
|
|
|
aseegen1 ctrl mon [%id(n1 m1) %id(n2 m2) %id(n1 m1) %id(n2 m2)] seemod1
|
|
.model seemod1 seegen (tdelay = 8n tperiod=25n)
|
|
|
|
Example ngspice usage (without control, ctrl replaced by NULL, parameters as offered by default)
|
|
|
|
aseegen2 NULL mon [%id(n1 m1) %id(n5 n6) %id(n6 n7) %i(isingle) ] seemod2
|
|
.model seemod2 seegen (tdelay = 0 tperiod=0 ctrlthres=0.5 inull=0 tfall=500p trise=20p perlim=FALSE)
|