PAMn Capabilities
IBIS BIRD (Buffer Issue Resolution Document) 213 adds supports to IBIS-AMI models for any level of signaling from PAM2 (NRZ) to upwards, collectively known as PAMn. You can simulate PAMn models for upto n = 32 with specific mapping using the Serial Link Designer or Parallel Link Designer apps.
There are some specific terms defined for PAMn signaling:
Payload — Binary bits to be transmitted using PAMn voltage levels.
Message — PAMn symbols.
Mapping — A look-up table used to translate PAMn voltage levels to binary bits.
Encoding — The entire process of converting binary payload to PAMn symbols sent.
Decoding — The entire process of converting received PAMn symbols to binary bits.
The number of Modulation Levels is selected with the Modulation_Levels
AMI Parameter in the solution space.
To define PAMn mappings, in the Stimulus editor, select the parameters Number Modulation Levels and Mapping. The mapping is dependent on the modulation scheme selected.
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 Payload | Message Symbol | Symbol Voltage |
---|---|---|
0 | 0 | -0.5 |
1 | 1 | 0.5 |
For PAM4, the mapping can be done in 24 ways. One of the possible ways can be:
Binary Payload | Message Symbol | Symbol Voltage |
---|---|---|
00 | 0 | -0.5 |
01 | 1 | -0.1666 |
10 | 2 | 0.1666 |
11 | 3 | 0.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. For example, the PAM3 symbol mapping for the IEEE 100Base-T1 standard is:
Binary Payload | Message Symbol | Symbol Voltage |
---|---|---|
000 | 0 1 | -0.5 -0.5 |
001 | 0 1 | -0.5 0 |
010 | 0 2 | -0.5 0.5 |
011 | 1 0 | 0 -0.5 |
100 | 1 2 | 0 0.5 |
101 | 2 0 | 0.5 -0.5 |
110 | 2 1 | 0.5 0 |
111 | 2 2 | 0.5 0.5 |
Here, the eight possible binary payload sequences 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, the set size of the payload and message is needed. 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.
The question becomes, how to map the binary payload to the PAMn symbols and where to locate the missing messages. One possible approach can be:
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 throughout the range of message sequences.
The complete list of mapping depending on the number of modulation levels is shown:
Number of Modulation Levels | Mapping |
---|---|
2 | Default |
3 | UNIFORM_3_2 |
UNIFORM_11_7 | |
UNIFORM_19_12 | |
USB4_V2 | |
ETH_100BASE_T1 | |
4 | PAM4_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 | |
5 | UNIFORM_9_4 |
UNIFORM_16_7 | |
UNIFORM_23_10 | |
UNIFORM_30_13 | |
UNIFORM_37_16 | |
UNIFORM_44_19 | |
6 | UNIFORM_5_2 |
UNIFORM_18_7 | |
UNIFORM_31_12 | |
7 | UNIFORM_14_5 |
UNIFORM_5_2 | |
UNIFORM_8_3 | |
UNIFORM_11_4 | |
8 | UNIFORM_3_1 |
9 | UNIFORM_3_1 |
UNIFORM_19_6 | |
10 | UNIFORM_3_1 |
UNIFORM_13_4 | |
UNIFORM_23_7 | |
UNIFORM_33_10 | |
UNIFORM_43_13 | |
11 | UNIFORM_17_5 |
UNIFORM_3_1 | |
UNIFORM_10_3 | |
UNIFORM_24_7 | |
UNIFORM_31_9 | |
UNIFORM_38_11 | |
12 | UNIFORM_7_2 |
UNIFORM_3_1 | |
UNIFORM_25_7 | |
UNIFORM_43_12 | |
13 | UNIFORM_11_3 |
UNIFORM_3_1 | |
UNIFORM_7_2 | |
UNIFORM_37_10 | |
14 | UNIFORM_15_4 |
UNIFORM_7_2 | |
UNIFORM_11_3 | |
UNIFORM_19_5 | |
15 | UNIFORM_31_8 |
UNIFORM_11_3 | |
UNIFORM_15_4 | |
UNIFORM_19_5 | |
UNIFORM_23_6 | |
UNIFORM_27_7 | |
UNIFORM_35_9 | |
UNIFORM_39_10 | |
16 | UNIFORM_4_1 |
17 | UNIFORM_4_1 |
UNIFORM_49_12 | |
18 | UNIFORM_25_6 |
UNIFORM_4_1 | |
19 | UNIFORM_21_5 |
UNIFORM_4_1 | |
UNIFORM_38_9 | |
20 | UNIFORM_17_4 |
UNIFORM_4_1 | |
UNIFORM_30_7 | |
UNIFORM_43_10 | |
21 | UNIFORM_13_3 |
UNIFORM_4_1 | |
UNIFORM_35_8 | |
22 | UNIFORM_22_5 |
UNIFORM_4_1 | |
UNIFORM_13_3 | |
UNIFORM_31_7 | |
UNIFORM_40_9 | |
UNIFORM_49_11 | |
23 | UNIFORM_9_2 |
UNIFORM_4_1 | |
24 | UNIFORM_9_2 |
UNIFORM_4_1 | |
UNIFORM_32_7 | |
25 | UNIFORM_9_2 |
UNIFORM_4_1 | |
UNIFORM_23_5 | |
UNIFORM_37_8 | |
26 | UNIFORM_14_3 |
UNIFORM_4_1 | |
UNIFORM_9_2 | |
UNIFORM_47_10 | |
27 | UNIFORM_19_4 |
UNIFORM_9_2 | |
UNIFORM_14_3 | |
28 | UNIFORM_24_5 |
UNIFORM_9_2 | |
UNIFORM_14_3 | |
UNIFORM_19_4 | |
29 | UNIFORM_34_7 |
UNIFORM_9_2 | |
UNIFORM_14_3 | |
UNIFORM_19_4 | |
UNIFORM_24_5 | |
UNIFORM_29_6 | |
30 | UNIFORM_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 | |
31 | UNIFORM_64_13 |
UNIFORM_29_6 | |
UNIFORM_34_7 | |
UNIFORM_39_8 | |
UNIFORM_44_9 | |
UNIFORM_49_10 | |
32 | UNIFORM_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)')