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).
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:
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.
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.
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.
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.
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;
The example code sets the CTLE.Mode parameter from
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 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;
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 the SerDes system and observe the optimizing behavior. You can try changing which metric is evaluated to perform different optimizations.