Verilog-A Noise Modeling
Introduction¶
Noise modeling plays a crucial role in the simulation and analysis of analog and mixed-signal circuits. As technology advances into deep-submicron regions and higher-frequency operation becomes mainstream, accurate prediction of noise becomes critical to ensure system performance and product reliability. Verilog-A provides powerful built-in constructs for representing noise in compact models, components, and behavioral circuit blocks.
Noise affects nearly all aspects of analog and RF design, including:
- Signal-to-Noise Ratio (SNR)
- Bit-Error Rate (BER)
- Phase noise in oscillators and PLLs
- Gain and linearity in RF amplifiers
- Resolution of ADCs and DACs
- Sensor sensitivity and stability
Accurate noise modeling allows early design optimization and prevents silicon failures that arise from noise-dominated circuits.
Fundamental Noise Types¶
Noise originates from physical processes within semiconductor devices. The most significant types include:
| Noise Type | Physical Source | Frequency Response |
|---|---|---|
| Thermal Noise | Random thermal agitation of carriers | White (flat spectrum) |
| Shot Noise | Quantized charge flow across junctions | White |
| Flicker Noise (1/f) | Carrier trapping & detrapping | ↑ at lower frequencies |
| Burst / Popcorn Noise | Random telegraph signals | Discrete jumps |
| Avalanche Noise | Impact ionization in diodes | Depends on bias |
Verilog-A supports behavioral modeling of all of these phenomena.
Noise Modeling in Verilog-A¶
Verilog-A enables noise contributions using built-in functions. These functions do not affect DC operating point but appear in:
- Noise analysis
- AC analysis
- Transient noise simulations (if enabled)
Built-in Noise Generators¶
| Function | Description |
|---|---|
white_noise(pwr, "label") | Generates white noise with power spectral density |
flicker_noise(pwr, exp, "label") | Models frequency-dependent flicker noise |
noise_table() | Creates noise based on measured data |
The "label" must be unique per noise source for correct attribution in analysis reports.
Adding Noise to Device Models¶
Noise must be associated with a physical current or voltage contribution.
Example — Diode Noise¶
I(d,a) <+ Is * (limexp(V(d,a)/Vt) - 1);
I(d,a) <+ white_noise(2*`P_Q*abs(I(d,a)), "shot_noise");
White noise here corresponds to shot noise in diodes and BJTs:
$$i_n^2 = 2qI$$
Example — Flicker Noise¶
I(d,a) <+ flicker_noise(Kf*abs(I(d,a))**Af, 1.0, "flicker");
Parameters:
Kf— flicker noise coefficientAf— bias exponent
Compact MOSFET Noise Example¶
Advanced models (BSIM, PSP, HiSIM) combine multiple noise mechanisms:
I(d,s) <+ white_noise(gamma*4*`P_K*$temperature*gm, "channel_noise");
I(g,s) <+ white_noise(delta*4*`P_K*$temperature*gds, "gate_noise");
I(d,s) <+ flicker_noise(Kf*(gm**2), 1.0, "flicker_noise");
Captures:
- Channel thermal noise
- Gate-induced noise
- 1/f behavior
Noise in Passive Components¶
Thermal noise in resistors is given by:
`include "constants.vams"
I(p, n) <+ white_noise(4*`P_K*$temperature/R, "R_thermal");
Which models Johnson-Nyquist noise:
$$\overline{i_n^2} = \frac{4kT}{R}$$
Transient Noise Simulation¶
Some simulators allow time-domain random noise enabling:
- Eye-diagrams
- BER prediction
- Clock jitter
- Oscillator phase noise approximation
Example noise injection:
V(out) <+ white_noise(N0, "transient_noise");
Transient noise simulations must be explicitly enabled in most tools.
Table-Driven Noise Modeling¶
When lab characterizations are available:
NoisePSD = noise_table(freq_vector, noise_vector);
I(out) <+ NoisePSD;
Useful in:
- RF front-ends
- MEMS microphones
- CMOS sensors
Tips for Simulation Stability¶
| Problem | Cause | Fix |
|---|---|---|
| Solver divergence | Noise added to floating nodes | Ensure proper DC paths |
| Excess compute time | Too many noise sources | Restrict to dominant mechanisms |
| Incorrect AC/noise results | Noise labeled incorrectly | Use unique labels |
| Abrupt nonlinearities | Discontinuities in equations | Use smooth approximations |
Best practices:
- Keep noise sources physically meaningful
- Use limiting functions like
limexp() - Validate across DC → AC → Noise → Transient
- Ensure charge conservation
Complete Example: Noisy Resistor¶
`include "constants.vams"
`include "disciplines.vams"
module noisy_resistor(p, n);
inout p, n;
electrical p, n;
parameter real R = 1k from (0:inf);
analog begin
V(p,n) <+ R * I(p,n);
I(p,n) <+ white_noise(4*`P_K*$temperature/R, "thermal_noise");
end
endmodule
This model fully supports:
- DC
- AC
- Noise
- Transient (if enabled)
Looking Ahead: Modern Noise Challenges¶
| Technology Trend | Noise Concern |
|---|---|
| FinFET, GAA FET | Stronger flicker noise influence |
| Ultra-low power IoT | Noise limits system sensitivity |
| RF/mmWave CMOS | Gate-induced noise dominates |
| Quantum & cryogenic computing | New low-T noise physics |
Noise modeling is increasingly critical as circuits approach physical and thermal limits.