Design it, then break it: a DAC output buffer

Design a two-stage op-amp buffer for the E8.3 DAC to a settling, accuracy and offset spec, sign it off across corners and temperature, then inject faults and write the bench lines that catch each one.

Lesson
E8.4
Time
45 min
Runs on
ngspice
Check
5 questions

A 6-bit DAC with a near-perfect ladder sent a new code every 100 ns. Its buffer, E6.4's OPA-B, had passed its DC tests: within 1 mV of its input from 0.6 V to 1.2 V. Yet the sample after a full-scale fall came out 155 mV low, 16.5 LSB.

TransientE6.4's OPA-B buffering a DAC from 0.6 V to 1.2 VCodes 0, 63, 0 and 32, one every 100 ns, into 2 pF. One LSB is 9.4 mV.
  • v(dac)
  • v(out)
0.3 V0.4 V0.5 V0.6 V0.7 V0.8 V0.9 V1.0 V1.1 V1.2 V1.3 VVoltage050 ns100 ns150 ns200 ns250 ns300 ns350 ns400 nsTime0.2 V0.4 V0.6 V0.8 V1.0 V1.2 V1.4 VVoltage0100 ns200 ns300 ns400 nsTime
  1. Time 199 nsv(dac) = 1.191 V · v(out) = 1.19 V

    End of code 63: the rise has settled, −0.43 mV off.

  2. Time 275 nsv(dac) = 600 mV · v(out) = 398 mV

    After the fall the output dives to 398 mV, far below the 600 mV it should reach.

  3. Time 299 nsv(dac) = 600 mV · v(out) = 445 mV

    The next sample: still 155 mV low.

Read the plot as a table
Timev(dac)v(out)
0 s600 mV599 mV
50 ns600 mV599 mV
100 ns600 mV599 mV
150 ns1.191 V1.195 V
199 ns1.191 V1.19 V
200 ns1.19 V1.19 V
250 ns599.4 mV659.3 mV
275 ns600 mV398 mV
299 ns600 mV445 mV
300 ns601.3 mV447.5 mV
350 ns900 mV901.4 mV
400 ns900 mV899.9 mV

Measured on ngspice 42, tt, 27 °C.

A buffer is signed off for the steps it must make in the time it is given, at every corner, and the bench must be able to fail.

The brief

This capstone has two halves. First you design a buffer to a spec and sign it off. Then you swap roles: faults are injected, and you write the bench lines that catch them.

ItemSpec
DACThe E8.3 ladder, 6 bits, 1.41 × 10 µm units, between references VL and VH that you choose
BufferOPA-B (E5.5) as a unity-gain follower, any sizing, its own 20 µA bias
Load2 pF
Settlingwithin ±½ LSB of the final level 70 ns after any code change (a 10 MHz update leaves 30 ns to sample)
DC errorwithin ±½ LSB at every code
Stabilityphase margin of at least 55°
Offset3σ of 20 Monte Carlo dies within 1 LSB
Whereall five FET corners at −40, 27 and 125 °C; then the least supply current

The reference design below meets every line; its numbers are measured, not targets.

The final design: OPA-B resizedAs a buffer, out connects to the − input and the ladder drives +.
The final design: OPA-B resizedVDD1.8 VIB20 µAMB8/1M332/2M432/2M120/2M220/2M58/1M6128/1M732/1Rz​5 kΩCc​1 pFCL​2 pF− inn+ inpout
Read the circuit as text
  • IB current source (20 µA): + → VDD, − → n1
  • MB NMOS transistor (8/1): gate → n1, drain → n1, source → 0
  • M3 PMOS transistor (32/2): gate → n2, source → VDD, drain → n2
  • M4 PMOS transistor (32/2): gate → n2, source → VDD, drain → n3
  • M1 NMOS transistor (20/2): gate → n4, drain → n2, source → n5
  • M2 NMOS transistor (20/2): gate → n6, drain → n3, source → n5
  • M5 NMOS transistor (8/1): gate → n1, drain → n5, source → 0
  • M6 PMOS transistor (128/1): gate → n3, source → VDD, drain → n7
  • M7 NMOS transistor (32/1): gate → n1, drain → n7, source → 0
  • R_z resistor (5 kΩ): pin 1 → n3, pin 2 → n8
  • C_c capacitor (1 pF): pin 1 → n8, pin 2 → n7
  • C_L capacitor (2 pF): pin 1 → n7, pin 2 → 0
  • − inn port: terminal → n4
  • + inp port: terminal → n6
  • out port: terminal → n7

W/L in µm. Bodies: NMOS to ground, PMOS to VDD. C_c = 1 pF and R_z = 5 kΩ, as E6.4 left them.

Where the input can go

An NMOS input pair needs room under it: the tail transistor M5 must stay saturated (E5.2 Common mode: rejection and the input range). Sweep the buffer's input and watch both its DC error and M5's current.

DC sweepE6.4's OPA-B as a buffer: error and tail current
  • v(out) − v(in)
  • tail current
-10 mV-5 mV05 mVDC error05 µA10 µA15 µA20 µA25 µAM5 current0.4 V0.6 V0.8 V1.0 V1.2 V1.4 V1.6 VInput-10 mV-5 mV05 mVDC error05 µA10 µA15 µA20 µA25 µAM5 current0.5 V1.0 V1.5 VInput
  1. Input 600 mVv(out) − v(in) = -950.5 µV · tail current = 4.42 µA

    At 0.6 V the error is only −0.95 mV, but M5 carries 4.4 µA of its 19.5 µA: the first stage is starved.

  2. Input 816.7 mVv(out) − v(in) = -160.9 µV · tail current = 17.59 µA

    The tail reaches 90 % of its 1.2 V current at 817 mV.

  3. Input 1.278 Vv(out) − v(in) = -3.125 mV · tail current = 19.66 µA

    At the top the error passes −½ LSB (of a 0.4 V range) at 1.278 V.

Read the plot as a table
Inputv(out) − v(in)tail current
400 mV-2.93 mV64.65 nA
600 mV-950.5 µV4.42 µA
800 mV-176.9 µV17.14 µA
816.7 mV-160.9 µV17.59 µA
1 V-142.5 µV19.11 µA
1.2 V-523.1 µV19.54 µA
1.278 V-3.125 mV19.66 µA
1.4 V-29.69 mV19.76 µA
1.6 V-153 mV19.79 µA

Measured on ngspice 42, tt, 27 °C.

DC says 0.6 V is fine; speed says it is not, because slew and bandwidth both need tail current. So the references move to VL = 0.8 V and VH = 1.2 V. One LSB becomes 6.25 mV and ½ LSB 3.125 mV.

Big steps slew, small steps settle

A big step drives the input pair fully to one side. The output then moves at a fixed slew rate set by currents, not by the loop (E5.6 Slew rate and output swing). Version 0, E6.4's OPA-B, falls at 11.2 V/µs: M7's 40.6 µA minus the 19.5 µA the first stage pushes through Cc, over 2 pF, gives 10.5 V/µs. It also undershoots by 116 mV before the loop takes control again.

TransientSettling error of versions 0 and 1, window 0.8 V to 1.2 V
  • version 0
  • version 1
  • v(dac)
-20 mV-10 mV010 mV20 mVv(out) − v(dac)0.7 V0.8 V0.9 V1.0 V1.1 V1.2 V1.3 VLadder0100 ns200 ns300 ns400 ns500 ns600 ns700 ns800 ns900 nsTime+½ LSB−½ LSB-20 mV-10 mV010 mV20 mVv(out) − v(dac)0.7 V0.8 V0.9 V1.0 V1.1 V1.2 V1.3 VLadder0200 ns400 ns600 ns800 nsTime+½ LSB−½ LSB
  1. Time 370 nsversion 0 = 2.127 mV · version 1 = -170.1 µV · v(dac) = 800.1 mV

    70 ns after the fall. Version 1 entered the band for good 30.9 ns after the step; version 0 leaves it for the last time at 80.7 ns.

  2. Time 710 nsversion 0 = -1.962 mV · version 1 = -1.011 mV · v(dac) = 856.3 mV

    The 1-code step starts 1 LSB away and is inside the band 7.5 ns (version 0) and 5.3 ns (version 1) after it.

Read the plot as a table
Timeversion 0version 1v(dac)
0 s-176.9 µV-187 µV800 mV
100 ns-176.9 µV-187 µV800 mV
200 ns-472.6 µV-524.2 µV1.194 V
300 ns1.261 mV1.198 mV1.192 V
370 ns2.127 mV-170.1 µV800.1 mV
400 ns-539.1 µV-186.9 µV800 mV
500 ns-935 µV-943.4 µV800.8 mV
600 ns-142.5 µV-152.3 µV850 mV
700 ns-202 µV-212.5 µV850.1 mV
710 ns-1.962 mV-1.011 mV856.3 mV
800 ns-139.5 µV-150.1 µV856.3 mV
900 ns-139.4 µV-150.1 µV856.2 mV

Measured on ngspice 42, tt, 27 °C; the curves are clipped at ±20 mV.

Version 1 doubles M6 and M7, which keeps E5.5's offset rule. Now Cc sets the limit: 19.5 µA into 1 pF is 19.5 V/µs, and the run gives 17.6 V/µs.

A small step stays linear and settles like a single pole with τ = 1/(2πfu), where fu is the loop's unity-gain frequency. Version 3 has fu = 26.4 MHz, so τ = 6.04 ns; an 8-code step (50 mV) needs ln(50/3.125) = 2.77 τ = 16.7 ns. The run takes 20.9 ns: a 60° loop is not a single pole, and its overshoot must die away too (E6.3 Phase margin and the step response).

VersionChangeFull-scale riseFull-scale fall8 codes1 codeLowest after the fall
0E6.4's OPA-B44.6 ns80.7 ns24.5 ns7.5 ns683.8 mV
1M6, M7 doubled: 64/1, 32/139.5 ns30.9 ns17.5 ns5.3 ns799.8 mV
2pair 20/2, load 16/239.8 ns39.4 ns11.9 ns6.7 ns783.6 mV
3load 32/2, M6 128/143.0 ns48.3 ns20.9 ns7.2 ns774.6 mV

Settling to ±½ LSB, from the run above. Each version keeps the change before it.

Offset is bought with area

Version 1 still has OTA-A's pair (10/1) and load (8/1). Twenty Monte Carlo dies give σ = 2.29 mV, so 3σ = 6.88 mV: above 1 LSB. Version 2 quadruples the pair's and the load's area (E7.5 Monte Carlo on an amplifier's offset), and version 3 widens the load again.

DC sweepOffset of 20 dies of version 3
-6 mV-4 mV-2 mV02 mV4 mV6 mVOffset5101520Die+1 LSB−1 LSB-5 mV05 mVOffset5101520Die+1 LSB−1 LSB
Read the plot as a table
Diev(out) − v(in)
5-472 µV
101.459 mV
151.052 mV
20880.2 µV

Seed 5, input 1.0 V: mean −0.01 mV, σ = 1.03 mV, so 3σ = 3.10 mV.

The same 20 dies of version 1
DC sweepOffset of 20 dies of version 1
-6 mV-4 mV-2 mV02 mV4 mV6 mVOffset5101520Die+1 LSB−1 LSB-5 mV05 mVOffset5101520Die+1 LSB−1 LSB
Read the plot as a table
Diev(out) − v(in)
5-1.447 mV
102.724 mV
151.791 mV
201.573 mV

Seed 5: σ = 2.29 mV, from −5.55 to +2.89 mV.

Twenty dies pin σ down only to about ±16 %, so a 3σ that lands near the limit is a reason to add area, not to sign off.

The corner that bites

Version 2 settles and holds its levels at tt. At the sf corner and −40 °C it fails the DC spec at the top code. The top of an NMOS pair's input range is about VDD − VSG3 + Vth1: above it, M1 leaves saturation. SKY130's sf corner pairs a slow PMOS, which raises VSG3, with a fast NMOS, which lowers Vth1 (E2.7 Corners and temperature). The cold raises VSG3 further.

DC sweepDC error at sf, −40 °C: versions 2 and 3
  • version 2
  • version 3
-5 mV05 mV10 mV15 mVv(out) − v(in)0.7 V0.8 V0.9 V1.0 V1.1 V1.2 V1.3 VInput+½ LSBcode 63-5 mV05 mV10 mV15 mVv(out) − v(in)0.8 V1.0 V1.2 VInput+½ LSBcode 63
Read the plot as a table
Inputversion 2version 3
700 mV-149.8 µV-88.19 µV
800 mV13.66 µV37.73 µV
900 mV48.87 µV64.35 µV
1 V93.74 µV89.88 µV
1.1 V630.6 µV211.5 µV
1.2 V10.28 mV2.951 mV
1.3 V47.59 mV33.11 mV

At code 63: 9.02 mV for version 2, 2.42 mV for version 3. Measured on ngspice 42.

Version 3 doubles the load's width to lower VSG3, and doubles M6 with it to keep the offset rule (W/L)6/(W/L)4 = 2(W/L)7/(W/L)5. The sign-off then runs every corner at three temperatures.

Corner°CSlowest settlingStepWorst DC error (codes 0, 8, 9, 63)Phase margin
tt−4043.2 nsfull-scale fall0.37 mV60.4°
tt2748.3 nsfull-scale fall0.22 mV60.4°
tt12558.7 nsfull-scale fall0.14 mV59.6°
ss−4043.4 nsfull-scale fall0.29 mV60.6°
ss2748.1 nsfull-scale fall0.17 mV60.5°
ss12558.9 nsfull-scale fall0.11 mV59.8°
ff−4043.1 nsfull-scale fall0.46 mV60.2°
ff2748.4 nsfull-scale fall0.26 mV60.2°
ff12558.5 nsfull-scale fall0.17 mV59.5°
sf−4043.5 nsfull-scale fall2.42 mV59.7°
sf2749.0 nsfull-scale fall0.61 mV59.9°
sf12559.1 nsfull-scale fall0.19 mV59.2°
fs−4043.3 nsfull-scale fall0.18 mV61.1°
fs2742.4 nsfull-scale rise0.15 mV60.9°
fs12558.2 nsfull-scale fall0.13 mV60.0°

Spec: 70 ns, 3.125 mV, 55°. Worst cases: 59.1 ns, 2.42 mV, 59.2°. Supply current at tt: 119.3 µA.

TransientFinal design at tt, 27 °C
-20 mV-15 mV-10 mV-5 mV05 mV10 mV15 mV20 mVError0100 ns200 ns300 ns400 ns500 ns600 ns700 ns800 ns900 nsTime+½ LSB−½ LSB-20 mV-10 mV010 mV20 mVError0200 ns400 ns600 ns800 nsTime+½ LSB−½ LSB
Read the plot as a table
Timev(out) − v(dac)
0 s50.28 µV
100 ns50.28 µV
200 ns215.5 µV
300 ns789.4 µV
400 ns51.91 µV
500 ns-209 µV
600 ns69.87 µV
700 ns49.4 µV
800 ns71.4 µV
900 ns71.4 µV

Measured on ngspice 42 at tt; the same run also covers the other two temperatures.

The runs behind the other four corners (125 °C shown)
TransientFinal design at ss, 125 °C
-20 mV-15 mV-10 mV-5 mV05 mV10 mV15 mV20 mVError0100 ns200 ns300 ns400 ns500 ns600 ns700 ns800 ns900 nsTime+½ LSB−½ LSB-20 mV-10 mV010 mV20 mVError0200 ns400 ns600 ns800 nsTime+½ LSB−½ LSB
Read the plot as a table
Timev(out) − v(dac)
0 s30.5 µV
100 ns30.5 µV
200 ns91.1 µV
300 ns683 µV
400 ns63.28 µV
500 ns-219.1 µV
600 ns50.59 µV
700 ns31.12 µV
800 ns51.93 µV
900 ns51.87 µV

Measured on ngspice 42 at ss; the same run also covers the other two temperatures.

TransientFinal design at ff, 125 °C
-20 mV-15 mV-10 mV-5 mV05 mV10 mV15 mV20 mVError0100 ns200 ns300 ns400 ns500 ns600 ns700 ns800 ns900 nsTime+½ LSB−½ LSB-20 mV-10 mV010 mV20 mVError0200 ns400 ns600 ns800 nsTime+½ LSB−½ LSB
Read the plot as a table
Timev(out) − v(dac)
0 s80.59 µV
100 ns80.59 µV
200 ns155.3 µV
300 ns741.1 µV
400 ns110.4 µV
500 ns-167.6 µV
600 ns94.09 µV
700 ns74.57 µV
800 ns94.84 µV
900 ns94.77 µV

Measured on ngspice 42 at ff; the same run also covers the other two temperatures.

TransientFinal design at sf, 125 °C
-20 mV-15 mV-10 mV-5 mV05 mV10 mV15 mV20 mVError0100 ns200 ns300 ns400 ns500 ns600 ns700 ns800 ns900 nsTime+½ LSB−½ LSB-20 mV-10 mV010 mV20 mVError0200 ns400 ns600 ns800 nsTime+½ LSB−½ LSB
Read the plot as a table
Timev(out) − v(dac)
0 s54.89 µV
100 ns54.89 µV
200 ns163.4 µV
300 ns748.5 µV
400 ns87.83 µV
500 ns-196 µV
600 ns67.08 µV
700 ns47.31 µV
800 ns67.69 µV
900 ns67.6 µV

Measured on ngspice 42 at sf; the same run also covers the other two temperatures.

TransientFinal design at fs, 125 °C
-20 mV-15 mV-10 mV-5 mV05 mV10 mV15 mV20 mVError0100 ns200 ns300 ns400 ns500 ns600 ns700 ns800 ns900 nsTime+½ LSB−½ LSB-20 mV-10 mV010 mV20 mVError0200 ns400 ns600 ns800 nsTime+½ LSB−½ LSB
Read the plot as a table
Timev(out) − v(dac)
0 s53.42 µV
100 ns53.42 µV
200 ns115.9 µV
300 ns703.3 µV
400 ns83.67 µV
500 ns-193.4 µV
600 ns76.52 µV
700 ns57.3 µV
800 ns78.14 µV
900 ns78.08 µV

Measured on ngspice 42 at fs; the same run also covers the other two temperatures.

Break it

Now swap roles. Four faulty copies of the final design are built, each a realistic mistake. Your job is a bench whose lines pass the good design and fail every copy. A passing simulation proves the bench, not the block, unless the bench can fail.

One bench against five buffersArrows carry the same stimulus to each copy and the measured lines back to the verdict.
One bench against five buffersArrows carry the same stimulus to each copy and the measured lines back to the verdict. component Your bench stimulus and measlines component Final design component No Rz phase margin component Bias 5 µA slew rate component Load mirror 4/2 input range component M2 22/2 offset component Verdicts pass, fail × 4
  1. Dynamic faults

    No Rz and a starved bias leave the settled DC levels right, so only the settling lines catch them for sure.

Read the diagram as text
  • Your bench: stimulus and meas lines
  • Final design
  • No Rz: phase margin
  • Bias 5 µA: slew rate
  • Load mirror 4/2: input range
  • M2 22/2: offset
  • Verdicts: pass, fail × 4
  • Your bench → Final design
  • Your bench → No Rz
  • Your bench → Bias 5 µA
  • Your bench → Load mirror 4/2
  • Your bench → M2 22/2
  • Final design → Verdicts
  • No Rz → Verdicts
  • Bias 5 µA → Verdicts
  • Load mirror 4/2 → Verdicts
  • M2 22/2 → Verdicts
CopyWorst DC errorFall settles1-code overshootCaught by
final design0.22 mV48.3 ns0.69 mVpasses every line
Rz removed0.24 mV112.3 ns2.55 mVsettling
bias 5 µA6.83 mV176.1 ns1.01 mVsettling (DC at code 63 is read before it settles)
load mirror 4/2551.31 mV86.5 ns0.00 mVDC at the upper codes, settling
M2 drawn 22/25.53 mV48.7 ns0.74 mVDC at every code

From one run of the five copies at tt, 27 °C (codes 0, 63, 0, 32, 33; each DC error read 1 ns before the next code). Limits: 3.125 mV and 70 ns.

TransientThe final design and the two dynamic faults
  • final design
  • no R_z
  • bias 5 µA
-20 mV-15 mV-10 mV-5 mV05 mV10 mV15 mV20 mVv(out) − v(dac)0100 ns200 ns300 ns400 ns500 ns600 ns700 ns800 ns900 nsTime+½ LSB−½ LSB-20 mV-10 mV010 mV20 mVv(out) − v(dac)0200 ns400 ns600 ns800 nsTime+½ LSB−½ LSB
  1. Time 370 nsfinal design = 61.54 µV · no R_z = 17.13 mV · bias 5 µA = 164.3 mV

    70 ns after the fall only the final design has settled for good. Without Rz the output rings until 112.3 ns; the starved copy slews until 176.1 ns.

Read the plot as a table
Timefinal designno R_zbias 5 µA
0 s50.28 µV50.28 µV93.29 µV
100 ns50.28 µV50.28 µV93.29 µV
200 ns215.5 µV-3.915 mV-29.01 mV
300 ns789.4 µV819.1 µV-6.087 mV
370 ns61.54 µV17.13 mV164.3 mV
400 ns51.91 µV2.84 mV34.21 mV
500 ns-1.362 mV-1.29 mV5.276 mV
600 ns96.08 µV-1.484 mV22.49 mV
700 ns75.11 µV110.3 µV902.4 µV
800 ns96.97 µV155.3 µV108.6 µV
900 ns96.97 µV96.41 µV129.2 µV

Measured on ngspice 42; clipped at ±20 mV.

What the digital side sees

The sign-off table is the spec a behavioural buffer model must meet: settle within 59.1 ns, a DC error within 2.42 mV, an offset of σ = 1.03 mV. A model that is an ideal wire passes every digital check and every fault above.

Asked in interviews
  1. How do you specify and verify settling time?

    State the step sizes, the error band (often ½ LSB) and the time after the step. Measure the last time the output leaves the band, for the largest and smallest steps, at every corner and temperature.

  2. What limits settling for large and small steps?

    A large step saturates the input pair, so currents set the slew rate: tail current into Cc, or the output stage into the load. A small step stays linear and settles with τ = 1/(2πfu); low phase margin adds ringing.

  3. How would you verify an analog block in a mixed-signal regression?

    Write checks that fail on known faulty versions first: static levels, settling, overshoot, corners. Then compare the behavioural model against the circuit on the same bench.

Try it

Run the netlist. The err_* lines are DC errors at four codes, the ts_* lines the end of each step's settling, and over_s1 the 1-code overshoot. Every line must stay inside 3.125 mV or 70 ns after its step.

Break it: add rz=1 to the end of the X1 line and predict which lines fail before you run. Then try ib=5u, wl=4 and dw2=2 one at a time. Last, the design route: replace the sizes with version 1's w6=64 w7=32 and see which lines move.

SPICEngspice 42 · simulator service
Edit the netlist, then run it
Expected measurements: err_c0 = 5.028494e-05 err_c63 = 2.173663e-04 err_c32 = 9.584489e-05 err_c33 = 9.696778e-05

Check yourself

Predict the outputThis bench checks only DC levels: it sweeps all 64 codes and counts the codes whose error exceeds ½ LSB. It runs on the final design with Rz removed. Type the line meas prints (format: fails = 1.000000e+00).
* a bench that checks only DC levels, on the final buffer with R_z removed (rz=1)
.lib sky130 tt
.subckt opab inp inn out vdd ib=20u cc=1p rz=5k wp=10 lp=1 dw2=0 wl=8 ll=1 w6=32 w7=16 mm=0
.param MC_MM_SWITCH={mm}
IB vdd nb {ib}
XMB nb nb 0 0 sky130_fd_pr__nfet_01v8 W=8 L=1
XM5 tail nb 0 0 sky130_fd_pr__nfet_01v8 W=8 L=1
XM1 x inn tail 0 sky130_fd_pr__nfet_01v8 W={wp} L={lp}
XM2 o1 inp tail 0 sky130_fd_pr__nfet_01v8 W={wp+dw2} L={lp}
XM3 x x vdd vdd sky130_fd_pr__pfet_01v8 W={wl} L={ll}
XM4 o1 x vdd vdd sky130_fd_pr__pfet_01v8 W={wl} L={ll}
XM6 out o1 vdd vdd sky130_fd_pr__pfet_01v8 W={w6} L=1
XM7 out nb 0 0 sky130_fd_pr__nfet_01v8 W={w7} L=1
RZ o1 z {rz}
CC z out {cc}
.ends
.subckt r2r b0 b1 b2 b3 b4 b5 vl out
XT1 n0 t 0 sky130_fd_pr__res_high_po w=1.41 l=10
XT2 t vl 0 sky130_fd_pr__res_high_po w=1.41 l=10
XA0 n0 m0 0 sky130_fd_pr__res_high_po w=1.41 l=10
XB0 m0 b0 0 sky130_fd_pr__res_high_po w=1.41 l=10
XA1 n1 m1 0 sky130_fd_pr__res_high_po w=1.41 l=10
XB1 m1 b1 0 sky130_fd_pr__res_high_po w=1.41 l=10
XA2 n2 m2 0 sky130_fd_pr__res_high_po w=1.41 l=10
XB2 m2 b2 0 sky130_fd_pr__res_high_po w=1.41 l=10
XA3 n3 m3 0 sky130_fd_pr__res_high_po w=1.41 l=10
XB3 m3 b3 0 sky130_fd_pr__res_high_po w=1.41 l=10
XA4 n4 m4 0 sky130_fd_pr__res_high_po w=1.41 l=10
XB4 m4 b4 0 sky130_fd_pr__res_high_po w=1.41 l=10
XA5 n5 m5 0 sky130_fd_pr__res_high_po w=1.41 l=10
XB5 m5 b5 0 sky130_fd_pr__res_high_po w=1.41 l=10
XS0 n0 n1 0 sky130_fd_pr__res_high_po w=1.41 l=10
XS1 n1 n2 0 sky130_fd_pr__res_high_po w=1.41 l=10
XS2 n2 n3 0 sky130_fd_pr__res_high_po w=1.41 l=10
XS3 n3 n4 0 sky130_fd_pr__res_high_po w=1.41 l=10
XS4 n4 n5 0 sky130_fd_pr__res_high_po w=1.41 l=10
VO n5 out 0
.ends
VDD vdd 0 1.8
VL vl 0 0.8
* the code as a swept source; B<k> is bit k, between 0.8 V and 1.2 V
VC code 0 0
B0 b0 0 V = 0.8+0.4*(floor((v(code)+0.25)/1)-2*floor((v(code)+0.25)/2))
B1 b1 0 V = 0.8+0.4*(floor((v(code)+0.25)/2)-2*floor((v(code)+0.25)/4))
B2 b2 0 V = 0.8+0.4*(floor((v(code)+0.25)/4)-2*floor((v(code)+0.25)/8))
B3 b3 0 V = 0.8+0.4*(floor((v(code)+0.25)/8)-2*floor((v(code)+0.25)/16))
B4 b4 0 V = 0.8+0.4*(floor((v(code)+0.25)/16)-2*floor((v(code)+0.25)/32))
B5 b5 0 V = 0.8+0.4*(floor((v(code)+0.25)/32)-2*floor((v(code)+0.25)/64))
XL b0 b1 b2 b3 b4 b5 vl dac r2r
X1 dac out out vdd opab w6=128 w7=32 wp=20 lp=2 wl=32 ll=2 rz=1
.save v(out) v(dac) v(code)
.control
dc VC 0 63 1
* count the codes whose DC error is larger than 1/2 LSB
let bad = abs(v(out)-v(dac)) gt 3.125m
let n = 64*mean(bad)
let nv = n+0*v(code)
meas dc fails FIND nv AT=0
.endc
.end
ConceptVersion 0's full-scale fall settles in 80.7 ns, its 1-code step in 7.5 ns. Why do big and small steps behave so differently?
ConceptFour benches for the break round. Which one cannot fail the copy with Rz removed?
ConceptOn the break-round plot, which buffers are inside ±½ LSB for good 70 ns after the 1-code step from code 32 to 33 (at 700 ns)?
ConceptA buffer with fu = 20 MHz takes a full-scale step of a 6-bit DAC with no slewing at all. About how long until it is within ½ LSB?

Remember

  • Choose the DAC references inside the buffer's input range at speed: the tail must stay saturated, not only the DC error small.
  • Big steps are slew-limited (tail current into Cc, or the output stage into the load); small steps settle linearly with τ = 1/(2πfu).
  • Offset is bought with area, and a corner sweep can move an edge of the input range past the top code.
  • A bench is only trusted once it fails known faults: DC-level checks never see a missing Rz or a starved bias.