Signal Integrity

The Signal Integrity feature offers the equivalent of an Equivalent Time oscilloscope trace of the RX PAM4 signal (later, also PAM2). The trace is done with the A/D converter in the GTM receiver also doing the data sampling / CDR function, i.e. the trace is taken after the RX equalizer.

The HW characteristics of the Versal GTM used in Freya are: Trace length = 2000 samples, sample resolution = 7 bits 2’s complement, i.e. range = -64..63.

Using the sampled eye scan feature through CLI involves two steps:

Trigger the acquisition of a trace (PL1_CTRL)

Retrieve the trace data (PL1_GET_DATA)

This command is a generic function to retrieve dynamic data related to Layer 1 / SERDES. For now, only used for signal integrity scan.

For func==0, sampled eye scan:

  • result==0: No data available.

“No data available” means that either a scan was never started, an acquisition was started and in progress, or the acquired data has become too old (e.g. older than 500 ms). The acquisition time for a trace is in the very low ms-range. If result==0, sweep_no and age_us are dummy (=0), and no additional data are returned.

  • result==1: Data returned. In that case, the rest of the parameters apply:

sweep_no: per-SERDES trace acquisition counter: 1,2,3… Each trace can be returned multiple times, to different users, within its lifetime. A new trace acquisition is triggered with the PL1_CTRL command.

age_us: The “age” of the trace data in microseconds, i.e. the time from data acquisition from hardware was completed until the time the command reply data is generated.

value: The rest of the reply is a set of 16 bit signed 2-complement sample values. With present hardware, the range of each sample is -64..63. In XMP scripting, each sample value is represented as two bytes, msb first.

With present implementation, 2006 sample values (4012 bytes) are returned.

The first 6 sample values are so-called sampled levels: <p1> <p2> < p3> <m1> <m2> <m3>

Control

Corresponding low-level API class: PL1_CTRL

await port.l1.serdes[0].medium.siv.control.set(opcode=enums.Layer1Opcode.START_SCAN)

Data

Corresponding low-level API class: PL1_GET_DATA

resp = await port.l1.serdes[0].medium.siv.data.get()
resp.result
resp.age_us
resp.sweep_no
resp.value