Main Content

Programmatically Access IBIS-AMI Parameter Manager

You can use MATLAB® scripts to control the IBIS-AMI parameters in Simulink® models from the command window. This allows you to programmatically:

  • Add new AMI parameters to the datapath blocks.

  • Enable IBIS-AMI reserved parameters.

  • Set the value of most reserved parameters.

  • Set the value of most model-specific datapath block parameters.

  • Set selected simulation parameters such as Ignore Bits.

  • Run simulations while iteratively changing the AMI parameter values.

The parameter settings on the Export tab of the SerDes IBIS-AMI Manager dialog box do not support scripting. You need to change them manually.

The contents of the IBIS tab shows the state of the IBIS files. This information is read-only.

You can only change the parameters in the AMI-Tx and AMI-Rx tabs using scripts.

Setup

Before you can access the IBIS-AMI parameters in the SerDes IBIS-AMI Manager dialog box, you need to retrieve variables from the model workspace to base workspace.

%% Get Model Workspace Parameters
mdl = bdroot;
mws = get_param(mdl,'ModelWorkspace');
TxTree = mws.getVariable('TxTree');
RxTree = mws.getVariable('RxTree');

AMI-Tx Tab

The parameters in the AMI-Tx tab are organized in a Tx tree. You can edit both model-specific and reserved parameters.

Add New Model-Specific Parameter

You can add new model-specific parameters to the Tx tree. It is a two-step process:

  • Create and define the desired parameter.

  • Add the new parameter to the Tx tree.

%% Create New Parameter
<New Param Name> = serdes.internal.ibisami.ami.parameter.SerDesModelSpecificParameter( ...
    'Name', '<parameter_name>', ...
    'Description', '<parameter_description>', ...
    'Usage', '<In | Out | InOut | Info>', ...
    'Type', '<Float | Integer | UI | Boolean | String>', ...
    'Format', "<Value <values> | List <List Values> | Range <Range values>>", ...
    'CurrentValue',<Value>);
%% Add Parameter to the desired datapath block in the Tx Tree
TxTree.addAmiParameterToBlock(<Block Name>, <New Param Name>)

For example, you can add a new parameter named ConfigSelect in the FFE block.

newParam = serdes.internal.ibisami.ami.parameter.SerDesModelSpecificParameter( ...
    'Name', ‘ConfigSelect’, ...
    'Description', 'Select the desired configuration’, ...
    'Usage', 'In', ...
    'Type', 'Integer', ...
    'Format', "List 2 0 1", ...
    'CurrentValue',1);
TxTree.addAmiParameterToBlock('FFE', newParam)

Note

You must refresh the Init code by clicking the Refresh Init button when you add a new parameter.

Edit Model-Specific Parameter Values

You can edit the values of selected existing model-specific parameters in the Tx tree. These parameters are:

  • Current value.

  • Description.

  • Usage: In, Out, InOut, and Info.

  • Type: Float, Integer, UI Boolean, and String.

  • If Format is set to Value, you can edit Value.

    If Format is set to List, you can edit Default, List values, and List_tip values.

    If Format is set to Range, you can define Typ, Min, and Max values.

TypeSyntaxExample
Current parameter value
TxTree.setCurrentValue(<Block Name>, <Parameter Name>, <Value>)
TxTree.setCurrentValue('FFE', 'Mode', 0)
Description
TxTree.getParameterFromBlock(<Block Name>, <Parameter Name>).Description = <New Description>
TxTree.getParameterFromBlock('FFE','ConfigSelect').Description = ‘My New Description’
Usage
TxTree.getParameterFromBlock(<Block Name>, <Parameter Name>).Usage = <Usage>
TxTree.getParameterFromBlock('FFE','ConfigSelect').Usage = ‘InOut’
Type
TxTree.getParameterFromBlock(<Block Name>, <Parameter Name>).Type = <Type>
TxTree.getParameterFromBlock('FFE','ConfigSelect').Type = ‘Float’
Format
TxTree.getParameterFromBlock(<Block Name>, <Parameter Name>).Format.Values = <NewValues>
TxTree.getParameterFromBlock('FFE','SelectConfig').Format.Values = ["0" "1" "2"]
Tap weights
TxTree.addOrUpdateTapsOfBlock(<Block Name>, <Array of tap weights>)
TxTree.addOrUpdateTapsOfBlock('FFE', [-0.1 0.6 -0.1 -0.1])
Hide AMI parameter
TxTree.hideParameterOfBlock('<Block_Name>', <Parameter Name> , <true | false>)
TxTree.hideParameterOfBlock(‘FFE’, ‘newParam', true)

Enable Reserved Parameters

You can add reserved parameters to the Tx tree from available AMI parameter sources. It is a two step process:

  • Create the desired parameter:

    <txParamName> = <Tx Parameter Source>

  • Add the parameter to the Tx tree:

    addReservedParameter(TxTree, <txParamName>)

Available reserved Tx AMI parameter sources are:

Parameter NameDescriptionParameter SourceExample
Tx_DCDTransmitter duty cycle distortionserdes.internal.ibisami.ami.parameter.jitterandnoise.TxDCD
txDCDParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxDCD;
addReservedParameter(TxTree, txDCDParam);
Tx_DjTransmitter deterministic jitterserdes.internal.ibisami.ami.parameter.jitterandnoise.TxDj
txDjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxDj;
addReservedParameter(TxTree, txDjParam);
Tx_RjTransmitter random jitterserdes.internal.ibisami.ami.parameter.jitterandnoise.TxRj
txRjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxRj;
addReservedParameter(TxTree, txRjParam);
Tx_SjTransmitter sinusoidal jitterserdes.internal.ibisami.ami.parameter.jitterandnoise.TxSj
txSjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxSj;
addReservedParameter(TxTree, txSjParam);
Tx_Sj_FrequencyTransmitter sinusoidal jitter frequencyserdes.internal.ibisami.ami.parameter.jitterandnoise.TxSjFrequency
txSjFreqParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxSjFrequency;
addReservedParameter(TxTree, txSjFreqParam);
Ts4file4-port on-die S-parameterserdes.internal.ibisami.ami.parameter.analog_buffer_model.Ts4file
txTs4Param = serdes.internal.ibisami.ami.parameter.analog_buffer_model.Ts4file;
addReservedParameter(TxTree, txTs4Param);
Tx_ROn-die S-parameter transmitter resistanceserdes.internal.ibisami.ami.parameter.analog_buffer_model.Tx_R
txTxRParam = serdes.internal.ibisami.ami.parameter.analog_buffer_model.Tx_R;
addReservedParameter(TxTree, txTxRParam);
DLL_IDAMI debugserdes.internal.ibisami.ami.parameter.datamanagement.DllID
txDLLParam = serdes.internal.ibisami.ami.parameter.datamanagement.DllID;
addReservedParameter(TxTree, txDLLParam);
txMessageCustom output message by transmitterserdes.internal.ibisami.ami.parameter.txmessage.txMessage
txTxMessParam = serdes.internal.ibisami.ami.parameter.txmessage.txMessage;
addReservedParameter(TxTree, txTxMessParam);

Note

You must refresh the Init code by clicking the Refresh Init button when you add a new parameter.

Set Reserved Parameter Values

Once you add all the desired reserved AMI parameters to the Tx tree, you can set the values of selected parameters using the command:

TxTree.setReservedParameterCurrentValue(‘<Target Parameter>’, <Value>)

Parameter NameExample
Max_Init_Aggressors
TxTree.setReservedParameterCurrentValue('Max_Init_Aggressors', 8)
Ignore_Bits
TxTree.setReservedParameterCurrentValue('Ignore_Bits', 35)
Tx_DCD
TxTree.setReservedParameterCurrentValue('Tx_DCD', 0.1)
Tx_Dj
TxTree.setReservedParameterCurrentValue('Tx_Dj', 0.02)
Tx_Rj
TxTree.setReservedParameterCurrentValue('Tx_Rj', 0.003)
Tx_Sj
TxTree.setReservedParameterCurrentValue('Tx_Sj', 0.004)
Tx_Sj_Frequency
TxTree.setReservedParameterCurrentValue('Tx_Sj_Frequency', 50e6)

Note

Some reserved parameters are hard-coded or automatically set based on other selections. You cannot edit their values.

AMI-Rx Tab

The parameters in the AMI-Rx tab are organized in a Rx tree. You can edit both model-specific and reserved parameters.

Add New Model-Specific Parameter

You can add new model-specific parameters to the Rx tree. It is a two-step process:

  • Create and define the desired parameter.

  • Add the new parameter to the Rx tree.

%% Create New Parameter
<New Param Name> = serdes.internal.ibisami.ami.parameter.SerDesModelSpecificParameter( ...
    'Name', '<parameter_name>', ...
    'Description', '<parameter_description>', ...
    'Usage', '<In | Out | InOut | Info>', ...
    'Type', '<Float | Integer | UI | Boolean | String>', ...
    'Format', "<Value <values> | List <List Values> | Range <Range values>>", ...
    'CurrentValue',<Value>);
%% Add Parameter to the desired datapath block in the Rx Tree
RxTree.addAmiParameterToBlock(<Block Name>, <New Param Name>)

For example, you can add a new parameter named RangeSelect in the CTLE block.

newParam = serdes.internal.ibisami.ami.parameter.SerDesModelSpecificParameter( ...
    'Name', 'RangeSelect, ...
    'Description', 'Select the desired range of operation', ...
    'Usage', 'In', ...
    'Type', 'Integer', ...
    'Format', "List 2 0 1", ...
    'CurrentValue',1);
RxTree.addAmiParameterToBlock('CTLE', newParam)

Note

You must refresh the Init code by clicking the Refresh Init button when you add a new parameter.

Edit Model-Specific Parameter Values

You can edit the selected user defined parameter values of existing model-specific parameters in the Rx tree. They are:

  • Current value.

  • Description.

  • Usage: In, Out, InOut, and Info.

  • Type: Float, Integer, UI Boolean, and String.

  • If Format is set to Value, you can edit Value.

    If Format is set to List, you can edit Default, List values, and List_tip values.

    If Format is set to Range, you can define Typ, Min, and Max values.

TypeSyntaxExample
Current parameter value
RxTree.setCurrentValue(<Block Name>, <Parameter Name>, <Value>)
RxTree.setCurrentValue('AGC', 'Mode', 0)
Description
RxTree.getParameterFromBlock(<Block Name>, <Parameter Name>).Description = <New Description>
RxTree.getParameterFromBlock('CTLE','ConfigSelect').Description = ‘My New Description’
Usage
RxTree.getParameterFromBlock(<Block Name>, <Parameter Name>).Usage = <Usage>
RxTree.getParameterFromBlock('CTLE','ConfigSelect').Usage = ‘InOut’
Type
RxTree.getParameterFromBlock(<Block Name>, <Parameter Name>).Type = <Type>
RxTree.getParameterFromBlock('CTLE','ConfigSelect').Type = ‘Float’
Format
RxTree.getParameterFromBlock(<Block Name>, <Parameter Name>).Format.Values = <NewValues>
RxTree.getParameterFromBlock('CTLE','SelectConfig').Format.Values = ["0" "1" "2"]
Tap weights
RxTree.addOrUpdateTapsOfBlock(<Block Name>, <Array of tap weights>)
RxTree.addOrUpdateTapsOfBlock('CTLE', [-0.1 0.6 -0.1 -0.1])
Hide AMI Parameter
RxTree.hideParameterOfBlock('<Block_Name>', <Parameter Name> , <true | false>)
RxTree.hideParameterOfBlock(‘CTLE’, ‘newParam', true)

Enable Reserved Parameters

You can add reserved parameters to the Rx tree from available AMI parameter sources. It is a two-step process:

  • Create the desired parameter:

    <rxParamName> = <Rx Parameter Source>

  • Add the parameter to the Rx tree:

    addReservedParameter(rxTree, <rxParamName>)

Available reserved Rx AMI parameter sources are:

Parameter NameDescriptionParameter SourceExample
Rx_DCDReceiver duty cycle distortionserdes.internal.ibisami.ami.parameter.jitterandnoise.RxDCD
RxDCDParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxDCD;
addReservedParameter(RxTree, RxDCDParam);
Rx_DjReceiver deterministic jitterserdes.internal.ibisami.ami.parameter.jitterandnoise.RxDj
RxDjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxDj;
addReservedParameter(RxTree, RxDjParam);
Rx_RjReceiver random jitterserdes.internal.ibisami.ami.parameter.jitterandnoise.RxRj
RxRjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxRj;
addReservedParameter(RxTree, RxRjParam);
Rx_SjReceiver sinusoildal jitterserdes.internal.ibisami.ami.parameter.jitterandnoise.RxSj
RxSjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxSj;
addReservedParameter(RxTree, RxSjParam);
Rx_Clock_Recovery_MeanMean offset in statistical clock locationserdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryMean
RxCRmeanParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryMean;
addReservedParameter(RxTree, RxCRmeanParam);
Rx_Clock_Recovery_RjRandom jitter in statistical clockserdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryRj
RxCRrjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryRj;
addReservedParameter(RxTree, RxCRrjParam);
Rx_Clock_Recovery_DjDeterministic jitter in statistical clockserdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryDj
RxCRdjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryDj;
addReservedParameter(RxTree, RxCRdjParam);
Rx_Clock_Recovery_SjSinusoidal jitter in statistical clockserdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoverySj
RxCRsjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoverySj;
addReservedParameter(RxTree, RxCRsjParam);
Rx_Clock_Recovery_DCDDuty cycle distortion in statistical clockserdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryDCD
RxCRdcdParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryDCD;
addReservedParameter(RxTree, RxCRdcdParam);
Rx_Receiver_SensitivityInput slicer voltage thresholdserdes.internal.ibisami.ami.parameter.jitterandnoise.RxReceiverSensitivity
RxRecSenParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxReceiverSensitivity;
addReservedParameter(RxTree, RxRecSenParam);
Rx_GaussianNoiseGaussian noise at receiverserdes.internal.ibisami.ami.parameter.jitterandnoise.RxGaussianNoise
RxGausNoiseParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxGaussianNoise;
addReservedParameter(RxTree, RxGausNoiseParam);
Rx_UniformNoiseDeterministic noise at receiverserdes.internal.ibisami.ami.parameter.jitterandnoise.RxUniformNoise
RxUnifNoiseParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxUniformNoise;
addReservedParameter(RxTree,  RxUnifNoiseParam);
Ts4file4-port on-die S-parameterserdes.internal.ibisami.ami.parameter.analog_buffer_model.Ts4file
RxTs4Param = serdes.internal.ibisami.ami.parameter.analog_buffer_model.Ts4file;
addReservedParameter(RxTree, RxTs4Param);
Rx_ROn-die S-parameter receiver resistanceserdes.internal.ibisami.ami.parameter.analog_buffer_model.Rx_R
RxRxRParam = serdes.internal.ibisami.ami.parameter.analog_buffer_model.Rx_R;
addReservedParameter(RxTree, RxRxRParam);
DLL_IDAMI debugserdes.internal.ibisami.ami.parameter.datamanagement.DllID
RxDLLParam = serdes.internal.ibisami.ami.parameter.datamanagement.DllID;
addReservedParameter(RxTree, RxDLLParam);
Rx_Use_Clock_InputUse external clockserdes.internal.ibisami.ami.parameter.clockforwarding.Rx_Use_Clock_Input
RxUseClkParam = serdes.internal.ibisami.ami.parameter.clockforwarding.Rx_Use_Clock_Input;
addReservedParameter(RxTree, RxUseClkParam);
DC_OffsetSingle-ended DC offset from EDA toolserdes.internal.ibisami.ami.parameter.dc_offset.DC_Offset
RxDCOParam = serdes.internal.ibisami.ami.parameter.dc_offset.DC_Offset;
addReservedParameter(RxTree, RxDCOParam);
Rx_Decision_TimeStatistical clock location output to EDA toolserdes.internal.ibisami.ami.parameter.rxdecisiontime.Rx_Decision_Time
RxDTParam = serdes.internal.ibisami.ami.parameter.rxdecisiontime.Rx_Decision_Time
addReservedParameter(RxTree, RxDTParam);
RxMessageCustom output message by receiverserdes.internal.ibisami.ami.parameter.rxmessage.rxMessage
rxRxMessParam = serdes.internal.ibisami.ami.parameter.rxmessage.rxMessage;
addReservedParameter(RxTree, rxRxMessParam);

Note

You must refresh the Init code by clicking the Refresh Init button when you add a new parameter.

Set Reserved Parameter Values

Once you add all the desired reserved AMI parameters to the Rx tree, you can set their values using the syntax:

RxTree.setReservedParameterCurrentValue(‘<Target Parameter>’, <Value>)

Parameter NameExample
Max_Init_Aggressors
RxTree.setReservedParameterCurrentValue('Max_Init_Aggressors', 8)
Ignore_Bits
RxTree.setReservedParameterCurrentValue('Ignore_Bits', 35)
Rx_DCD
RxTree.setReservedParameterCurrentValue('Rx_DCD', 0.1)
Rx_Dj
RxTree.setReservedParameterCurrentValue('Rx_Dj', 0.02)
Rx_Rj
RxTree.setReservedParameterCurrentValue('Rx_Rj', 0.003)
Rx_Sj
RxTree.setReservedParameterCurrentValue('Rx_Sj', 0.004)
Rx_Sj_Frequency
RxTree.setReservedParameterCurrentValue('Rx_Sj_Frequency', 50e6)

Note

Some reserved parameters are hard-coded or automatically set based on other selections. You cannot edit their values.

Example Scripts

Update Results of SerDes Model While Iteratively Changing Deterministic Jitter

Consider you have an existing SerDes model open where the Tx_Dj parameter already present in the AMI tree. You can change the value of the Tx_Dj parameter first to 0, then to 0.1, and then display the results.

First, retrieve the variables from the model workspace to base workspace.

% Fetch data for IBIS-AMI Manager
mdl = bdroot;
mws = get_param(mdl,'ModelWorkspace');
TxTree = mws.getVariable('TxTree');

Then, set the transmitter deterministic jitter value to 0 and run simulation.

% Set value of Tx_Dj to zero
TxTree.setReservedParameterCurrentValue('Tx_Dj', 0.0)

% Run simulation
simout = sim(mdl);

% Get simulation results
results = mws.getVariable('SerDesResults');
StatEyeHeight = results.Statistical.summary{1,2};

Change the value of the deterministic jitter. Rerun simulation.

% Change value of Tx_Dj
TxTree.setReservedParameterCurrentValue('Tx_Dj', 0.1)

% Run simulation again
simout = sim(mdl);

% Get new simulation results
newresults = mws.getVariable('SerDesResults');
newStatEyeHeight = newresults.Statistical.summary{1,2};

Display and compare the results of the two simulations.

% Output results
fprintf('Original Statistical Eye Height: %0.2f\n', StatEyeHeight)
fprintf('New Statistical Eye Height: %0.2f\n', newStatEyeHeight)

Update Results of SerDes Model While Iteratively Changing FFE Tap Weights

Consider you have an existing SerDes model open with an FFE block with four taps. You can change the value of the FFE tap weights first to [0, 1, 0 , 0], then to [-0.1, 0.8, -0.1 , 0], and then display the results.

First, retrieve the variables from the model workspace to base workspace.

% Fetch data for IBIS-AMI Manager
mdl = bdroot;
mws = get_param(mdl,'ModelWorkspace');
TxTree = mws.getVariable('TxTree');

Set the FFE tap weight values to [0, 1, 0 , 0] and run simulation.

% Set value of Tx FFE taps to default
TxTree.addOrUpdateTapsOfBlock('FFE', [0.0 1.0 0.0 0.0])

% Run simulation
simout = sim(mdl);

% Get simulation results
results = mws.getVariable('SerDesResults');
StatEyeWidth = results.Statistical.summary{2,2};

Change the FFE tap weight values to [-0.1, 0.8, -0.1 , 0]. Rerun simulation.

% Change value of Tx FFE taps
TxTree.addOrUpdateTapsOfBlock('FFE', [-0.1 0.8 -0.1 0.0])

% Run simulation again
simout = sim(mdl);

% Get new simulation results
newresults = mws.getVariable('SerDesResults');
newStatEyeWidth = newresults.Statistical.summary{2,2};

Display and compare the results of the two simulations.

% Output results
fprintf('Original Statistical Eye Width: %0.2f ps\n', StatEyeWidth)
fprintf('New Statistical Eye Width: %0.2f ps\n', newStatEyeWidth)

See Also

Topics