Globally Adapt Receiver Components Using Pulse Response Metrics to Improve SerDes Performance
This example shows how to perform optimization of a set of receiver components as a system using function optPulseMetric
to calculate metrics such as eye height, width and channel operating margin (COM) estimate from a pulse response at a target bit error rate (BER) to evaluate the optimal performance of a particular configuration. The adaptation is performed as statistical analysis (Init), then the optimized result is passed to time-domain (GetWave).
Initialize SerDes System with Multiple CTLEs and DFECDR
This example uses the SerDes Designer model rx_ctle_adapt_dfe_train
as a starting point. Type the following command in the MATLAB® command window to open the model:
>> serdesDesigner('rx_ctle_adapt_dfe_train.mat')
This project contains a receiver section with two CTLE blocks followed by a DFECDR block. In their default configuration, these blocks optimize individually. The goal of this example is to optimize the blocks as a system.
For the CTLE_LowFreq
block, the Peaking frequency (GHz) is set to [10 11 12 13 14 15 16]
, the DC gain (dB) is set to [0 0 0 0 0 0 0]
, and the Peaking gain (dB) is set to 0
. All other parameters are kept at their default values.
For the CTLE_HighFreq
block, the Specification is set to DC Gain and AC Gain
, the Peaking frequency (GHz) is set to 14
, the DC gain (dB) is set to 0
, and the AC gain (dB) is set to [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
. All other parameters are kept at their default values.
For the DFECDR block, the Initial tap weights (V) is set to [0 0 0 0 0 0 0 0 0 0]
. All other parameters are kept at their default values.
Export the SerDes system to a Simulink® model.
Add Code to Optimize CTLEs and DFECDR as System
Double click the Init subsystem inside the Rx block and click on the Show Init button. You can place code in the Custom user code area from the following steps and save the model. The code is broken down below in several subsections for easy comprehension.
Note: To complete the example, you can also reference the attached file 'rx_init_custom_user_code.m'
and place in the Custom user code area inside the Init subsystem. For more information about Init subsystem, see Statistical Analysis in SerDes Systems.
Initialize Receiver Parameters
The first section of the Custom user code area checks if both CTLEs are in adapt mode and instantiating variables to hold temporary values and the best configuration metrics.
%% BEGIN: Custom user code area (retained when 'Refresh Init' button is pressed) % If both CTLEs are in Adapt mode, use global adaptation if CTLE_LowFreqParameter.Mode == 2 && CTLE_HighFreqParameter.Mode == 2 CTLE_LowFreqInitBestConfig = 0; CTLE_HighFreqInitBestConfig = 0; bestMetric = 0; SPB = SymbolTime/SampleInterval;
Sweep CTLE Parameters
The example code sets the CTLE.Mode parameter from adapt
to fixed
to allow algorithmic control of the values for each block. In this case the values are directly swept and the blocks are called to process the impulse response.
CTLE_LowFreqInit.Mode = 1; CTLE_HighFreqInit.Mode = 1; for CTLE_LowFreqInitSweep = 0:1:6 for CTLE_HighFreqInitSweep = 0:1:15 % Set current sweep configs on each CTLE CTLE_LowFreqInit.ConfigSelect = CTLE_LowFreqInitSweep; CTLE_HighFreqInit.ConfigSelect = CTLE_HighFreqInitSweep; % Call CTLEs and DFE [sweepImpulse, ~] = CTLE_LowFreqInit(LocalImpulse); [sweepImpulse, ~] = CTLE_HighFreqInit(sweepImpulse); [sweepImpulse, ~, ~, ~, ~] = DFECDRInit(sweepImpulse);
Convert Impulse Response to Pulse Response and Evaluate with optPulseMetric
Convert the impulse response to a pulse response for evaluation by the function optPulseMetric
. A pulse response lends itself to metrics-based evaluation more readily than an impulse response. The optPulseMetric
function is used to optimize the SerDes system as a whole. Many metrics are reported by this function and you can use an algorithm to evaluate multiple receiver components together as a system.
Note: The function optPulseMetric
is designed to analyze a single response, not a matrix of responses, so you can use sweepPulse(:,1)
to trim the main response from an impulse matrix or pulse matrix.
% Convert impulse after DFE to pulse then calculate eye metrics sweepPulse = impulse2pulse(sweepImpulse,SPB,SampleInterval); eyeMetric = optPulseMetric(sweepPulse(:,1),SPB,SampleInterval,1e-6); % Select eye metric to evaluate results sweepMetric = eyeMetric.maxMeanEyeHeight; % sweepMetric = eyeMetric.maxEyeHeight; % sweepMetric = eyeMetric.maxCOM; % sweepMetric = eyeMetric.centerMeanEyeHeight; % sweepMetric = eyeMetric.centerEyeHeight; % sweepMetric = eyeMetric.centerCOM;
Evaluate optPulseMetric Results
Save the CTLE configurations based on comparison to previous results. The final best configurations are saved on the blocks for a final statistical (Init) analysis and then passed to time-domain (GetWave) simulation.
% If current sweep metric is better than previous, save the CTLE configs if sweepMetric > bestMetric bestMetric = sweepMetric; CTLE_LowFreqInitBestConfig = CTLE_LowFreqInitSweep; CTLE_HighFreqInitBestConfig = CTLE_HighFreqInitSweep; end end end % Set CTLEs to best configs from sweep CTLE_LowFreqInit.ConfigSelect = CTLE_LowFreqInitBestConfig; CTLE_HighFreqInit.ConfigSelect = CTLE_HighFreqInitBestConfig; end % END: Custom user code area (retained when 'Refresh Init' button is pressed)
Run SerDes System
Run the SerDes system and observe the optimizing behavior. You can try changing which metric is evaluated to perform different optimizations.
See Also
optPulseMetric | DFECDR | CTLE