fxpopt workflow allows user to automatically assign fixed-point data types
on a system by trying a basic trial and error loop. In the context of fxpopt
trial and error is based on the concept of behavioral constraint that the user
can utilize to declare a sense of "acceptable behavior" of the system.
Currently fxpopt offers two main ways to declare behavioral constraints:
1. Tolerance based simulation comparisons to a golden reference state of
2. Simulation based assertion checks
The first method can be leveraged using the addTolerance API that is part of the
fxpopt workflow. This will allow users to declare an envelope of passing behavior
that will be defined compared to the original state of the model. For example if
a user declares a tolerance of absolute tolerance of 1 then an acceptable behavior
will be +- 1 compared to the initial state of the model.
Secondly, a user might utilize any of the Model Verification library blocks to author
different verification expressions. Once placed in the model and active, the model
verification blocks will be interpreted as behavioral constraints by the fxpopt infrastructure
and hence they will be included in the behavioral constraints set.
fxpopt workflow will not process if none of the above methods are used for behavioral constraints.
One may use a combination of the two.
In order to author SNR or other custom metrics, one may choose the second route of authoring
behavioral constraints, utilizing model verification blocks. By doing so we can create a
"measurement system" that calculates SNR as a signal within Simulink and we can safeguard
for its values with the use of a static range check block during the simulation. If the values
that are being calculated during simulation are outside the bounds that are acceptable, fxpopt will
understand that the model is not passing the behavioral constraints.
In the attached two examples we see different ways of approaching this using different method of
calculating either an approximation to "noise floor" and guarding against an increase of values there
or calculating SNR difference between the original model VS the quantized one. In both cases the second way of declaring behavioral constraints is used.
Helpful links
addTolerance API: https://www.mathworks.com/help/fixedpoint/ref/fxpoptimizationoptions.addtolerance.html
Model Verification library in Simulink:
I hope this is helpful