Skip to main content

β: This English translation is in beta — the Traditional-Chinese original is the authoritative version.

DJ and the Dual-Dirac Model: The Industry-Standard Tool for TJ@BER

Prerequisites: serdes_clocking_connection (first appearance of RJ/DJ/TJ, eye and BER), lab_12 (RJ-only bathtub), lab_08 (σt\sigma_t integrated from phase noise) | Next: exercises, lab_13

serdes_clocking_connection already gave the shorthand "TJ == DJ +2Q+\,2Q\cdotRJ". This page builds that formula rigorously from scratch: what RJ is, what DJ is, which integral QQ comes from, how the bathtub curve is derived from the CDF (cumulative distribution function) of jitter, and the dual-Dirac model the industry actually uses (SerDes specs from Fibre Channel MJSQ onward) — including its most misunderstood and most important honesty note: the model parameter DJδδ\mathrm{DJ}_{\delta\delta} is inherently less than or equal to the actual peak-to-peak DJ, and this "under-report" is deliberate — it is precisely what makes the TJ extrapolation accurate.

Physical intuition (conclusion first): jitter has two fundamentally different components. RJ (random jitter) is the time-domain incarnation of oscillator phase noise — Gaussian, unbounded; the longer you wait (the tighter the BER target), the larger it "grows", so it must be booked as σ\sigma times a multiplier that increases with the BER target. DJ (deterministic jitter) is driven by deterministic physical mechanisms (inter-symbol interference, duty-cycle distortion, supply ripple); its amplitude has a physical upper bound, so it is booked peak-to-peak and does not grow with BER. The dual-Dirac model compresses "bounded DJ of arbitrary shape" into two Diracs and keeps RJ as a Gaussian, in exchange for a straight line that can be extrapolated to 101210^{-12}. Measuring a BER of 101210^{-12} requires waiting for 101210^{12} bits — even at 10 Gb/s that is 100 s just to "see one error on average", and statistical confidence takes hours; extrapolation is not laziness, it is an engineering necessity.

Step 1: RJ — unbounded Gaussian, all the way from phase noise (this site's chain)

RJ is the endpoint of the chain built over this site's first six chapters; a step-by-step recap (each step has its own page):

  1. Device white noise → 1/f² phase noise: [P1] Eq.(21), p.185 gives L{Δω}=10log10 ⁣(Γrms2qmax2in2/Δf4Δω2)\mathcal{L}\{\Delta\omega\}=10\log_{10}\!\big(\tfrac{\Gamma_{rms}^2}{q_{max}^2}\cdot\tfrac{\overline{i_n^2}/\Delta f}{4\Delta\omega^2}\big) (Γrms\Gamma_{rms} dimensionless, qmaxq_{max} in C, in2/Δf\overline{i_n^2}/\Delta f in A²/Hz). See white_noise_to_phase_noise.
  2. Phase-noise integration → rms jitter: σt=12πf0f1f2Sϕ(f)df\sigma_t=\frac{1}{2\pi f_0}\sqrt{\int_{f_1}^{f_2}S_\phi(f)\,df} (unit: s; canonical example C: f0=5f_0=5 GHz, L(1MHz)=100\mathcal{L}(1\text{MHz})=-100 dBc/Hz, 1/f², integrate 1→100 MHz → σt=447.9\sigma_t=447.9 fs). See lab_08.
  3. Time-domain view — random walk: [P2] Eq.(8), p.792 gives the accumulated phase jitter σΔϕ=κΔt\sigma_{\Delta\phi}=\kappa\sqrt{\Delta t} (κ\kappa in 1/s1/\sqrt{\text{s}}, from [P2] Eq.(11)/(12), p.793 κ=Γrmsqmax12in2/Δf\kappa=\tfrac{\Gamma_{rms}}{q_{max}}\sqrt{\tfrac12\overline{i_n^2}/\Delta f}; note the expression contains no ω0\omega_0 — converting to the time version requires dividing by ω0\omega_0 once more).
  4. Why Gaussian: every period the oscillator absorbs a large number of mutually independent tiny noise kicks; the total phase error is a sum of independent increments → central limit theorem → Gaussian. lab_11 verified directly by Monte Carlo that the histogram is Gaussian and σΔN\sigma\propto\sqrt{\Delta N}.

RJ's key property: no upper bound. The Gaussian tail is never zero — there is no "guaranteed never to cross" margin; you can only ask "how small is the crossing probability". This is why RJ must be booked as σ\sigma paired with a target BER (the QQ function of Step 3).

Step 2: DJ — bounded, driven by deterministic mechanisms

DJ is the half that ISF theory "cannot see" (it does not come from the oscillator's random noise), yet it is often the largest component of the TJ measured in a SerDes. Three main sources, each with clear physics and a clear upper bound:

DJ typePhysical mechanismPDF shapeWhy bounded
ISI (inter-symbol interference)Finite channel bandwidth with memory: edge position depends on the preceding bit patternMultiple discrete spikes (one per pattern)Channel impulse response has finite length
DCD (duty-cycle distortion)Rise/fall asymmetry, threshold offset: rising edges systematically early, falling edges lateExactly two DiracsThe asymmetry is a fixed amount
PJ/SJ (periodic/sinusoidal jitter; supply spurs, crosstalk)Supply ripple modulates the VCO via supply pushing (see varactor_tuning_supply_pushing); coupling from adjacent clocksarcsine (double-horn) distributionSinusoid amplitude is fixed

Note that DCD's PDF is inherently two Diracs — the dual-Dirac model is exact for it; the model's name and shape come precisely from this "worst-case shape".

PDF of sinusoidal DJ (the arcsine distribution), derived step by step. This is the DJ used in lab_31 and the standard model for supply spurs. Let the edge's time offset be x=Asinθx=A\sin\theta, with AA the amplitude (unit: s); the spur is asynchronous with the data, so the sampled phase θ\theta is uniform on [0,2π)[0,2\pi), pΘ(θ)=12πp_\Theta(\theta)=\tfrac{1}{2\pi} (unit: 1/rad). Change of variables: within one period each x(A,A)x\in(-A,A) corresponds to two θ\theta branches, each contributing pΘ/dx/dθp_\Theta/\vert dx/d\theta\vert, and dx/dθ=Acosθ=A2x2\vert dx/d\theta\vert=A\vert\cos\theta\vert=\sqrt{A^2-x^2}:

pDJ(x)=212π1A2x2=1πA2x2,x<Ap_{DJ}(x)=2\cdot\frac{1}{2\pi}\cdot\frac{1}{\sqrt{A^2-x^2}}=\frac{1}{\pi\sqrt{A^2-x^2}},\qquad \vert x\vert\lt A
  • Units: 1/[s2]=1/[s]1/\sqrt{[\text{s}^2]}=1/[\text{s}] ✓ (the PDF integrated over xx is dimensionless).
  • Normalization check: AAdxπA2x2=1π[arcsinxA]AA=1π(π2+π2)=1\int_{-A}^{A}\frac{dx}{\pi\sqrt{A^2-x^2}}=\frac{1}{\pi}\big[\arcsin\tfrac{x}{A}\big]_{-A}^{A}=\frac{1}{\pi}\big(\tfrac{\pi}{2}+\tfrac{\pi}{2}\big)=1 ✓.
  • Physics: the sinusoid dwells longest near its turning points → the probability density diverges at the two ends ±A\pm A (an integrable "double horn"). Both horns are clearly visible in the histogram of lab_31 panel (a).
  • Bounded: DJpp=2A\mathrm{DJ}_{pp}=2A (peak-to-peak, unit: s). Applicability: the spur is asynchronous with the data (uniform phase); if the spur is locked to the data (synchronous), the PDF degenerates into discrete spikes — still bounded.

Step 3: The QQ function — Gaussian tail integral, and where Q1(1012)=7.03Q^{-1}(10^{-12})=7.03 comes from

RJ's bookkeeping tool is the Gaussian tail probability. For a standard normal XN(0,1)X\sim\mathcal{N}(0,1) (dimensionless):

Q(x)P(X>x)=x12πeu2/2duQ(x)\equiv P(X\gt x)=\int_x^{\infty}\frac{1}{\sqrt{2\pi}}\,e^{-u^2/2}\,du

Step-by-step reduction to erfc (this is what connects it to scipy and this site's serdes_utils.Q). Substitute u=2su=\sqrt2\,s, du=2dsdu=\sqrt2\,ds; the lower limit becomes x/2x/\sqrt2:

Q(x)=22πx/2es2ds=1πx/2es2ds=12erfc ⁣(x2)Q(x)=\frac{\sqrt2}{\sqrt{2\pi}}\int_{x/\sqrt2}^{\infty}e^{-s^2}\,ds=\frac{1}{\sqrt\pi}\int_{x/\sqrt2}^{\infty}e^{-s^2}\,ds=\frac12\,\mathrm{erfc}\!\Big(\frac{x}{\sqrt2}\Big)

The last step used the definition erfc(z)=2πzes2ds\mathrm{erfc}(z)=\tfrac{2}{\sqrt\pi}\int_z^\infty e^{-s^2}ds. For a general Gaussian (mean μ\mu, standard deviation σ\sigma, both in s), substitute once more with u=(vμ)/σu=(v-\mu)/\sigma to get P(V>v)=Q ⁣(vμσ)P(V\gt v)=Q\!\big(\tfrac{v-\mu}{\sigma}\big)the argument of QQ is always "how many σ\sigma from the mean", dimensionless ✓.

Deep-tail asymptotic form (one integration by parts):

Q(x)ex2/2x2π(x1, relative error 1/x2)Q(x)\approx\frac{e^{-x^2/2}}{x\sqrt{2\pi}}\quad(x\gg1,\ \text{relative error}\ \sim 1/x^2)

Use it to estimate Q(7.03)Q(7.03) by hand: exponent 7.0342/2=24.77.034^2/2=24.7, e24.71.8×1011e^{-24.7}\approx1.8\times10^{-11}, divide by 7.03×2.50717.67.03\times2.507\approx17.61.0×1012\approx1.0\times10^{-12} ✓. This is the "BER 101210^{-12}7.03σ7.03\sigma" correspondence used throughout this site's jitter chapters (consistent with the QQ table in 06 exercises):

Target BERQ1(BER)Q^{-1}(\text{BER})RJ peak-to-peak =2Q1σ=2Q^{-1}\sigma
10910^{-9}5.9985.99812.0σ12.0\,\sigma
101210^{-12}7.0347.034 (written 7.03 on this site)14.07σ14.07\,\sigma
101510^{-15}7.9417.941 (written 7.94 on this site)15.88σ15.88\,\sigma

One-line Python verification (using this site's real API; Q1Q^{-1} inverts the tail integral above via erfcinv):

import numpy as np
from scipy.special import erfcinv
from simulations.common.serdes_utils import Q
q = np.sqrt(2) * erfcinv(2 * 1e-12) # inverse of Q (inverting the tail integral)
print("Qinv(1e-12) =", round(float(q), 3)) # -> 7.034
print("Q(7.034) =", float(Q(7.034))) # -> 1.0e-12

Step 4: The dual-Dirac model — definition and PDF

The model does two things (external literature, not among the five source PDFs; methodology references at the bottom of the page):

  1. The TJ PDF is the convolution of the DJ PDF with the Gaussian RJ (RJ and DJ statistically independent): pTJ=pDJgσp_{TJ}=p_{DJ}*g_\sigma, where gσ(x)=1σ2πex2/2σ2g_\sigma(x)=\tfrac{1}{\sigma\sqrt{2\pi}}e^{-x^2/2\sigma^2} (unit: 1/s).
  2. Compress the bounded pDJp_{DJ} of arbitrary shape into two equal-weight Diracs, with spacing denoted DJδδ\mathrm{DJ}_{\delta\delta}:
pDJ(x)  12δ(xμR)+12δ(xμL),DJδδμRμLp_{DJ}(x)\ \longrightarrow\ \frac12\,\delta(x-\mu_R)+\frac12\,\delta(x-\mu_L),\qquad \mathrm{DJ}_{\delta\delta}\equiv\mu_R-\mu_L

The convolution uses the Dirac sampling property δ(vμ)gσ(xv)dv=gσ(xμ)\int\delta(v-\mu)g_\sigma(x-v)dv=g_\sigma(x-\mu), giving the model PDF in one step:

pδδ(x)=12gσ(xμR)+12gσ(xμL)p_{\delta\delta}(x)=\frac12\,g_\sigma(x-\mu_R)+\frac12\,g_\sigma(x-\mu_L)

two Gaussians with the same σ\sigma, each carrying half the probability. In the symmetric case (this page and lab_31), μR=μL=μ=DJδδ/2\mu_R=-\mu_L=\mu=\mathrm{DJ}_{\delta\delta}/2.

The tail function, integrated step by step. Define T(x)P(jitter>x)=1F(x)T(x)\equiv P(\text{jitter}\gt x)=1-F(x) (FF is the CDF). Apply Step 3's result term by term to the model PDF, xgσ(vμ)dv=Q(xμσ)\int_x^\infty g_\sigma(v-\mu)\,dv=Q\big(\tfrac{x-\mu}{\sigma}\big):

Tδδ(x)=12Q ⁣(xμRσ)+12Q ⁣(xμLσ)T_{\delta\delta}(x)=\frac12\,Q\!\Big(\frac{x-\mu_R}{\sigma}\Big)+\frac12\,Q\!\Big(\frac{x-\mu_L}{\sigma}\Big)

Only one term survives in the deep tail. The ratio of the two terms (asymptotic form, symmetric case):

Q(x+μσ)Q(xμσ)exp ⁣((x+μ)2(xμ)22σ2)=exp ⁣(2μxσ2)=exp ⁣(DJδδxσ2)\frac{Q\big(\tfrac{x+\mu}{\sigma}\big)}{Q\big(\tfrac{x-\mu}{\sigma}\big)}\approx\exp\!\Big(-\frac{(x+\mu)^2-(x-\mu)^2}{2\sigma^2}\Big)=\exp\!\Big(-\frac{2\mu x}{\sigma^2}\Big)=\exp\!\Big(-\frac{\mathrm{DJ}_{\delta\delta}\,x}{\sigma^2}\Big)

With lab_31's numbers (DJδδ=3.16\mathrm{DJ}_{\delta\delta}=3.16 ps, σ=1.03\sigma=1.03 ps, region of interest x8.6x\approx8.6 ps), this ratio is e25.68×1012\approx e^{-25.6}\approx8\times10^{-12} — completely negligible. So the deep tail is just a single Gaussian with weight ½:

Tδδ(x)12Q ⁣(xμσ)(x in the deep right tail)T_{\delta\delta}(x)\approx\frac12\,Q\!\Big(\frac{x-\mu}{\sigma}\Big)\qquad(x\ \text{in the deep right tail})

The Q-scale straight line — the principle behind extracting (DJδδ,σ)(\mathrm{DJ}_{\delta\delta},\sigma). Invert the expression above:

Q1(2T(x))=xμσQ^{-1}\big(2\,T(x)\big)=\frac{x-\mu}{\sigma}

— on the "Q-scale" (vertical axis Q1(2T)Q^{-1}(2T), horizontal axis xx), the deep tail is a straight line: slope 1/σ1/\sigma, horizontal-axis intercept μ=DJδδ/2\mu=\mathrm{DJ}_{\delta\delta}/2. Instruments (a BERT scan or an oscilloscope's TIE histogram) perform exactly this straight-line fit to the measured tail. Note the factor 2 inside Q1Q^{-1}: it books the fact that "each Dirac carries only half the probability" — the first factor-of-2 to keep an eye on in this page (Step 7 has two more).

Step 5: The bathtub curve — derived step by step from the jitter CDF

Assume NRZ data with UI (unit interval) =Tb=T_b (unit: s). Take the eye center as the time origin and let the sampling-instant offset be tt; the left data edge sits nominally at UI/2-UI/2, the right edge at +UI/2+UI/2, each carrying jitter xx (identically distributed, tail TT, CDF FF).

  1. Error event one (left edge late): the left edge actually lands at UI/2+x-UI/2+x; if it arrives later than the sampling instant, i.e. UI/2+x>tx>UI/2+t-UI/2+x\gt t\Leftrightarrow x\gt UI/2+t, the sampler reads the previous bit. Probability =T(UI/2+t)=T(UI/2+t).
  2. Error event two (right edge early): the right edge actually lands at +UI/2+x+UI/2+x; if it arrives earlier than the sampling instant, i.e. UI/2+x<tx<(UI/2t)UI/2+x\lt t\Leftrightarrow x\lt-(UI/2-t), probability =F((UI/2t))=F(-(UI/2-t)), which for a symmetric distribution =T(UI/2t)=T(UI/2-t).
  3. Only a transition can produce an error: for random data the probability that adjacent bits differ is 12\tfrac12 (transition density ρT=12\rho_T=\tfrac12). Both events are rare, so the probability of the union \approx the sum (the intersection is second-order small):
 BER(t)=12[T ⁣(UI2t)+T ⁣(UI2+t)] \boxed{\ \mathrm{BER}(t)=\frac12\Big[T\!\Big(\frac{UI}{2}-t\Big)+T\!\Big(\frac{UI}{2}+t\Big)\Big]\ }

Consistency check: for pure RJ, T(x)=Q(x/σt)T(x)=Q(x/\sigma_t) and the expression reduces to BER(t)=12[Q(UI/2tσt)+Q(UI/2+tσt)]\mathrm{BER}(t)=\tfrac12[Q(\tfrac{UI/2-t}{\sigma_t})+Q(\tfrac{UI/2+t}{\sigma_t})] — exactly the formula of lab_12 and serdes_utils.ber_bathtub ✓. The bathtub's two "walls" are just the left and right tails of the jitter CDF, replotted with the horizontal axis changed from "jitter magnitude" to "sampling position". DJ's effect is immediately visible: it shifts the entire tail by μ\approx\mu → both walls move inward; RJ sets the walls' slope (on a log-BER axis, the slope is set by σ\sigma).

  • Dimension check: the argument of TT is [s][\text{s}], its output a probability (dimensionless); BER dimensionless ✓.
  • Applicability: rare events (BER1\mathrm{BER}\ll1); edge jitter stationary and data-independent (strictly speaking, ISI is data-correlated — see the failure conditions in Step 8).

Step 6: The TJ(BER) extrapolation formula — derivation and factor audit

Derivation. Goal: at a specified BER, how much eye width does jitter "eat"? Define the right-wall position xRx_R as the point where the dominant Gaussian of the right deep tail drops to the target BER (industry convention books the per-Gaussian tail == BER directly; audit below):

Q ⁣(xRμσ)=BER  xR=μ+σQ1(BER)Q\!\Big(\frac{x_R-\mu}{\sigma}\Big)=\mathrm{BER}\ \Longrightarrow\ x_R=\mu+\sigma\,Q^{-1}(\mathrm{BER})

Symmetrically, the left wall xL=μσQ1(BER)x_L=-\mu-\sigma Q^{-1}(\mathrm{BER}). Total jitter is defined as the total width eaten by the two walls:

 TJ(BER)=xRxL=DJδδ+2Q1(BER)σ \boxed{\ \mathrm{TJ}(\mathrm{BER})=x_R-x_L=\mathrm{DJ}_{\delta\delta}+2\,Q^{-1}(\mathrm{BER})\,\sigma\ }

At BER =1012=10^{-12}, TJ=DJδδ+14.07σ\mathrm{TJ}=\mathrm{DJ}_{\delta\delta}+14.07\,\sigma. Horizontal eye opening =UITJ(BER)=UI-\mathrm{TJ}(\mathrm{BER}).

  • Dimension check: [s]+[dimensionless]×[s]=[s][\text{s}]+[\text{dimensionless}]\times[\text{s}]=[\text{s}] ✓.
  • Physical meaning: the DJ part does not change with BER (bounded, eaten once); the RJ part grows slowly as Q1Q^{-1} while the BER tightens (1012101510^{-12}\to10^{-15} only moves from 14.07σ14.07\sigma to 15.88σ15.88\sigma — the logarithmic growth of the Gaussian tail).

Factor-of-2 audit (site convention: spell out every 2). The formula above uses Q1(BER)=7.034Q^{-1}(\mathrm{BER})=7.034, which implicitly books "the tail of each Gaussian == BER". Strictly following the bookkeeping of Steps 4 and 5 there are two more ½'s: the Dirac weight ½ (per-side tail T=12QT=\tfrac12Q) and the transition density ρT=12\rho_T=\tfrac12 (the bathtub multiplies by ½ again). With everything counted, the wall position is set by Q=4×BERQ=4\times\mathrm{BER}:

ConventionWall conditionMultiplier (BER =1012=10^{-12})lab_31 resulting TJ
per-Gaussian (industry formula)Q=BERQ=\mathrm{BER}7.0347.03417.6517.65 ps
per-side tail T=BERT=\mathrm{BER}Q=2BERQ=2\,\mathrm{BER}6.9376.93717.4317.43 ps
bathtub (ρT=12\rho_T=\tfrac12, this site's lab_12 convention)Q=4BERQ=4\,\mathrm{BER}6.8396.83917.2317.23 ps

The three differ by Q1(1012)Q1(4×1012)=0.196σQ^{-1}(10^{-12})-Q^{-1}(4\times10^{-12})=0.196\,\sigma/side — 0.400.40 ps total in this example, about 2% of TJ; the industry formula is conservative. In practice this is not a problem, because (DJδδ,σ)(\mathrm{DJ}_{\delta\delta},\sigma) are fitted from the tail and substituted back for extrapolation under one and the same convention — with a consistent convention the errors nearly cancel; but when comparing DJ/RJ reports from different instruments, always first ask which convention each one uses. (lab_31 prints all three numbers.)

Step 7: The honesty note — DJδδDJpp\mathrm{DJ}_{\delta\delta}\le\mathrm{DJ}_{pp}, and the under-report is deliberate

This is the most commonly misunderstood point about dual-Dirac: DJδδ\mathrm{DJ}_{\delta\delta} is a model parameter, not the actual peak-to-peak DJ. lab_31's numbers: the true sinusoidal DJ has DJpp=4.0\mathrm{DJ}_{pp}=4.0 ps, while the fit gives DJδδ=3.16\mathrm{DJ}_{\delta\delta}=3.16 ps.

Why it is necessarily smaller (derivation). The total jitter tail is the average of the Gaussian tail over the DJ distribution (obtained by swapping the order of integration in the convolution once):

T(x)=P(u+n>x)=AApDJ(u)Q ⁣(xuσ)duT(x)=P(u+n\gt x)=\int_{-A}^{A}p_{DJ}(u)\,Q\!\Big(\frac{x-u}{\sigma}\Big)\,du

Because uAu\le A and QQ is strictly decreasing, the integrand satisfies pointwise Q(xuσ)Q(xAσ)Q\big(\tfrac{x-u}{\sigma}\big)\le Q\big(\tfrac{x-A}{\sigma}\big). Split the integral into the right half (u>0u\gt0, total mass ½) and the left half (u0u\le0, whose deep-tail contribution is smaller by another factor of eAx/σ2e^{-Ax/\sigma^2}):

T(x)  12Q ⁣(xAσ)+12Q ⁣(xσ)exponentially smallT(x)\ \le\ \frac12\,Q\!\Big(\frac{x-A}{\sigma}\Big)+\underbrace{\frac12\,Q\!\Big(\frac{x}{\sigma}\Big)}_{\text{exponentially small}}

Equality holds only when the entire right-half mass is concentrated at u=Au=A (i.e. a two-point distribution like DCD). Flip to the Q-scale: Q1(2T(x))  xAσQ^{-1}(2T(x))\ \ge\ \tfrac{x-A}{\sigma}the true tail curve always lies above the line with "Diracs placed at the true extreme AA" (blue line vs gray dashed line in lab_31 panel (b)). A straight-line fit to the true curve therefore necessarily has intercept μA\mu\le A, i.e.:

DJδδ=2μ  2A=DJpp\mathrm{DJ}_{\delta\delta}=2\mu\ \le\ 2A=\mathrm{DJ}_{pp}

Why the under-report actually makes TJ accurate. For the extrapolation to be accurate, what is needed is that "over the few decades around the target BER, the line hugs the true tail height" — and the fit is anchored exactly that way (lab_31: the dual-Dirac extrapolated eye opening is 82.7682.76 ps vs 82.7782.77 ps for the exact composite — a 0.010.01 ps difference). Conversely, forcing the Diracs onto the true extremes ±A\pm A (using DJpp=4.0\mathrm{DJ}_{pp}=4.0 ps as DJδδ\mathrm{DJ}_{\delta\delta}) over-reports the DJ term alone by 4.03.16=0.844.0-3.16=0.84 ps: plugging into the formula (true σ=1.0\sigma=1.0 ps) gives TJ=4.0+14.07×1.0=18.07\mathrm{TJ}=4.0+14.07\times1.0=18.07 ps, pessimistic by 0.840.84 ps compared with the exact bathtub's 17.2317.23 ps — margin thrown away for nothing. Intuition: the DJ distribution carries only finite probability mass near its extremes (the sinusoid's double horns are still integrable singularities), so the deep tail is effectively a "discounted Gaussian" and the equivalent center naturally pulls inward.

The costs (also stated honestly):

  • DJδδ\mathrm{DJ}_{\delta\delta} depends on the fit depth. lab_31 sweeps three fit windows: T[108,104]3.07T\in[10^{-8},10^{-4}]\to3.07 ps, [1010,106]3.16[10^{-10},10^{-6}]\to3.16 ps, [1014,1010]3.27[10^{-14},10^{-10}]\to3.27 ps — the deeper the window, the closer to (but never exceeding) DJpp\mathrm{DJ}_{pp}. A DJ/RJ decomposition report should state its fit window; the spec documents (the MJSQ family) provide explicit methodology for this.
  • DJ "leaks" into σ\sigma: the fit gives σ=1.03\sigma=1.03 ps, slightly larger than the true RJ's 1.001.00 ps — the residual curvature of the DJ tail is absorbed by the straight line into its slope. So do not take the instrument-reported RJ directly as the integral of the oscillator's phase noise when cross-checking (a few % discrepancy is normal); to cross-check, isolate DJ with a clean clock pattern.

Step 8: lab_31 numerical verification

Full script: simulations/lab_31_dual_dirac.py (dependencies: Q from simulations/common/serdes_utils.py, savefig from simulations/common/plot_utils.py; running python scripts/run_all_sims.py re-runs it along with everything else). Synthesize RJ (σ=1\sigma=1 ps Gaussian) ++ sinusoidal DJ (A=2A=2 ps → DJpp=4\mathrm{DJ}_{pp}=4 ps) at UI=100UI=100 ps (10 Gb/s, same as lab_12). The tail T(x)T(x) is computed semi-analytically ("averaging over the sinusoid's phase") down to a depth of 101510^{-15} (no Monte-Carlo noise); the fit follows Step 4's Q-scale straight line.

ParameterVariableValueUnitNotes
RJ rmssigma_rj1×10121\times10^{-12}sGaussian, unbounded (exaggerated for teaching; the canonical example-C clock is 447.9 fs)
DJ amplitudea_dj2×10122\times10^{-12}sSinusoidal (supply-spur type), DJpp=2A=4\mathrm{DJ}_{pp}=2A=4 ps
Unit intervalui100×1012100\times10^{-12}s10 Gb/s NRZ
Target BERber_target101210^{-12}Common SerDes spec
Fit windowt_deep, t_shallow[1010,106][10^{-10},10^{-6}]— (tail probability)Q-scale line-fit region
MC sample countn_mc2×1062\times10^6Used for the histogram only

Run output (excerpt; # -> marks verifiable numbers):

extracted DJ_dd = 3.16 ps # -> 3.16 (< DJ_pp = 4.0)
extracted sigma = 1.03 ps # -> 1.03 (true RJ rms 1.0)
TJ@1e-12 (formula) = 17.65 ps # -> 17.65
TJ@1e-12 (bathtub) = 17.23 ps # -> 17.23
eye opening @1e-12: composite 82.77 ps vs dual-Dirac 82.76 ps

Left: histogram of RJ⊛sinusoidal-DJ with the exact PDF (double horn), compared against the fitted dual-Dirac model PDF (two Gaussians, Dirac positions ±1.58 ps inside the true extremes ±2 ps); middle: Q-scale tail fit — the blue exact curve lies above the gray &quot;Diracs at the true extremes&quot; line, orange marks the fit window; right: BER bathtub — the exact composite and the dual-Dirac extrapolation nearly coincide, while the RJ-only reference has a much wider usable window

How to read this figure:

  • (a) PDF: the blue (true) curve has arcsine double horns smeared round by the Gaussian; the red dashed curve (dual-Dirac) visibly does not fit in the mid-section — the model never claims to fit the PDF; it is responsible only for the deep tail. The red dash-dot lines (Dirac positions ±μ=±1.58\pm\mu=\pm1.58 ps) sit inside the gray dotted lines (true extremes ±2\pm2 ps): this is DJδδ<DJpp\mathrm{DJ}_{\delta\delta}\lt\mathrm{DJ}_{pp}.
  • (b) Q-scale: in the deep-tail region the blue curve is dead straight → Gaussian dominated; the red dashed line is the fitted line (slope 1/σ1/\sigma, intercept μ\mu); the gray dotted line is the pessimistic prediction with "Diracs forced at ±A\pm A", lying below the true curve (a larger tail probability at the same xx).
  • (c) bathtub: blue (exact) and red dashed (dual-Dirac extrapolation) nearly coincide at 101210^{-12} (0.01 ps difference in opening) — the model doing its proper job; the green dotted line (RJ-only, no DJ) opens far wider: DJ shifts the walls, RJ sets the slope.

Interactive: fit one yourself. The widget below lets you directly control the RJ σ and the sinusoidal DJ amplitude AA (synthesized population, seeded PRNG, N=20,000N=20{,}000), and switch between two BER-decade fit windows (shallow: [103,106][10^{-3},10^{-6}]; deep: [106,109][10^{-6},10^{-9}]) to watch DJδδ\mathrm{DJ}_{\delta\delta}, σfit\sigma_{fit}, their difference Δ=DJppDJδδ\Delta=\mathrm{DJ}_{pp}-\mathrm{DJ}_{\delta\delta}, and the extrapolated TJ@1012\mathrm{TJ}@10^{-12} move in real time as the fit depth changes — this is the quantitative version of Step 7's "the deeper the fit, the closer DJδδ\mathrm{DJ}_{\delta\delta} gets to (but never exceeds) DJpp\mathrm{DJ}_{pp}", and it holds for whatever σ,A\sigma,A you pick yourself.

Dual-Dirac Q-scale fitter — extract DJ_δδ and σ_fit, compare fit depths
1.00 ps
2.0 ps
(a) TJ histogram (N=20,000, seeded) — double horn + Gaussian smear
-8 ps8 psTJ (ps)
(b) Q-scale bathtub tail — drag the fit-region buttons below
1e-31e-61e-91e-12x (ps)Q⁻¹(2T)
shallow fit region (orange) deep fit region (blue) true tail (semi-analytic, exact — same method as lab_31; the bold line is the currently-selected fit depth).
DJ_δδ (fitted)
3.15
ps
DJ_pp (true)
4.00
ps
Δ = DJ_pp − DJ_δδ
0.85
ps
σ_fit / σ_true
1.03 / 1.00
ps
TJ@10⁻¹² (extrapolated)
17.65
ps
Shallow ([10⁻³, 10⁻⁶]): DJ_δδ = 2.99 ps, σ_fit = 1.05 ps, TJ@10⁻¹² = 17.74 ps. Deep ([10⁻⁶, 10⁻⁹]): DJ_δδ = 3.15 ps, σ_fit = 1.03 ps, TJ@10⁻¹² = 17.65 ps. The lesson: DJ_δδ < DJ_pp always, and the deeper fit pulls DJ_δδ closer to (but never past) DJ_pp — because the deep tail is dominated by the sinusoid's turning points, where nearly all of the DJ probability mass actually sits.
Model: RJ ~ N(0, σ²) ⊛ sinusoidal DJ = A·sin(θ), θ ~ U[0, 2π) (arcsine "double horn"; see this page's Step 2). Histogram/CDF panel uses N = 20,000 seeded samples (mulberry32) purely for illustration; the fit itself uses the semi-analytic tail T(x) = ⟨Q((x−A sinθ)/σ)⟩_θ (same method as simulations/lab_31_dual_dirac.py), since BER windows this deep cannot be resolved honestly from any finite sample. Q(x) via the Numerical Recipes erfc approximation; Q⁻¹ via Acklam's rational approximation to the inverse normal CDF. Pedagogical toy model — real links superpose ISI+DCD+PJ and ISI is data-correlated (this page's Step 8 / Applicability table).

One-liner verification (uses lab_31's real functions; a run takes a few seconds):

from simulations.lab_31_dual_dirac import fit_dual_dirac, q_inv
dj_dd, sigma_fit, _ = fit_dual_dirac(a_dj=2e-12, sigma_rj=1e-12)
print("DJ_dd =", round(dj_dd * 1e12, 2), "ps") # -> 3.16
print("sigma =", round(sigma_fit * 1e12, 2), "ps") # -> 1.03
tj = dj_dd + 2 * q_inv(1e-12) * sigma_fit
print("TJ@1e-12 =", round(float(tj) * 1e12, 2), "ps") # -> 17.65

This is a pedagogical model (not transistor-level): DJ is a single sinusoid only, and RJ is the equivalent Gaussian after integrating white noise; a real link's DJ is a superposition of ISI+DCD+PJ, and ISI is correlated with the data pattern.

Worked examples

Example 1 (TJ budget: canonical clock + given DJ) 10 Gb/s (UI=100UI=100 ps). Clock RJ from canonical example C: σt=447.9\sigma_t=447.9 fs (f0=5f_0=5 GHz, L(1MHz)=100\mathcal{L}(1\text{MHz})=-100 dBc/Hz, 1/f², integrated 1→100 MHz). The link measures DJδδ=3\mathrm{DJ}_{\delta\delta}=3 ps. Find the TJ and eye opening at BER =1012=10^{-12}.

Step-by-step substitution (with units):

TJ=DJδδ+2Q1(1012)σt=3 ps+14.07×0.4479 ps=3 ps+6.30 ps=9.30 ps,eye opening=UITJ=1009.30=90.7 ps=0.907 UI.\begin{aligned} \mathrm{TJ}&=\mathrm{DJ}_{\delta\delta}+2\,Q^{-1}(10^{-12})\,\sigma_t=3\ \text{ps}+14.07\times0.4479\ \text{ps}\\ &=3\ \text{ps}+6.30\ \text{ps}=9.30\ \text{ps},\\[4pt] \text{eye opening}&=UI-\mathrm{TJ}=100-9.30=90.7\ \text{ps}=0.907\ UI. \end{aligned}

The RJ term 6.306.30 ps matches Step 4 of serdes_clocking_connection, "448 fs → RJ eats 6.36.3 ps" ✓. Dimension check: [s]+[]×[s]=[s][\text{s}]+[-]\times[\text{s}]=[\text{s}] ✓.

sigma_t = 447.9e-15; dj_dd = 3e-12; ui = 100e-12
tj = dj_dd + 14.07 * sigma_t
print("TJ@1e-12 =", round(tj * 1e12, 2), "ps") # -> 9.3
print("eye opening =", round((ui - tj) * 1e12, 1), "ps") # -> 90.7

Example 2 (working an RJ spec backward into a phase-noise spec) Same link; the system allocates a TJ budget of 3030 ps (0.3UI0.3\,UI) to the clock path, and the link DJ takes DJδδ=20\mathrm{DJ}_{\delta\delta}=20 ps. Question: how much clock RJ is allowed at most? And converted back into an L(1MHz)\mathcal{L}(1\text{MHz}) spec (assuming example C's 1/f² shape and 1→100 MHz integration bandwidth), what does that become?

Step-by-step substitution (with units):

σt,max=TJDJδδ2Q1(1012)=3020 ps14.07=0.7107 ps=710.7 fs\sigma_{t,max}=\frac{\mathrm{TJ}-\mathrm{DJ}_{\delta\delta}}{2\,Q^{-1}(10^{-12})}=\frac{30-20\ \text{ps}}{14.07}=0.7107\ \text{ps}=710.7\ \text{fs}

With the 1/f² shape fixed, σt10L(1MHz)/20\sigma_t\propto10^{\mathcal{L}(1\text{MHz})/20} (proportional to amplitude), and example C's anchor is 100-100 dBc/Hz 447.9\to447.9 fs, so the allowed relaxation is:

ΔL=20log10710.7447.9=+4.0 dB  L(1MHz)96.0 dBc/Hz\Delta\mathcal{L}=20\log_{10}\frac{710.7}{447.9}=+4.0\ \text{dB}\ \Longrightarrow\ \mathcal{L}(1\text{MHz})\le-96.0\ \text{dBc/Hz}

Dimension check: [s]/[]=[s][\text{s}]/[-]=[\text{s}] ✓; the dB conversion acts on a dimensionless ratio ✓. Design message: once DJ eats two-thirds of the budget, the RJ spec immediately drops to sub-ps — this is why SerDes teams track DJ (layout/supply/equalization) and RJ (oscillator phase noise — ISF's territory) separately.

import numpy as np
ui, tj_budget, dj_dd = 100e-12, 30e-12, 20e-12
sigma_max = (tj_budget - dj_dd) / 14.07
print("sigma_max =", round(sigma_max * 1e15, 1), "fs") # -> 710.7
dL = 20 * np.log10(sigma_max / 447.9e-15)
print("L(1MHz) max =", round(-100 + dL, 1), "dBc/Hz") # -> -96.0

Applicability and failure conditions

AssumptionHolds whenFails when
RJ Gaussian and stationaryThermal noise dominates; free-running or measured in-loopDeep tail contaminated by spurs, or non-stationary (temperature drift) → Q-scale no longer a straight line
DJ bounded and independent of RJSupply spurs, DCD, fixed-channel ISIDJ amplitude drifts slowly (supply load transients) → the decomposition drifts over time
Deep tail dominated by a single GaussianFit window deep enough (T106T\lesssim10^{-6})Fit window too shallow: residual DJ curvature → σ\sigma over-estimated, DJδδ\mathrm{DJ}_{\delta\delta} under-estimated even more
Edge jitter independent of dataClock jitter, asynchronous spursISI is pattern-correlated: a strict treatment bins by pattern (conditioning the CDF) and then recombines
Rare events add (union \approx sum)BER1\mathrm{BER}\ll1With the eye nearly closed (BER approaching 0.5), higher-order terms are no longer negligible
Consistent conventionComparisons within one instrument / one QQ conventionComparing DJ/RJ numbers across instruments: per-Gaussian vs ρT\rho_T conventions differ by 0.2σ\approx0.2\sigma/side (Step 6 audit table)

Relation to ISF / this site's chain, and design knobs

  • ISF owns RJ: every knob for σt\sigma_t lives in the earlier chapters — lower Γrms\Gamma_{rms} (waveform symmetry, symmetry), raise qmaxq_{max} (tank_swing), lower SiS_i, use the loop high-pass to cut the lower integration limit (serdes_clocking_connection Step 6).
  • ISF cannot see DJ: DJ's knobs are power integrity (LDO/decoupling, against PJ), equalization (CTLE/DFE, against ISI), and duty-cycle correction (against DCD). For how spurs are distinguished from random phase noise in the spectrum, see measurement_and_spurs.
  • Making the shorthand precise: the serdes page's TJ=DJpp+2QRJrms\mathrm{TJ}=\mathrm{DJ}_{pp}+2Q\cdot\mathrm{RJ}_{rms} is engineering shorthand (conservative); the strict version replaces DJpp\mathrm{DJ}_{pp} with the fitted DJδδ\mathrm{DJ}_{\delta\delta}, and Step 7 of this page quantifies the difference between the two (here 4.0 vs 3.16 ps → TJ over-reported by 0.84 ps).

Key takeaways

  • RJ: Gaussian, unbounded, from phase noise ([P1] Eq.(21) → integration → σt\sigma_t; [P2] Eq.(8) random walk); booked as σ\sigma × Q1(BER)Q^{-1}(\mathrm{BER}). DJ: bounded (ISI/DCD/PJ); booked peak-to-peak.
  • Q(x)=12erfc(x/2)Q(x)=\tfrac12\mathrm{erfc}(x/\sqrt2) comes from the Gaussian tail integral; Q1(1012)=7.03Q^{-1}(10^{-12})=7.03, Q1(1015)=7.94Q^{-1}(10^{-15})=7.94.
  • dual-Dirac: pδδ=12gσ(xμ)+12gσ(x+μ)p_{\delta\delta}=\tfrac12 g_\sigma(x-\mu)+\tfrac12 g_\sigma(x+\mu); deep tail T12Q(xμσ)T\approx\tfrac12Q(\tfrac{x-\mu}{\sigma}) → Q-scale straight-line fit yields (DJδδ,σ)(\mathrm{DJ}_{\delta\delta},\sigma).
  • The bathtub BER(t)=12[T(UI2t)+T(UI2+t)]\mathrm{BER}(t)=\tfrac12[T(\tfrac{UI}{2}-t)+T(\tfrac{UI}{2}+t)] is just the two tails of the jitter CDF replotted.
  • TJ(BER)=DJδδ+2Q1(BER)σ\mathrm{TJ}(\mathrm{BER})=\mathrm{DJ}_{\delta\delta}+2Q^{-1}(\mathrm{BER})\sigma; the conventions (per-Gaussian / per-side / ρT\rho_T) differ by 0.2σ\approx0.2\sigma/side — align conventions before comparing instrument numbers.
  • DJδδDJpp\mathrm{DJ}_{\delta\delta}\le\mathrm{DJ}_{pp}, and the under-report is deliberate: the fit is anchored to the true deep tail → accurate extrapolation (lab_31: 0.01 ps difference in opening); forcing DJpp\mathrm{DJ}_{pp} in is pessimistic instead and wastes margin. lab_31: DJpp=4.0\mathrm{DJ}_{pp}=4.0 ps → DJδδ=3.16\mathrm{DJ}_{\delta\delta}=3.16 ps, σ=1.03\sigma=1.03 ps, TJ@1012=17.6510^{-12}=17.65 ps.

Methodology references (external literature, not among the five source PDFs): dual-Dirac is the industry-standard method; see INCITS T11.2, Fibre Channel — Methodologies for Jitter and Signal Quality Specification (MJSQ), Technical Report Rev 14.0, June 2005; and R. Stephens, "Jitter Analysis: The Dual-Dirac Model, RJ/DJ, and Q-Scale," Agilent Technologies Whitepaper, Dec. 2004. The jitter clauses of modern SerDes specs (PCIe, the OIF-CEI family) all inherit this model. The theory of phase noise / RJ itself comes from [P1]/[P2].

Further reading