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
, andInfo
.Type:
Float
,Integer
,UI Boolean
, andString
.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.
Type | Syntax | Example |
---|---|---|
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 Name | Description | Parameter Source | Example |
---|---|---|---|
Tx_DCD | Transmitter duty cycle distortion | serdes.internal.ibisami.ami.parameter.jitterandnoise.TxDCD |
txDCDParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxDCD; addReservedParameter(TxTree, txDCDParam); |
Tx_Dj | Transmitter deterministic jitter | serdes.internal.ibisami.ami.parameter.jitterandnoise.TxDj |
txDjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxDj; addReservedParameter(TxTree, txDjParam); |
Tx_Rj | Transmitter random jitter | serdes.internal.ibisami.ami.parameter.jitterandnoise.TxRj |
txRjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxRj; addReservedParameter(TxTree, txRjParam); |
Tx_Sj | Transmitter sinusoidal jitter | serdes.internal.ibisami.ami.parameter.jitterandnoise.TxSj |
txSjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxSj; addReservedParameter(TxTree, txSjParam); |
Tx_Sj_Frequency | Transmitter sinusoidal jitter frequency | serdes.internal.ibisami.ami.parameter.jitterandnoise.TxSjFrequency |
txSjFreqParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.TxSjFrequency; addReservedParameter(TxTree, txSjFreqParam); |
Ts4file | 4-port on-die S-parameter | serdes.internal.ibisami.ami.parameter.analog_buffer_model.Ts4file |
txTs4Param = serdes.internal.ibisami.ami.parameter.analog_buffer_model.Ts4file; addReservedParameter(TxTree, txTs4Param); |
Tx_R | On-die S-parameter transmitter resistance | serdes.internal.ibisami.ami.parameter.analog_buffer_model.Tx_R |
txTxRParam = serdes.internal.ibisami.ami.parameter.analog_buffer_model.Tx_R; addReservedParameter(TxTree, txTxRParam); |
DLL_ID | AMI debug | serdes.internal.ibisami.ami.parameter.datamanagement.DllID |
txDLLParam = serdes.internal.ibisami.ami.parameter.datamanagement.DllID; addReservedParameter(TxTree, txDLLParam); |
txMessage | Custom output message by transmitter | serdes.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 Name | Example |
---|---|
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
, andInfo
.Type:
Float
,Integer
,UI Boolean
, andString
.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.
Type | Syntax | Example |
---|---|---|
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 Name | Description | Parameter Source | Example |
---|---|---|---|
Rx_DCD | Receiver duty cycle distortion | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxDCD |
RxDCDParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxDCD; addReservedParameter(RxTree, RxDCDParam); |
Rx_Dj | Receiver deterministic jitter | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxDj |
RxDjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxDj; addReservedParameter(RxTree, RxDjParam); |
Rx_Rj | Receiver random jitter | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxRj |
RxRjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxRj; addReservedParameter(RxTree, RxRjParam); |
Rx_Sj | Receiver sinusoildal jitter | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxSj |
RxSjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxSj; addReservedParameter(RxTree, RxSjParam); |
Rx_Clock_Recovery_Mean | Mean offset in statistical clock location | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryMean |
RxCRmeanParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryMean; addReservedParameter(RxTree, RxCRmeanParam); |
Rx_Clock_Recovery_Rj | Random jitter in statistical clock | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryRj |
RxCRrjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryRj; addReservedParameter(RxTree, RxCRrjParam); |
Rx_Clock_Recovery_Dj | Deterministic jitter in statistical clock | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryDj |
RxCRdjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryDj; addReservedParameter(RxTree, RxCRdjParam); |
Rx_Clock_Recovery_Sj | Sinusoidal jitter in statistical clock | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoverySj |
RxCRsjParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoverySj; addReservedParameter(RxTree, RxCRsjParam); |
Rx_Clock_Recovery_DCD | Duty cycle distortion in statistical clock | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryDCD |
RxCRdcdParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxClockRecoveryDCD; addReservedParameter(RxTree, RxCRdcdParam); |
Rx_Receiver_Sensitivity | Input slicer voltage threshold | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxReceiverSensitivity |
RxRecSenParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxReceiverSensitivity; addReservedParameter(RxTree, RxRecSenParam); |
Rx_GaussianNoise | Gaussian noise at receiver | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxGaussianNoise |
RxGausNoiseParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxGaussianNoise; addReservedParameter(RxTree, RxGausNoiseParam); |
Rx_UniformNoise | Deterministic noise at receiver | serdes.internal.ibisami.ami.parameter.jitterandnoise.RxUniformNoise |
RxUnifNoiseParam = serdes.internal.ibisami.ami.parameter.jitterandnoise.RxUniformNoise; addReservedParameter(RxTree, RxUnifNoiseParam); |
Ts4file | 4-port on-die S-parameter | serdes.internal.ibisami.ami.parameter.analog_buffer_model.Ts4file |
RxTs4Param = serdes.internal.ibisami.ami.parameter.analog_buffer_model.Ts4file; addReservedParameter(RxTree, RxTs4Param); |
Rx_R | On-die S-parameter receiver resistance | serdes.internal.ibisami.ami.parameter.analog_buffer_model.Rx_R |
RxRxRParam = serdes.internal.ibisami.ami.parameter.analog_buffer_model.Rx_R; addReservedParameter(RxTree, RxRxRParam); |
DLL_ID | AMI debug | serdes.internal.ibisami.ami.parameter.datamanagement.DllID |
RxDLLParam = serdes.internal.ibisami.ami.parameter.datamanagement.DllID; addReservedParameter(RxTree, RxDLLParam); |
Rx_Use_Clock_Input | Use external clock | serdes.internal.ibisami.ami.parameter.clockforwarding.Rx_Use_Clock_Input |
RxUseClkParam = serdes.internal.ibisami.ami.parameter.clockforwarding.Rx_Use_Clock_Input; addReservedParameter(RxTree, RxUseClkParam); |
DC_Offset | Single-ended DC offset from EDA tool | serdes.internal.ibisami.ami.parameter.dc_offset.DC_Offset |
RxDCOParam = serdes.internal.ibisami.ami.parameter.dc_offset.DC_Offset; addReservedParameter(RxTree, RxDCOParam); |
Rx_Decision_Time | Statistical clock location output to EDA tool | serdes.internal.ibisami.ami.parameter.rxdecisiontime.Rx_Decision_Time |
RxDTParam = serdes.internal.ibisami.ami.parameter.rxdecisiontime.Rx_Decision_Time addReservedParameter(RxTree, RxDTParam); |
RxMessage | Custom output message by receiver | serdes.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 Name | Example |
---|---|
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)