Main Content

PAMn Capabilities

The IBIS BIRD (Buffer Issue Resolution Document) 213 adds supports to IBIS-AMI models for all levels of signaling from PAM2 (NRZ) onward, collectively known as PAMn. You can simulate PAMn models up to n = 32 with specific mapping using the Serial Link Designer or Parallel Link Designer apps.

Some important terms related to PAMn signaling include:

  • Payload — Binary bits to be transmitted using PAMn voltage levels.

  • Message — PAMn symbols.

  • Mapping — Look-up table used to translate PAMn voltage levels to binary bits.

  • Encoding — Process of converting binary payload to PAMn symbols sent.

  • Decoding — Process of converting received PAMn symbols to binary bits.

You can select the number of modulation levels with the Modulation_Levels AMI Parameter in the solution space.

To define PAMn mappings, in the Stimulus Editor, set the Number Modulation Levels and Mapping parameters. The available mapping option depends on the modulation scheme selected.

Selecting number of modulation levels and mapping.

Mapping Binary Payload to PAMn Symbols

For a system that transmits and receives PAMn symbols, the ability to reliably map between binary and PAMn symbols is crucial.

For NRZ or PAM2 modulation, the mapping is trivial.

Binary PayloadMessage SymbolSymbol Voltage
00-0.5
110.5

You can map a PAM4 symbol in 24 ways. This table shows one of the possible solutions:

Binary PayloadMessage SymbolSymbol Voltage
000-0.5
011-0.1666
1020.1666
1130.5

For PAM2, PAM4, PAM8, and other PAMn, where n is a power of 2, the mapping is straightforward in that the message symbol sequence is of length 1. For PAM3, the mapping is not as clean since the number of bits per symbol is not an integer. This table shows the PAM3 symbol mapping for the IEEE 100Base-T1 standard.

Binary PayloadMessage SymbolSymbol Voltage
0000 1-0.5 -0.5
0010 1-0.5 0
0100 2-0.5 0.5
0111 00 -0.5
1001 20 0.5
1012 00.5 -0.5
1102 10.5 0
1112 20.5 0.5

The eight possible binary payload sequences in this table are assigned a unique message symbol sequence. But the 1 1 message sequence is not specified. As such, if a 1 1 is detected at the receiver, a simple decoding of the symbol message back to binary is not possible.

To analyze this mapping further, you need the payload and message set size. The binary payload length is 3, and therefore the binary payload set size is 23 = 8. The message length is 2 and with PAM3, the symbol message set size is 32 = 9. Therefore, the coverage of this PAM3 mapping is 8/9 = 88.88%. The IEEE 100Base-T1 standard could have chosen a different symbol sequence for the missing message. So there are many different possible mapping schemes. A PAM3 mapping with greater coverage is one with a binary payload length of 11 and a message length of 7. This has a coverage of 211/37 = 93.64% and has 139 missing messages.

One possible approach to mapping a binary payload to PAMn symbols and locating the missing messages is:

  • Represent the binary payload as a base-10 integer x.

  • Scale x from the binary payload range of [0, 2PayLoadLength-1] to the range of [0, nMessageLength-1] to obtain y.

  • Convert y to a base-n number to obtain the PAMn message sequence.

This mapping algorithm has the benefit of distributing the missing symbol sequences uniformly within the range of message sequences.

The complete list of mapping depending on the number of modulation levels is shown:

Number of Modulation LevelsMapping
2Default
3UNIFORM_3_2
UNIFORM_11_7
UNIFORM_19_12
USB4_V2
ETH_100BASE_T1
4PAM4_0132
PAM4_0123
PAM4_0213
PAM4_0231
PAM4_0312
PAM4_0321
PAM4_1023
PAM4_1032
PAM4_1203
PAM4_1230
PAM4_1302
PAM4_1320
PAM4_1302
PAM4_2013
PAM4_2031
PAM4_2103
PAM4_2130
PAM4_2301
PAM4_2310
PAM4_3012
PAM4_3021
PAM4_3102
PAM4_3120
PAM4_3201
PAM4_3210
5UNIFORM_9_4
UNIFORM_16_7
UNIFORM_23_10
UNIFORM_30_13
UNIFORM_37_16
UNIFORM_44_19
6UNIFORM_5_2
UNIFORM_18_7
UNIFORM_31_12
7UNIFORM_14_5
UNIFORM_5_2
UNIFORM_8_3
UNIFORM_11_4
8UNIFORM_3_1
9UNIFORM_3_1
UNIFORM_19_6
10UNIFORM_3_1
UNIFORM_13_4
UNIFORM_23_7
UNIFORM_33_10
UNIFORM_43_13
11UNIFORM_17_5
UNIFORM_3_1
UNIFORM_10_3
UNIFORM_24_7
UNIFORM_31_9
UNIFORM_38_11
12UNIFORM_7_2
UNIFORM_3_1
UNIFORM_25_7
UNIFORM_43_12
13UNIFORM_11_3
UNIFORM_3_1
UNIFORM_7_2
UNIFORM_37_10
14UNIFORM_15_4
UNIFORM_7_2
UNIFORM_11_3
UNIFORM_19_5
15UNIFORM_31_8
UNIFORM_11_3
UNIFORM_15_4
UNIFORM_19_5
UNIFORM_23_6
UNIFORM_27_7
UNIFORM_35_9
UNIFORM_39_10
16UNIFORM_4_1
17UNIFORM_4_1
UNIFORM_49_12
18UNIFORM_25_6
UNIFORM_4_1
19UNIFORM_21_5
UNIFORM_4_1
UNIFORM_38_9
20UNIFORM_17_4
UNIFORM_4_1
UNIFORM_30_7
UNIFORM_43_10
21UNIFORM_13_3
UNIFORM_4_1
UNIFORM_35_8
22UNIFORM_22_5
UNIFORM_4_1
UNIFORM_13_3
UNIFORM_31_7
UNIFORM_40_9
UNIFORM_49_11
23UNIFORM_9_2
UNIFORM_4_1
24UNIFORM_9_2
UNIFORM_4_1
UNIFORM_32_7
25UNIFORM_9_2
UNIFORM_4_1
UNIFORM_23_5
UNIFORM_37_8
26UNIFORM_14_3
UNIFORM_4_1
UNIFORM_9_2
UNIFORM_47_10
27UNIFORM_19_4
UNIFORM_9_2
UNIFORM_14_3
28UNIFORM_24_5
UNIFORM_9_2
UNIFORM_14_3
UNIFORM_19_4
29UNIFORM_34_7
UNIFORM_9_2
UNIFORM_14_3
UNIFORM_19_4
UNIFORM_24_5
UNIFORM_29_6
30UNIFORM_49_10
UNIFORM_9_2
UNIFORM_14_3
UNIFORM_19_4
UNIFORM_24_5
UNIFORM_29_6
UNIFORM_34_7
UNIFORM_39_8
UNIFORM_44_9
31UNIFORM_64_13
UNIFORM_29_6
UNIFORM_34_7
UNIFORM_39_8
UNIFORM_44_9
UNIFORM_49_10
32UNIFORM_5_1

PAM6 Mapping Using UNIFORM_5_2 Standard

For PAMn = 6, a payload length of 5 bits and a message length of 2 symbols gives 88.88% coverage with 4 missing symbol sequences. This example illustrates how each possible payload is mapped to a symbol sequence and the missing symbol sequences are distributed uniformly throughtout.

Define the PAMn level, payload length, and message length.

n = 6;                  %PAMn Levels
PayloadLength=5;        %Number of binary bits to encode
MessageLength=2;        %Number of PAMn symbols to encode each payload into

Calculate the number of gaps between the number of possible messages and the number of possible payload values.

missingSymbolSequenceCount = n^MessageLength - 2^PayloadLength;

To loop over every possible payload value, first represent the binary payload as a base-10 integer Payload. Scale this value from the binary payload range of [0, 2^PayloadLength-1] to the range of [0, N^MessageLength-1] to get the ScaledPayload parameter. Then convert the ScaledPayload parameter to a base-N number. This approach uniformly distributes any missing message sequences throughout the message space. You can visualize the integer and binary payload, scaled payload, and resulting PAMn symbol values.

for Payload = 0:2^PayloadLength-1

    ScaledPayload = round(Payload*(1 + missingSymbolSequenceCount/(2^PayloadLength)));
    ScaledPayload1 = ScaledPayload; %Store initial value for report

    %Convert the integer Payload value to a base N number
    SymbolsOut=zeros(1,MessageLength);
    for jj=1:MessageLength

        %Determine the remainder after division to determine the next
        %least-significant base N value and store output symbols big-endian
        SymbolsOut(MessageLength+1-jj) = (mod(round(ScaledPayload),n));

        %Remove contribution of least-significant base N value and shift by
        %division (analogous to how divide by 2 is a binary bitshift).
        ScaledPayload = (ScaledPayload - SymbolsOut(MessageLength+1-jj)) / n;
    end

    %Report out payload (integer and binary), scaled payload and resulting
    %PAMn symbol values

    if Payload==0
        %Print out header of report
        fprintf('%13s -->  %6s --> %s\n','Payload   ','Scaled ','Output Symbols');
    end

    fprintf('%4g: %7s --> %8.6g --> %s\n',...
        Payload,...                  %Input payload value in integer form
        dec2bin(Payload,PayloadLength), ...      %Input payload value in binary form
        ScaledPayload1,...                  %Scaled payload value in double form
        num2str(round(SymbolsOut)))     %Output PAMn message symbol values
end
   Payload    -->  Scaled  --> Output Symbols
   0:   00000 -->        0 --> 0  0
   1:   00001 -->        1 --> 0  1
   2:   00010 -->        2 --> 0  2
   3:   00011 -->        3 --> 0  3
   4:   00100 -->        5 --> 0  5
   5:   00101 -->        6 --> 1  0
   6:   00110 -->        7 --> 1  1
   7:   00111 -->        8 --> 1  2
   8:   01000 -->        9 --> 1  3
   9:   01001 -->       10 --> 1  4
  10:   01010 -->       11 --> 1  5
  11:   01011 -->       12 --> 2  0
  12:   01100 -->       14 --> 2  2
  13:   01101 -->       15 --> 2  3
  14:   01110 -->       16 --> 2  4
  15:   01111 -->       17 --> 2  5
  16:   10000 -->       18 --> 3  0
  17:   10001 -->       19 --> 3  1
  18:   10010 -->       20 --> 3  2
  19:   10011 -->       21 --> 3  3
  20:   10100 -->       23 --> 3  5
  21:   10101 -->       24 --> 4  0
  22:   10110 -->       25 --> 4  1
  23:   10111 -->       26 --> 4  2
  24:   11000 -->       27 --> 4  3
  25:   11001 -->       28 --> 4  4
  26:   11010 -->       29 --> 4  5
  27:   11011 -->       30 --> 5  0
  28:   11100 -->       32 --> 5  2
  29:   11101 -->       33 --> 5  3
  30:   11110 -->       34 --> 5  4
  31:   11111 -->       35 --> 5  5

Create and print out the summary string.

strout = sprintf(['PAMn=%g, Payload Length=%g, Message Length=%g\n',...
    'Missing %g symbol sequences for coverage of 2^{%g}/%g^{%g} = %g%%'],...
    n,PayloadLength,MessageLength,...
    missingSymbolSequenceCount,...
    PayloadLength,n,MessageLength,2^PayloadLength/n^MessageLength*100)
strout = 
    'PAMn=6, Payload Length=5, Message Length=2
     Missing 4 symbol sequences for coverage of 2^{5}/6^{2} = 88.8889%'

Identify and visualize the gaps in message symbol sequences.

Payload = 0:2^PayloadLength-1;
ScaledPayload = Payload + (n^MessageLength-2^PayloadLength)/(2^PayloadLength)*Payload;

isaGap = ones(1,n^MessageLength-1);
isaGap(round(ScaledPayload)+1) = 0;
 
stem(0:length(isaGap)-1,isaGap)
axis([0 n^MessageLength-1 0 1.1])
title({'Location of the missing message symbol sequences for ',strout})
xlabel('Message (Decimal)')

See Also

|