Repository navigation
P802.3dj Device Models, Mueller-Muller CDR & Real Eye Margins
General Description
This release readies PyBERT for IEEE P802.3dj (200 Gb/s per lane) link work.
It adds the P802.3dj/D3.3 Annex 178A Tx/Rx device (die + package) models, a Mueller-Muller CDR option, VITA 68.x multi-port channel import, and new MCP tools for Tx/Rx EQ co-optimization.
It also fixes several accuracy problems: in the Viterbi (MLSD) decoder, the DFE pulse response, the native CTLE impulse response, and jitter analysis.
Note: Because of those fixes, simulation results (especially MLSD BER, DFE plots, jitter decomposition, and "Optimize EQ" results with native CTLE) can differ from v11.0.0, and should now be more accurate.
Re-running "Optimize EQ" on existing configurations is recommended.
New Features
Channel & Device Modeling
- P802.3dj/D3.3 Annex 178A Tx/Rx device models.
The new "Tx/Rx Device Models (P802.3dj Annex 178A)" GUI group (traitspkg_enable,pkg_group,tx_pkg_case,rx_pkg_case,pkg_include_host) replaces the lumped TxRs/Coutand RxRin/Cinwith the draft's die ladder, package transmission-line, and optional partial host channel models, from PyChOpMarg.- Groups: KR, C2C, CR, and C2M. Cases: package class + Test (A1/A2/B1/B2), CR host class (HL/HN/HH), or C2M host/module.
- Unlike the lumped model, this uses the channel's full S-parameters (incl. S11/S22).
- Disabled by default; with it disabled, the channel is computed exactly as before.
- VITA 68.x multi-port segment import.
VITA 68.3 reference-model Module/Backplane files, which carry both link directions in each lane (e.g. 32 ports for 4 lanes), are now supported via a newvita_end("tx"/"rx") option onimport_channel()/import_freq(). - More reliable 4-port through-path detection.
The "1=>2/3=>4" vs. "1=>3/2=>4" check now averages over 10 MHz - 1 GHz, instead of a single mid-band point, which mis-detected long, lossy channels (7 of the 533 P802.3dj corpus victim channels).
CDR & Equalization
- Mueller-Muller CDR option (
cdr_type; "Bang-Bang" remains the default).
It clocks the DFE at the fixed phase PyChOpMarg'sloc_curs()finds (the same criterion COM uses to locate its cursor), and starts DFE tap 1 at its anticipated value. - The CDR proportional step is now given in UI (
delta_t_ui), so loop dynamics no longer change with data rate.
Older configurations'delta_t(ps) is converted on load. - PAM-4 CDR phase detection now uses only transitions symmetric about 0 V.
- Native Rx FFE taps and their tuners are now saved in configurations.
- New
tx_c0_mintrait (default 0; P802.3dj's reference transmitter uses 0.54).
The EQ optimizer now skips Tx tap combinations whose cursor falls below it or inverts the pulse. - The EQ optimizer's MMSE noise model now includes the simulated Rx input noise, instead of zero.
IBIS-AMI (now requires pyibis-ami 10.0)
- The Tx/Rx IBIS model selectors now offer only
Model_types PyBERT can simulate (Tx: Output, 3-state, I/O; Rx: Input, I/O). - AMI files are resolved by direction, so an I/O model's Rx side no longer loads the Tx
.ami/DLL. - Updated for pyibis-ami 10.0's decoupled GUI; IBIS load notices and alerts now come from PyBERT, and pyibisami's log is shown on stderr (with debug detail when PyBERT's Debug is on).
- A clear error is now raised when a model lacks
zout,zin, orccomp, instead of a crash mid-simulation.
MCP Server
- New
optimize_eqtool: runs the GUI's "Optimize EQ" co-optimization headlessly and returns a configuration with the winning EQ committed (as "Use EQ" does), ready forrun_simulation.
Optionalmax_trials,tx_ami_params, andrx_ami_paramsarguments bound and select the IBIS-AMI parameter search. - New
list_ami_paramstool: reports each side's tunable IBIS-AMI parameter names and ranges. run_simulation(target_ber=...)now returns:eye_margin_ui: the real 2-D eye width at the target BER;eye_heights_v: each eye's vertical opening at the target BER;jitter_bathtub_width_ui: the crossing-jitter bathtub width (what the GUI's bathtub plot shows).
inspect_ibis_modelnow reportsdll_file/ami_file, split into Tx/Rx for I/O models.
Bug Fixes
- Viterbi (MLSD) decoder: its expected observations now scale with
vod, use the measured noise + residual-ISI spread at the slicer (not justrn), and sample at the recovered clock's phase.
On a P802.3dj CR channel, errors dropped from 26,845 to 0 in 70k bits.
The trellis step is also vectorized: decoding 35k PAM-4 symbols now takes 0.6 s, down from minutes. - DFE pulse response: the DFE taps are now subtracted, not added; the post-cursor was being doubled in
dfe_out_p(the Viterbi ISI model and the GUI's DFE plots). - Native CTLE impulse response: no longer truncated at
rx_bw(which made even a 0 dB CTLE slow and ringing); the simulation and EQ optimizer now share one construction.
The optimizer also no longer optimizes against a CTLE that the simulation never applies. - Jitter analysis:
- a missed crossing no longer corrupts the next one;
- dual-Dirac tail fits now actually fit (they always returned their starting guess);
- the data-independent track subtracts the pattern average over the whole record;
- PAM-4 statistics use only transitions symmetric about 0 V.
- Bathtub curves are now extrapolated with the separated (and now unbiased) random jitter, not the dual-Dirac values.
- Disabled Rx FFE taps are now ignored in simulation, and Tx/Rx tap enabled states stay consistent after EQ optimization and after loading a configuration.
Dependencies
pyibis-ami[gui]>=10.0.0,<11(was==9.3.0)pychopmarg>=3.4.0,<4(was==3.1.2), which brings the D3.3 device models and several COM accuracy fixes (MATLAB COM 4p17p0 parity).
Quick Update Instructions
pip install --upgrade pipbert- (MCP users)
pip install --upgrade mcp
What's Changed
- Bump pyjwt from 2.13.0 to 2.15.0 by @dependabot[bot] in #226
- Bump mako from 1.3.12 to 1.4.2 by @dependabot[bot] in #227
- MCP EQ optimization, Mueller-Muller CDR, and simulation/jitter/coopt accuracy fixes by @capn-freako in #225
- P802.3dj D3.3 Device Models by @capn-freako in #229
- Bump mcp from 2.0.0 to 2.2.0 by @dependabot[bot] in #228
Full Changelog: v11.0.0...v11.1.0