INL
INL is an abbreviation for Integral Non Linearity. It is a measure of the deviation between the measured analog value and the ideal analog value for any digital code. INL spec is taken as the maximum of all individual deviations for all codes.This report shows some good graphs to understand INL.
Cadence
The INL for a DAC which can be simulated through its range using a DC Sweep can be calculated using simple DC sweep simulation and using a simple formula in Cadence Calculator. Here is the procedure to do that:- Create a test bench with the DAC with all sources with DC values so that the DC simulation can power up.
- The input to the DAC can be given by a ADC created using verilog AMS. The following code can be used to create a ADC that can simulate in a DC simulation:
-
- Now connect the output digital bus of this ADC symbol to the DAC input.
- The input of the ADC is connected to a voltage source whose DC voltage is set to a variable like "vin"
- The parameters of the ADC should be set as follows:
- vlogic_high - Set to the logic high level of the bus
- vlogic_low - Set to the logic low level of the bus
- vref - This is the most important parameter for correct simulation. Calculate it as follows. If the LSB for this ADC you want to set as L then the vref = L*2^(NUM_ADC_BITS). So for example for an LSB of 5mV for an 8 bit ADC the vref should be set to 1.28V
- Now run a DC sweep simulation where you sweep the "vin" variable from a value less than L with a step of L all the way to vref
- Since we step with L ever DC sweep evaluation point will generate a new code and hence a new output from the DAC. So the DAC output will look like a perfectly straight line with a a constant slope.
- The formula for INL is
-
$$INL = {ymax(abs({\text"output range"}/{\text"vin range for the output range"}*IN-OUT))}/{LSB}$$
- "vin range for output range" can be calculated as vinstep * (2^bits-1)
-
- Now use this formula (displayed with brackets to allow entry into Cadence measurement to calculate the +ve and -ve INL and the absolute
-
$INL_+=(ymax((\text'VS("/vin")'-\text'VAR("offset")')*(ymax(\text'VS("/OUT")')-ymin(\text'VS("/OUT")'))/(\text'VAR("vinstep")'*(2^{bits}-1)))+ymin(\text'VS("/OUT")')-\text'VS("/OUT")')/\text'VAR("LSB")'$
-
$INL_-=(ymin((\text'VS("/vin")'-\text'VAR("offset")')*(ymax(\text'VS("/OUT")')-ymin(\text'VS("/OUT")'))/(\text'VAR("vinstep")'*(2^{bits}-1)))+ymin(\text'VS("/OUT")')-\text'VS("/OUT")')/\text'VAR("LSB")'$
-
$INL_+=(ymax(abs((\text'VS("/vin")'-\text'VAR("offset")')*(ymax(\text'VS("/OUT")')-ymin(\text'VS("/OUT")'))/(\text'VAR("vinstep")'*(2^{bits}-1))))+ymin(\text'VS("/OUT")')-\text'VS("/OUT")')/\text'VAR("LSB")'$
- Here LSB is the output voltage LSB value.
- vinstep is L described above
- offset is the initial vin voltage before stepping is started i.e. all 0 input.
- You may have to clip VS("/OUT") if the sweep in vin exceeds the DAC input rance and you may have to clip deriv(VS("/OUT")) to remove the 1st point. It can be clipped from offset+vinstep to (2^bits-1)*vinstep+offset. Where offset it the sweep starting value (less than L)
-
For a DAC if the output at 0 code (all 0) is 0 then LSB = Vo/(2^bits-1) where Vo is the full scale output (at all 1s)
For a DAC if the output at 0 code (all 0) is 1 Vi then LSB = (Vo-Vi)/(2^bits-1). If Vi = 1 LSB then this is equivalent to LSB = Vo/(2^bits)