Skip to content

P802.3dj Device Models, Mueller-Muller CDR & Real Eye Margins

Choose a tag to compare

@capn-freako capn-freako released this 20 Oct 09:00
· 45 commits to master since this release

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 (traits pkg_enable, pkg_group, tx_pkg_case, rx_pkg_case, pkg_include_host) replaces the lumped Tx Rs/Cout and Rx Rin/Cin with 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 new vita_end ("tx"/"rx") option on import_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's loc_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_min trait (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, or ccomp, instead of a crash mid-simulation.

MCP Server

  • New optimize_eq tool: runs the GUI's "Optimize EQ" co-optimization headlessly and returns a configuration with the winning EQ committed (as "Use EQ" does), ready for run_simulation.
    Optional max_trials, tx_ami_params, and rx_ami_params arguments bound and select the IBIS-AMI parameter search.
  • New list_ami_params tool: 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_model now reports dll_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 just rn), 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

  1. pip install --upgrade pipbert
  2. (MCP users) pip install --upgrade mcp

What's Changed

Full Changelog: v11.0.0...v11.1.0