This file records the current transistor-level SPICE validation status for the OpenPLL Sky130 DCO, BBPD, and synthesized digital-control candidates.
The DCO validation script generates Sky130 standard-cell SPICE netlists for 8-bit DCO macro candidates:
- Ring core: one
sky130_fd_sc_hd__nand2_1enable gate plus 16sky130_fd_sc_hd__inv_1delay stages by default. The--ring-stagesoption also supports shorter odd-stage rings such as the 9-stage fast-DCO range probe. - Tuning network: 255 dummy-load cells distributed across the ring nodes. The
original baseline uses
sky130_fd_sc_hd__nand2_1; load-style probes also supporteinvp,einvn, anddlclkpcells. - Coarse mirror mode:
--topology mirror-coarsecan use HS cells, a 48-position NAND/NAND2B mirror path, and sparse evenly mapped NAND2 varactor banks. The current physical coarse DCO uses 255 local HD fine loads and no deep-node slow-load bank. - Control: 8-bit binary
DCO_CODEdecoded to a 255-line thermometer bus. - PDK model:
sky130A; HD is the default DCO sweep library and HS is selected explicitly for the coarse mirror target probe. The representative sweep usestt, and the endpoint PVT sweep usestt,ff,ss,sf, andfs. - Supply: 1.8 V.
The physical load polarity is load-based: a high thermometer bit enables dummy
output switching and increases oscillator load. The RTL top-level default uses
DCO_THERM_INVERT=1, so increasing DCO_CODE disables more load cells and
raises the free-running oscillator frequency. This matches the loop filter
convention that BBPD=2'b10 requests an increase in output frequency.
The BBPD validation script generates a Sky130 standard-cell SPICE netlist for the two-flop detector:
- Set flops: two
sky130_fd_sc_hd__dfrtp_1cells. - Reset path: delayed
UPandDNthroughsky130_fd_sc_hd__buf_1chains, then common reset fromUP & DN. - Output convention:
UPisBBPD[1],DNisBBPD[0].
The DCO decoder validation script reads the synthesized Sky130 digital-core
Verilog netlist, extracts the backward cone from selected DCO_THERM taps to
the 8-bit DCO_CODE input, and emits a Sky130 standard-cell SPICE operating
point deck with cell pins ordered from the real .subckt definitions.
The signed-off digital core also has a Magic-extracted SPICE view under:
OpenPLL/openlane/IntegerPLL_DigitalCore/runs/librelane_signoff/final/spice/IntegerPLL_DigitalCore.spice
That extracted view is currently used as LVS evidence together with Netgen. It is not a post-layout transient SPICE simulation of the oscillator, bang-bang detector, or closed PLL loop.
The DCO and BBPD now also have filled, signoff-clean physical macros with GDS, SPEF, Magic/KLayout DRC, Netgen LVS, and Magic RCX transistor-level decks. A reduced no-fill DCO RCX deck is used for fast post-layout oscillator smoke simulation; the no-fill deck is not signoff-clean and is explicitly separated from the filled layout evidence. The BBPD post-layout transient uses the filled signoff-clean RCX deck directly.
The current high-frequency source/integration path is
IntegerPLL_HardMacroTop_EINVP, using the Sky130 digital core RTL, filled BBPD
RCX, physical IntegerPLL_DCO_EINVP_COARSE RCX, and hard-top SPEF where each
regenerated diagnostic requires it. The hard-top and configured-wrapper
routed/signoff artifacts have been regenerated against the current 5-bit
DLF_KP interface and all-HD DCO source, and they pass the current release
gate. The DCO uses a single HD NAND/NAND2B mirror-delay loop with a separate
6-bit coarse band input and an 8-bit fine code. The ring-facing output buffer
remains sky130_fd_sc_hd__buf_1 to avoid adding unnecessary oscillator-node
capacitance. The DCO macro keeps a local met4/met5 PDN island; the parent hard
top stitches both supplies and blocks met3/met4/met5 signal routing over the
DCO body.
The older filled IntegerPLL_DCO_EINVP path measured 50.955942-72.479371 MHz
across the 8-bit code endpoints and remains useful low-frequency diagnostic
history. It is not the current 100/250/300/400/500 MHz target path.
The historical 200 MHz sparse72 exploration shortened the EINVP ring and
reduced the enabled load range. The IntegerPLL_DCO_EINVP_SPARSE72 macro has
Ciel-PDK LibreLane signoff, Magic RCX, and a bounded extracted-DCO transient
probe around the 200 MHz target:
194.469 MHz at fine code 184, 195.968 MHz at code 190, 196.676 MHz at code
191, and 202.264 MHz at code 192. This is post-layout DCO range evidence; the
nearest measured fine codes bracket the 200 MHz target.
IntegerPLL_DCO_EINVP_COARSE is the current physical coarse-DCO candidate. It
uses one HD NAND-gated oscillator loop, a 48-position HD NAND/NAND2B turn/pass
mirror-delay network, and 255 local HD NAND2 fine loads split between
osc_node and mirror_ret[0]. The active ring/mirror gates use HD nand2_8
and nand2b_4 cells, while the first output buffer stays buf_1 to avoid
adding unnecessary capacitance at the oscillator node. The
earlier C19/C20 deep-node slow-load banks were removed after extracted
simulation showed they made the target bands fragile. The coarse path changes
effective loop length inside one macro rather than selecting among parallel
oscillators, selecting a muxed feedback tap, or using a NOT-chain ring.
The optional pre-layout TT topology diagnostic is:
make -C OpenPLL check-dco-einvp-coarse-mirror-targetsIt keeps the output buffer drive at 1 and currently checks sampled 100 and
300 MHz pre-layout brackets with buffered-PLLOUT duty/rise/fall quality. It is
not the shipping all-target range claim. The current all-HD target table is:
| Target | Multiplier | Coarse/fine setting | TT evidence |
|---|---|---|---|
| 100 MHz | 4 | C20/code93 | Interpolated target-code estimate 93.429. |
| 250 MHz | 10 | C06/code234 | Measured target code. |
| 300 MHz | 12 | C04/code90 | Interpolated target-code estimate 89.631. |
| 400 MHz | 16 | C02/code76 | Interpolated target-code estimate 76.037. |
| 500 MHz | 20 | C01/code121 | Interpolated target-code estimate 120.677. |
The configured-tracking summary keeps local band context: C20 spans 98.609..101.817 MHz, C06 spans 231.778..250.488 MHz, C04 spans 285.173..320.322 MHz, C02 spans 385.207..438.705 MHz, and C01 spans 468.489..546.363 MHz over the sampled code range. Full PLL acquisition checks remain required before using this coarse-DCO path for final PLL signoff claims. If the oscillator needs more speed margin, the validated direction is to change ring/mirror drive strength, effective coarse path length, or fine-load topology. Upsizing the ring-facing output buffer is avoided because it increases the load the oscillator must drive.
The paired configured-mode mixed-signal check is:
make -C OpenPLL xyce-pll-mixed-signal-25mhz-targetsIt aliases to the direct extracted-DCO mixed-step hold smoke after refreshing the waveform-qualified DCO tables above. The selected target settings are /4 C20/code93 with KI=16/KP=4, /10 C06/code234 with KI=16/KP=4, /12 C04/code90 with KI=16/KP=4, /16 C02/code76 with KI=16/KP=4, and /20 C01/code121 with KI=16/KP=4. The configured tracking row starts each target at +/-4 fine codes and passes the bounded configured tracking gate for all five multipliers. The gate requires a target-code-neighborhood hit, at least one BBPD decision in the expected initial direction, final modeled frequency error within 2 MHz, and the last eight modeled DCO updates also inside the 2 MHz frequency window with no more than 16 fine-code span. Its intended scope remains configured-mode integration around measured target settings, not rail-to-rail frequency acquisition or a full extracted-DCO-in-loop PLL lock signoff. Short BBPD motion checks are also phase dependent; they are useful only when the initial divider phase is explicitly controlled and are not promoted as frequency-acquisition evidence for the 100/250/300/400/500 MHz coarse-DCO target set.
The current fast source/behavioral gate for this 25 MHz-reference path is:
make -C OpenPLL check-pll-25mhz-divider-config check-pll-25mhz-divider-controller check-pll-25mhz-configured-wrapper check-pll-25mhz-configured-behavioral check-sky130-macrosIt validates the coarse-DCO RTL topology and buf_1 output-buffer constraint,
the 25 MHz RTL divider preset table, configured divider-controller/wrapper, and
configured behavioral PLL reset-to-tracking regression. The heavier
make -C OpenPLL check-sky130-pll-25mhz-release audit checks the current
post-layout hard-macro artifacts, configured-wrapper artifacts, target-code
rows, and direct-RCX integration summaries.
The optional direct extracted-DCO mixed-step diagnostic for the highest target mode is:
make -C OpenPLL xyce-pll-postlayout-dco-mixed-25mhz-500m-hold-smokeThis deck keeps the IntegerPLL_DCO_EINVP_COARSE RCX and filled BBPD RCX in
Xyce, with the divider and DLF model in the C-interface driver. The current
Ciel-PDK run fixes C01/code121 and uses NDIV=20. Because that short
ADC-sampled window is approximate, the standalone post-layout DCO target rows
remain the precise frequency evidence.
The companion direct-RCX near-seed diagnostic is:
make -C OpenPLL xyce-pll-postlayout-dco-mixed-25mhz-nearseed-smokesIt checks +/-4 fine-code starts for 100, 250, 300, 400, and 500 MHz with KI=16,
KP=4, and FRAC=2. Low-side rows use REF phase offset -0.25 and divider seed
0; high-side rows use REF phase offset 0.25 and divider seed NDIV-1. The
current Ciel-PDK TT summary passes all ten rows with the expected two BBPD
decisions: 100 MHz moves 89->92 and 97->94, 250 MHz moves 230->233 and
238->235, 300 MHz moves 86->89 and 94->91, 400 MHz moves 72->75 and 80->77,
and 500 MHz moves 117->120 and 125->122. This confirms extracted DCO/BBPD
code-update behavior on both sides of each configured target, but it is still
near-seed configured-control evidence rather than full extracted-loop
rail-start acquisition evidence.
The practical 25 MHz reference / 200 MHz output mixed-signal lock target is:
make -C OpenPLL xyce-pll-postlayout-calibrated-dco-mixed-fast200-sparse72-lockIt keeps the filled BBPD RCX transistor deck in Xyce and uses a behavioral DCO
phase model calibrated from the sparse72 post-layout RCX frequency points. The
current run passes from both rails within the configured 4 MHz target window:
code 0 moves to 192 with measured PLLOUT at 202.314 MHz, and code 255 moves
to 191 with measured PLLOUT at 196.767 MHz. A separate full extracted-DCO
mixed-step smoke, using the actual sparse72 RCX DCO deck, covers fixed-code
near-target frequency and both near-target BBPD/DLF correction directions with
post-decision DCO-code updates applied through Xyce's mixed-step API:
make -C OpenPLL xyce-pll-postlayout-dco-mixed-fast200-sparse72-near-lock-motionThe fixed-code row starts and stays at code 196 and measures PLLOUT at
199.734 MHz. The low-side row starts at code 184 with divider count 0 and
KI=32, KP=4; it records six UP-dominant windows, moves 184 -> 187 -> 189
-> 191 -> 193 -> 195 -> 197, and measures PLLOUT at 200.000 MHz. The
high-side row starts at code 220 with divider count 7 and KI=96, KP=8; it records four
DN-dominant windows, moves 220 -> 212 -> 206 -> 200 -> 194, and measures
PLLOUT at 200.000 MHz. These rows use the 19303-unknown direct RCX Xyce deck with the
filled BBPD and extracted sparse72 DCO, a 5 ns reset release, a 25 MHz pulse
REF source, and NDIV=8. This is direct-RCX near-lock evidence with real
post-decision control updates; a complete rail-to-rail lock simulation with the
full extracted DCO in every loop cycle remains too slow for routine regression
in the current serial driver.
The full-RCX C-interface driver now advances the feedback divider during
warmup by default and also accepts --initial-divider-count for explicit
phase-selected BBPD checks. It is not currently accelerated by launching the
compiled executable with mpirun: a two-rank YADC/YDAC smoke test reached Xyce
completion and printed a two-processor timing summary, but the two driver ranks
did not exit cleanly and had to be terminated. Treat C-interface MPI as
unqualified until the driver is made MPI-rank-aware.
The fast-path loop checks keep the fine DCO word at the full 8-bit resolution
and model COARSEBINARY_CODE as an independent band offset. The current
126.88745 MHz target uses COARSEBINARY_CODE=1, DCO_COARSE_STEP_MHZ=16,
MMDCLKDIV_RATIO=2, and REF=63.443725 MHz; this is behavioral/mixed-signal
range exploration, not post-layout DCO signoff.
make -C OpenPLL spice-pll-mapped-loop-fast100-coarse4-motion runs the mapped
digital core with filled BBPD RCX and a behavioral five-point DCO table in Xyce
MPI/KLU. The current 220 ns check passes the motion criterion with low-start
code 0 moving to 62 and high-start code 255 moving to 183. It is two-sided
direction evidence for the 100 MHz-order multiplier setup, not a lock-window
or settled-frequency signoff.
make -C OpenPLL xyce-pll-mixed-signal-fast100-coarse4-smoke adds a bounded
Xyce C-interface mixed-signal check for the same independent-coarse fast band.
The filled BBPD RCX remains in Xyce and the compiled driver uses the
102.518/119.260/142.355/176.267/229.054 MHz DCO table plus
COARSEBINARY_CODE=1 at 16 MHz/step. The low case moves code 0 to 36 in 24
cycles; the bounded high-side case moves code 64 to 38 in 15 cycles. Both pass
with 4-code closest error to the target code 32. This target deliberately does
not claim full 255-to-32 rail-start lock because the current C-interface driver
uses a simplified one-feedback-edge-per-cycle phase model.
make -C OpenPLL xyce-pll-analog-dco-mixed-fast100-coarse4-acq is the stricter
fast-band C-interface check. Xyce owns the filled BBPD RCX, analog behavioral
DCO phase integrator, reference source, and divided feedback source; the C++
driver only reads UP/DN YADCs and drives the DCO code YDAC from a fixed-point
DLF model. With COARSEBINARY_CODE=1, 16 MHz coarse-band offset, REF=63.443725 MHz, NDIV=2, KI=128, KP=8, and FRAC=2, the current short acquisition
passes from both sides around target fine code 32: low start moves 0 to 34 in
four updates and measures 127.389 MHz at PLLOUT; bounded high start moves
64 to 30 in four updates and measures 126.316 MHz. Both finish within 2
fine-code LSB of the target and within 0.572 MHz of the 126.88745 MHz output
target. This is better mixed-signal boundary evidence than the older driver-DCO
smoke, but it is still a bounded acquisition check, not full 255-to-32
rail-start settling or physical fast-DCO signoff.
The strongest post-layout convergence evidence is the extracted-DCO lock-window set, not the short mixed-signal driver smoke. The TT low-rail run reaches codes 122..128 with 58.485654 MHz tail frequency and 0.087865 MHz target error; the TT high-rail run reaches codes 126..132 with 58.804895 MHz tail frequency and 0.231377 MHz target error. FF/SS low/high rail PVT lock-window rows are also covered by the promoted artifact checker.
The Xyce C-interface flow is mixed-signal in the app-note sense because Xyce owns
the extracted BBPD analog state and the compiled driver advances the digital
loop through YADC/YDAC bridges. It is deliberately scoped as gain and polarity
evidence: the current KI=160, KP=8, FRAC=6 case reaches exact code 128
from the low side in 10 cycles, while the matching KP=0 case stops at code
126 and never crosses. The high-side rows still overshoot in the short run, so
this mixed path should not be treated as final lock/settling signoff yet.
For the legacy low-frequency Sky130 PLL validation evidence, run the fast artifact audit:
make -C OpenPLL validate-sky130-pll-artifactsThat target reads the promoted signoff, SPICE, and RTL summary artifacts and writes:
OpenPLL/build/sky130_pll_validation/sky130_pll_validation_summary.csv
OpenPLL/build/sky130_pll_validation/sky130_pll_validation_summary.json
The heavier target below regenerates the promoted evidence where practical and then runs the same audit:
make -C OpenPLL validate-sky130-pllThis heavier target now regenerates the Xyce C-interface mixed-signal gain sweep before running the artifact audit, so the mixed gain CSVs required by the checker are reproducible from the promoted flow.
Known diagnostic targets that do not pass from both rails are intentionally excluded from this promoted gate.
The current mapped-loop and hard-top extracted PLL runs are not Xyce
mixed-signal co-simulations. They are all-SPICE transient decks: the digital
core is emitted as mapped Sky130 standard-cell SPICE instances, the decks include
sky130_fd_sc_hd.spice, and Xyce solves the digital gates, BBPD, DCO, and
selected hard-top SPEF RC continuously as analog circuit unknowns. This is why
the extracted closed-loop runs are slow even when using the MPI/KLU Xyce
binary.
The Xyce app-note flow uses YADC and YDAC bridge devices plus an external
Python or Icarus/VPI driver through libxycecinterface.so. In that flow Xyce
keeps the analog circuit state, while the external digital simulator advances
time, reads ADC events, and updates DAC waveforms. A useful OpenPLL version
would keep the BBPD and DCO analog in Xyce, put YADC devices on BBPD
UP/DN and PLLOUT, and drive DCO_THERM[*] plus CLKDIV_RETIMED through
YDAC devices from an event-driven RTL or Python digital loop.
The installed Xyce binaries accept YADC/YDAC device syntax, but the current
$XYCE_MPI_ROOT install does not include
libxycecinterface.so; its previous CMake cache has BUILD_SHARED_LIBS=OFF.
Until a shared Xyce C-interface build is installed, the app-note Python/VPI
mixed-signal loop cannot run here.
There is still a usable compiled co-simulation path: the existing static Xyce
build can build utils/XyceCInterface/libxycecinterface.a, and OpenPLL now has
short C++ C-interface smokes for that path. xyce-cinterface-smoke proves
simulateUntil, xyce_updateTimeVoltagePairs, and YADC state retrieval on a
small YDAC/YADC deck. xyce-bbpd-cinterface-smoke uses the filled
IntegerPLL_BBPD RCX macro at TT, drives REF and feedback through YDACs, reads
UP/DN through YADCs, and verifies both polarities: the REF-leads event produces
a wider UP pulse, while the feedback-leads event produces a wider DN pulse. The
latest passing BBPD C-interface smoke measured 879.587 ps UP versus 652.784 ps
DN in the REF-leads window and 663.737 ps UP versus 852.102 ps DN in the
feedback-leads window.
xyce-pll-mixed-signal-smoke extends that bridge into a short closed-loop
mixed-signal PLL smoke. Xyce still owns the filled Sky130 BBPD RCX circuit and
its analog state; a compiled C++ C-interface driver supplies the REF/divider
edges through YDACs, reads BBPD UP/DN pulse widths through YADCs, and updates a
behavioral fixed-point DLF plus a behavioral DCO frequency table calibrated from
the filled IntegerPLL_DCO_EINVP RCX TT code points. This is a true Xyce
C-interface mixed-signal run, but it is not yet a full post-layout PLL run
because the DLF/divider/DCO are outside Xyce. With KI=255, KP=8,
FRAC=6, boost_shift=4, and boost_after=1, the latest smoke passes from
both sides of the target: code 96 moves upward to 143 with a minimum target
error of 1 code, and code 160 moves downward to 78 with a minimum target error
of 2 codes. The overshoot is intentional for this short smoke; the useful
evidence is BBPD polarity, closed feedback, and gain-induced motion through the
target region.
xyce-pll-mixed-signal-gain-sweep records a focused gain comparison using the
same filled BBPD RCX mixed setup, but with the current lower-gain acquisition
candidate KI=160, FRAC=6, boost_shift=4, and boost_after=2. The default
grid compares KP=0 against KP=8 from code 96 and code 160 for 10 reference
cycles. The latest run writes
build/xyce_pll_mixed_signal_gain_sweep/mixed_signal_gain_summary.csv and
mixed_signal_gain_cycles.csv, with the generated deck and per-case Xyce logs
kept in the same build directory. All four rows pass the mixed-driver motion
check, but the rows are more useful as gain evidence than as final lock
evidence: KP=0 low-start ends at code 126 and never exactly hits or crosses
128, while KP=8 low-start reaches exact code 128 at cycle 9. Both high-start
rows cross the target and then overshoot to codes 109 (KP=0) and 107
(KP=8). This supports keeping a nonzero proportional path for acquisition
responsiveness, while showing that the current short mixed run still needs
better damping or a longer lock/settling policy before being promoted as final
gain signoff.
The promoted artifact checker now includes this mixed C-interface evidence as
xyce_cinterface_mixed_signal_gain_sweep and a direct
objective_deliverable_evidence row for the Sky130 top, 8-bit control,
frequency range, and extracted lock-window evidence. In the v1 artifact set,
the full artifact audit passed 69 checks. Longer diagnostic probes were also
tried but are not promoted: KI=160, KP=8, boost_shift=4, boost_after=2 crosses
the target but drifts to codes 156/90 after 20 cycles, and KI=192, KP=8,
boost_shift=3, boost_after=2 improves the low-start 20-cycle result to code
132 but keeps walking low from the high side. This reinforces that the
C-interface loop is useful for fast polarity/gain evidence, while final
settling claims should stay with the extracted-DCO lock-window SPICE artifacts
for now.
The mixed-signal driver is also parameterized for non-promoted fast-band
experiments: it accepts five DCO calibration points, --coarse-code,
--dco-coarse-step-mhz, and --phase-wrap-cycles. The default arguments keep
the promoted filled-EINVP DCO table. The fast100 coarse4 target passes only the
bounded 0->36 and 64->38 smoke cases described above; full rail-start fast-DCO
settling still belongs in the mapped-loop or future event-driven mixed-signal
flow.
The stricter analog-DCO fast100 target uses
scripts/xyce_pll_analog_dco_cinterface_deck.py and
tools/xyce_cinterface_smoke/xyce_pll_analog_dco_mixed_signal_smoke.cpp.
That path leaves the DCO phase and divider waveforms in Xyce rather than in the
compiled driver, and uses a quarter-cycle startup phase offset with no transient
uic so the extracted BBPD sees clean first post-reset clock edges. The driver
also reads the PLLOUT YADC after acquisition and checks the measured output
frequency against REF * NDIV, so this target verifies the intended multiply
frequency directly rather than relying only on final fine-code proximity.
Run the status probe:
make -C OpenPLL xyce-mixed-signal-statusAfter installing a shared Xyce C-interface library, the strict readiness target should pass:
make -C OpenPLL check-xyce-mixed-signalRun the compiled C-interface smokes:
make -C OpenPLL xyce-cinterface-smoke
make -C OpenPLL xyce-bbpd-cinterface-smoke
make -C OpenPLL xyce-pll-mixed-signal-smoke
make -C OpenPLL xyce-pll-mixed-signal-gain-sweep
make -C OpenPLL xyce-pll-analog-dco-mixed-fast100-coarse4-acq
python3 OpenPLL/scripts/check_sky130_pll_validation.pymake -C OpenPLL spiceThis runs the representative DCO sweep and the BBPD transient checks:
OpenPLL/scripts/spice_dco_sweep.sh
OpenPLL/scripts/spice_bbpd_check.sh
OpenPLL/scripts/spice_dco_decoder_check.shThe scripts write generated netlists, simulator logs, waveform files where needed, and CSV output under:
OpenPLL/build/spice/
The DCO sweep CSV records both top-level DCO_CODE and the actual enabled
load-cell count. The script exits nonzero if measured frequency is not
monotonic in the expected direction for the selected decoder polarity.
Useful narrower targets:
make -C OpenPLL validate-sky130-pll-artifacts
make -C OpenPLL validate-sky130-pll
make -C OpenPLL spice-dco
make -C OpenPLL spice-dco-all
make -C OpenPLL check-dco-all
make -C OpenPLL spice-bbpd
make -C OpenPLL spice-dco-pvt
make -C OpenPLL spice-dco-pvt-all
make -C OpenPLL check-dco-pvt-all
make -C OpenPLL spice-dco-decoder
make -C OpenPLL spice-dco-decoder-all
make -C OpenPLL spice-dco-decoder-full-taps
make -C OpenPLL spice-dco-decoder-all-taps
make -C OpenPLL dco-librelane-signoff
make -C OpenPLL dco-magic-rcx
make -C OpenPLL dco-librelane-nofill
make -C OpenPLL dco-magic-rcx-nofill
make -C OpenPLL spice-dco-postlayout
make -C OpenPLL spice-dco-postlayout-filled
make -C OpenPLL check-dco-postlayout-filled
make -C OpenPLL check-dco-postlayout-filled-local-gain
make -C OpenPLL check-dco-postlayout-filled-pvt-endpoints
make -C OpenPLL spice-dco-postlayout-filled-ngspice
make -C OpenPLL bbpd-librelane-signoff
make -C OpenPLL bbpd-magic-rcx
make -C OpenPLL spice-bbpd-postlayout
make -C OpenPLL spice-bbpd-postlayout-pvt
make -C OpenPLL spice-bbpd-postlayout-deadzone
make -C OpenPLL spice-bbpd-postlayout-deadzone-pvt
make -C OpenPLL spice-pll-loop
make -C OpenPLL spice-pll-loop-filled-dco
make -C OpenPLL spice-pll-loop-filled-bbpd-xyce-sweep
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-aperture-sweep
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-lock
make -C OpenPLL spice-pll-loop-pvt
make -C OpenPLL spice-dlf-static
make -C OpenPLL spice-dlf-static-kp16
make -C OpenPLL spice-dlf-static-kp32
make -C OpenPLL spice-dlf-update
make -C OpenPLL spice-dlf-update-kp16
make -C OpenPLL spice-dlf-update-kp32
make -C OpenPLL spice-dlf-update-full-kp32-overlap
make -C OpenPLL spice-dlf-update-signoff-nl-kp32
make -C OpenPLL spice-dlf-update-signoff-spef-kp32
make -C OpenPLL spice-dlf-update-signoff-spef-rc-kp32
make -C OpenPLL spice-bbpd-dlf-integration
make -C OpenPLL spice-bbpd-dlf-integration-full
make -C OpenPLL spice-bbpd-dlf-integration-signoff-spef-rc
make -C OpenPLL spice-pll-mapped-loop-smoke
make -C OpenPLL spice-pll-mapped-loop-gain-sweep
make -C OpenPLL spice-pll-mapped-loop-phase-sweep
make -C OpenPLL spice-pll-mapped-loop-progress-1us
make -C OpenPLL spice-pll-mapped-loop-frac6-force127-s4a2-extracted-dco-lock-820ns-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-smoke
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-smoke
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-startup-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-motion-low-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-motion-high-diagnostic
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-startup
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-startup-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-motion
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-motion-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-low-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-high-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-midcode-inc-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-midcode-kp0-hold-mpi4-klu
make -C OpenPLL pll-top-model-acq
make -C OpenPLL pll-top-filled-dco-acq
make -C OpenPLL pll-top-filled-dco-gain-sweep
make -C OpenPLL digital-loop-gain-sweepMeasured in the recorded validation environment with the installed Volare Sky130A PDK:
| DCO code | Enabled loads | Frequency | Period |
|---|---|---|---|
| 0 | 255 | 99.836 MHz | 10.016 ns |
| 64 | 191 | 106.626 MHz | 9.379 ns |
| 128 | 127 | 114.338 MHz | 8.746 ns |
| 192 | 63 | 123.135 MHz | 8.121 ns |
| 255 | 0 | 133.013 MHz | 7.518 ns |
The representative sweep validates a monotonic typical-corner frequency span of approximately 99.836 MHz to 133.013 MHz.
The exhaustive typical-corner command is:
make -C OpenPLL spice-dco-all
make -C OpenPLL check-dco-allThat target now runs a 256-code TT oscillator transient sweep. The recorded CSV
has 257 rows: one header plus one passing row for every 8-bit DCO_CODE value.
The measured all-code span is 99.784 MHz to 132.850 MHz. Adjacent-code
frequency increments are strictly positive, with a measured minimum step of
0.0983 MHz and maximum step of 0.186 MHz.
The checker writes a consolidated artifact under
build/spice_dco_all_check/dco_sweep_summary.csv and
build/spice_dco_all_check/dco_sweep_summary.json.
The reported period is the averaged one-cycle oscillator period from a two-cycle transient measurement window.
The compact endpoint sweep uses:
make -C OpenPLL spice-dco-pvtMeasured endpoint results:
| Corner | DCO code | Enabled loads | Frequency | Period |
|---|---|---|---|---|
tt |
0 | 255 | 99.836 MHz | 10.016 ns |
tt |
255 | 0 | 133.013 MHz | 7.518 ns |
ff |
0 | 255 | 138.117 MHz | 7.240 ns |
ff |
255 | 0 | 187.985 MHz | 5.320 ns |
ss |
0 | 255 | 66.343 MHz | 15.073 ns |
ss |
255 | 0 | 86.952 MHz | 11.501 ns |
sf |
0 | 255 | 83.423 MHz | 11.987 ns |
sf |
255 | 0 | 111.951 MHz | 8.932 ns |
fs |
0 | 255 | 105.110 MHz | 9.514 ns |
fs |
255 | 0 | 141.153 MHz | 7.085 ns |
This validates endpoint oscillation across a measured span of approximately 66.343 MHz to 187.985 MHz for the tested corners and codes.
The exhaustive all-code PVT command is:
make -C OpenPLL spice-dco-pvt-all
make -C OpenPLL check-dco-pvt-allThat target validates all 256 DCO_CODE values across tt, ff, ss, sf,
and fs, for 1280 oscillator transient runs total. The recorded CSV has 1281
rows: one header plus one passing row for every code/corner pair. The sweep is
strictly monotonic in every corner.
The checker writes consolidated PVT artifacts under
build/spice_dco_pvt_all_check/dco_sweep_summary.csv and
build/spice_dco_pvt_all_check/dco_sweep_summary.json.
Measured all-code PVT spans:
| Corner | Min frequency | Max frequency | Min adjacent step | Max adjacent step |
|---|---|---|---|---|
tt |
99.784 MHz | 132.850 MHz | 0.098 MHz | 0.186 MHz |
ff |
137.984 MHz | 187.555 MHz | 0.144 MHz | 0.265 MHz |
ss |
66.324 MHz | 86.904 MHz | 0.062 MHz | 0.120 MHz |
sf |
83.412 MHz | 111.872 MHz | 0.085 MHz | 0.153 MHz |
fs |
105.030 MHz | 140.940 MHz | 0.105 MHz | 0.230 MHz |
The filled DCO layout has zero final DRC/LVS violations and a Magic RCX deck at:
OpenPLL/openlane/IntegerPLL_DCO/runs/librelane_signoff/rcx-magic/IntegerPLL_DCO.rcx.spice
That deck is the real filled post-layout extraction. Transient ngspice runs on
it are expensive because the deck includes filler/decap devices, so the
practical filled smoke target now uses the installed Xyce simulator. The DCO
post-layout runner records simulator type, timeout status, log path, and Xyce
waveform path in its CSV. Xyce results are accepted only when the printed
PLLOUT waveform has enough real rising threshold crossings.
In the recorded validation environment, Xyce -capabilities reports Serial. The current Xyce
binary can run independent decks in parallel through script-level --jobs or
recursive make -j, but wrapping this binary with mpirun would launch serial
processes rather than split one large filled-RCX transient solve across MPI
ranks. The Xyce-enabled runners accept wrapper commands, so the probed
MPI-enabled Xyce install at $XYCE_MPI_ROOT/bin/Xyce, whose
capability output starts with Parallel with MPI, can be selected with
XYCE=$XYCE_MPI_ROOT/bin/Xyce and XYCE_MPI_PROCS=N; the runners check
Xyce -capabilities and refuse to wrap the current serial binary. Deck
convergence still needs to be checked before promoting MPI-run artifacts.
The filled signoff smoke command is:
make -C OpenPLL spice-dco-postlayout-filledThat target runs the five canonical code-point decks concurrently through
make -j$(DCO_POSTLAYOUT_FILLED_JOBS), with DCO_POSTLAYOUT_FILLED_JOBS ?= 5.
For a consolidated pass/fail and calibration artifact, run:
make -C OpenPLL check-dco-postlayout-filledMeasured filled signoff RCX transient results:
| Simulator | Case | Transient setup | Result |
|---|---|---|---|
| Xyce | Code 0, 255 enabled loads | 70.5 ns, 200 ps max step, measure after 10 ns | Pass, 46.257 MHz, 415.621 s |
| Xyce | Code 64, 191 enabled loads | 85 ns, 200 ps max step, measure after 10 ns | Pass, 47.950 MHz, 510.490 s |
| Xyce | Code 128, 127 enabled loads | 75 ns, 200 ps max step, measure after 10 ns | Pass, 49.762 MHz, 378.787 s |
| Xyce | Code 192, 63 enabled loads | 110 ns, 200 ps max step, measure after 10 ns | Pass, 51.618 MHz, 432.347 s |
| Xyce | Code 255, zero enabled loads | 160 ns, 200 ps max step, measure after 10 ns | Pass, 52.350 MHz, 185.710 s |
| Xyce | Code 0, 255 enabled loads | 75 ns, 200 ps max step, measure after 10 ns | Timed out after 420.155 s, but waveform had enough crossings for 46.257 MHz |
| Xyce | Code 0, 255 enabled loads | 160 ns, 200 ps max step, measure after 10 ns | Timed out after 600.173 s, but waveform had enough crossings for 46.257 MHz |
| Xyce | Code 128, 127 enabled loads | 160 ns, 200 ps max step, measure after 10 ns | Timed out after 600.173 s, but waveform had enough crossings for 49.762 MHz |
| Xyce | Code 255, zero enabled loads | 60 ns, 200 ps max step, measure after 10 ns | Failed measurement: not enough real crossings in 60 ns, 84.357 s |
The consolidated calibration check writes
build/spice_dco_postlayout_filled_calibration/filled_dco_calibration.csv and
build/spice_dco_postlayout_filled_calibration/filled_dco_calibration_summary.json.
For the current five passing points, the filled DCO spans 46.256726 MHz to
52.349831 MHz. The five-point span is 6.093105 MHz, the average step is
0.023895 MHz/LSB, and the measured segment steps are 0.026464, 0.028308,
0.029005, and 0.011609 MHz/LSB over code ranges 0-64, 64-128, 128-192, and
192-255.
The filled local-gain command is:
make -C OpenPLL check-dco-postlayout-filled-local-gainIt runs the filled signoff Magic RCX deck at TT for codes 120, 128, and 136
using the MPI-enabled Xyce binary at $XYCE_MPI_ROOT/bin/Xyce
with DCO_POSTLAYOUT_PVT_XYCE_MPI_PROCS ?= 4. The consolidated check writes
build/spice_dco_postlayout_filled_local_gain/filled_dco_local_gain.csv and
build/spice_dco_postlayout_filled_local_gain/filled_dco_local_gain_summary.json.
Measured filled signoff RCX local-gain results:
| Simulator | Corner | MPI ranks | Case | Transient setup | Result |
|---|---|---|---|---|---|
| Xyce | tt |
4 | Code 120, 135 enabled loads | 85 ns, 200 ps max step, measure after 20 ns | Pass, 49.558458 MHz |
| Xyce | tt |
4 | Code 128, 127 enabled loads | 85 ns, 200 ps max step, measure after 20 ns | Pass, 49.771679 MHz |
| Xyce | tt |
4 | Code 136, 119 enabled loads | 85 ns, 200 ps max step, measure after 20 ns | Pass, 49.977051 MHz |
The local span is 0.418594 MHz over 16 LSBs, or 0.026162 MHz/LSB average. The lower and upper 8-LSB segment gains are 0.026653 MHz/LSB and 0.025672 MHz/LSB. This is the promoted post-layout gain number to use for first-pass DLF gain tuning around the nominal lock code; it is not a substitute for a dense filled-RCX transfer curve.
The filled PVT endpoint command is:
make -C OpenPLL check-dco-postlayout-filled-pvt-endpointsIt runs the same filled signoff Magic RCX deck at the ff, fs, sf, and
ss corners for codes 0 and 255, then writes
build/spice_dco_postlayout_filled_pvt_endpoints/filled_dco_pvt_endpoints.csv
and
build/spice_dco_postlayout_filled_pvt_endpoints/filled_dco_pvt_endpoint_summary.json.
The ff endpoints use serial Xyce. The fs, sf, and ss endpoints use the
MPI-enabled Xyce binary at $XYCE_MPI_ROOT/bin/Xyce with
DCO_POSTLAYOUT_PVT_XYCE_MPI_PROCS ?= 4.
Measured filled signoff RCX PVT endpoint results:
| Simulator | Corner | MPI ranks | Case | Transient setup | Result |
|---|---|---|---|---|---|
| Xyce | ff |
1 | Code 0, 255 enabled loads | 55 ns, 200 ps max step, measure after 10 ns | Pass, 63.875 MHz |
| Xyce | ff |
1 | Code 255, zero enabled loads | 55 ns, 200 ps max step, measure after 10 ns | Pass, 72.318 MHz |
| Xyce | fs |
4 | Code 0, 255 enabled loads | 80 ns, 200 ps max step, measure after 10 ns | Pass, 46.796 MHz |
| Xyce | fs |
4 | Code 255, zero enabled loads | 80 ns, 200 ps max step, measure after 10 ns | Pass, 52.659 MHz |
| Xyce | sf |
4 | Code 0, 255 enabled loads | 110 ns, 200 ps max step, measure after 10 ns | Pass, 40.092 MHz |
| Xyce | sf |
4 | Code 255, zero enabled loads | 110 ns, 200 ps max step, measure after 10 ns | Pass, 46.062 MHz |
| Xyce | ss |
4 | Code 0, 255 enabled loads | 120 ns, 200 ps max step, measure after 10 ns | Pass, 30.704 MHz |
| Xyce | ss |
4 | Code 255, zero enabled loads | 95 ns, 200 ps max step, measure after 10 ns | Pass, 34.328 MHz |
The FF endpoint span is 8.442674 MHz, or 0.033109 MHz/LSB averaged across the full 0-to-255 code range. The FS endpoint span is 5.863210 MHz (0.022993 MHz/LSB), SF is 5.970058 MHz (0.023412 MHz/LSB), and SS is 3.623758 MHz (0.014211 MHz/LSB).
This is real filled-signoff RCX transient smoke evidence at five 8-bit codes
spanning the TT tuning range, plus endpoint smoke across the other four PVT
corners. It confirms the filled-deck RTL-facing polarity: increasing
DCO_CODE disables load cells and increases oscillator frequency. It is still
not an exhaustive filled-layout 256-code tuning curve or all-corner
filled-layout PVT oscillator sweep.
The separate IntegerPLL_DCO_EINVP candidate endpoint PVT command is:
make -C OpenPLL spice-dco-postlayout-einvp-pvt-endpointsIt runs the filled IntegerPLL_DCO_EINVP Magic RCX deck at the ff, fs,
sf, and ss corners for codes 0 and 255 using four-rank Xyce. The promoted
validation gate checks that each log records MPI4 timing, both endpoint rows
pass, code 255 is faster than code 0, and every corner has at least 5 MHz
endpoint span.
Measured IntegerPLL_DCO_EINVP RCX PVT endpoint results:
| Simulator | Corner | MPI ranks | Case | Transient setup | Result |
|---|---|---|---|---|---|
| Xyce | ff |
4 | Code 0, 255 enabled loads | 140 ns, 200 ps max step, measure after 30 ns | Pass, 70.251790 MHz |
| Xyce | ff |
4 | Code 255, zero enabled loads | 140 ns, 200 ps max step, measure after 30 ns | Pass, 99.895518 MHz |
| Xyce | fs |
4 | Code 0, 255 enabled loads | 140 ns, 200 ps max step, measure after 30 ns | Pass, 51.688142 MHz |
| Xyce | fs |
4 | Code 255, zero enabled loads | 140 ns, 200 ps max step, measure after 30 ns | Pass, 70.763937 MHz |
| Xyce | sf |
4 | Code 0, 255 enabled loads | 140 ns, 200 ps max step, measure after 30 ns | Pass, 44.076396 MHz |
| Xyce | sf |
4 | Code 255, zero enabled loads | 140 ns, 200 ps max step, measure after 30 ns | Pass, 64.579620 MHz |
| Xyce | ss |
4 | Code 0, 255 enabled loads | 140 ns, 200 ps max step, measure after 30 ns | Pass, 33.875977 MHz |
| Xyce | ss |
4 | Code 255, zero enabled loads | 140 ns, 200 ps max step, measure after 30 ns | Pass, 47.497548 MHz |
The endpoint spans are 29.643728 MHz at FF, 19.075795 MHz at FS, 20.503225 MHz at SF, and 13.621571 MHz at SS. This adds DCO-only PVT endpoint coverage for the EINVP candidate; it is not closed-loop PVT signoff.
The old bounded ngspice diagnostic command is:
make -C OpenPLL spice-dco-postlayout-filled-ngspicePrior ngspice filled-deck diagnostic attempts:
| Case | Transient setup | Result |
|---|---|---|
| Code 255, zero enabled loads | 80 ns, 100 ps max step, measure after 20 ns | Timed out after 900.368 s |
| Code 255, zero enabled loads | 60 ns, 200 ps max step, measure after 10 ns | Timed out after 900.362 s |
| Code 255, zero enabled loads | 60 ns, 200 ps max step, measure after 10 ns, num_threads=4 |
Timed out after 120.212 s diagnostic probe |
All ngspice attempts used the filled signoff Magic RCX deck and did not reach a
frequency measurement before the timeout. The num_threads=4 probe confirms
that ngspice threading is wired into the runner, but it does not make this deck
practical in the recorded validation environment.
For practical oscillator smoke validation, make -C OpenPLL spice-dco-postlayout
uses the no-fill RCX deck:
OpenPLL/openlane/IntegerPLL_DCO/runs/librelane_nofill/rcx-magic/IntegerPLL_DCO.rcx.spice
The no-fill layout intentionally omits filler, so it is not signoff-clean. It is used only to validate that the extracted transistor-level oscillator topology runs and that the 8-bit control polarity is correct.
Measured no-fill RCX transient results with the Xyce post-layout target:
| DCO code | Enabled loads | Frequency |
|---|---|---|
| 0 | 255 | 50.944 MHz |
| 128 | 127 | 55.258 MHz |
| 255 | 0 | 60.003 MHz |
The post-layout smoke sweep confirms the RTL-facing polarity: increasing
DCO_CODE disables load cells and increases oscillator frequency.
Measured pre-layout BBPD transient cases:
| Case | Expected wider pulse | UP width |
DN width |
Result |
|---|---|---|---|---|
| Reference leads feedback | UP |
3.380 ns | 0.379 ns | Pass |
| Feedback leads reference | DN |
0.376 ns | 3.376 ns | Pass |
Both cases use a 3 ns input phase offset. The leading-side pulse is wider than the reset pulse, which confirms the detector polarity needed by the loop.
The filled BBPD layout has zero final DRC/LVS violations and a Magic RCX deck at:
OpenPLL/openlane/IntegerPLL_BBPD/runs/librelane_signoff/rcx-magic/IntegerPLL_BBPD.rcx.spice
The post-layout command is:
make -C OpenPLL spice-bbpd-postlayoutThe post-layout PVT command is:
make -C OpenPLL spice-bbpd-postlayout-pvtMeasured filled-layout RCX transient cases:
| Case | Expected wider pulse | UP width |
DN width |
Result |
|---|---|---|---|---|
| Reference leads feedback | UP |
3.680 ns | 0.663 ns | Pass |
| Feedback leads reference | DN |
0.665 ns | 3.655 ns | Pass |
Both post-layout cases use the same 3 ns input phase offset as the pre-layout BBPD deck. The extracted RCX simulation confirms that the detector polarity survives filled layout and extraction.
Measured filled-layout RCX PVT transient cases:
| Corner | Case | Expected wider pulse | UP width |
DN width |
Result |
|---|---|---|---|---|---|
tt |
Reference leads feedback | UP |
3.680 ns | 0.663 ns | Pass |
tt |
Feedback leads reference | DN |
0.665 ns | 3.655 ns | Pass |
ff |
Reference leads feedback | UP |
3.483 ns | 0.471 ns | Pass |
ff |
Feedback leads reference | DN |
0.471 ns | 3.464 ns | Pass |
ss |
Reference leads feedback | UP |
4.062 ns | 1.034 ns | Pass |
ss |
Feedback leads reference | DN |
1.039 ns | 4.025 ns | Pass |
sf |
Reference leads feedback | UP |
3.777 ns | 0.742 ns | Pass |
sf |
Feedback leads reference | DN |
0.756 ns | 3.739 ns | Pass |
fs |
Reference leads feedback | UP |
3.683 ns | 0.677 ns | Pass |
fs |
Feedback leads reference | DN |
0.668 ns | 3.666 ns | Pass |
The PVT run confirms filled-RCX polarity for the tested 3 ns phase offset across
tt, ff, ss, sf, and fs.
The TT post-layout dead-zone command is:
make -C OpenPLL spice-bbpd-postlayout-deadzoneThe generated sweep uses the filled BBPD RCX deck, a 1 ps transient step, and
absolute phase offsets of 0, 1, 2, 5, 10, 20, 50, 100, 200, 500, and 1000 ps.
Positive phase_offset_ps means the reference edge leads the feedback edge;
negative values mean feedback leads reference. Tiny-offset polarity inversions
are recorded as characterization data instead of make-target failures, while
ngspice or measurement failures still fail the target.
Measured TT dead-zone summary:
| Metric | Value |
|---|---|
Zero-offset UP-DN pulse-width skew |
+13.464 ps |
| Smallest correct reference-leading offset | 1 ps |
| Smallest correct feedback-leading offset | 20 ps |
| Feedback-leading offsets inside skew window | 1, 2, 5, 10 ps |
| Failed ngspice/measurement rows | 0 |
This sweep shows a small UP-side offset in the current extracted layout and reset path. It is acceptable evidence for loop-level modeling, but the BBPD reset/delay path should still be rebalanced before tapeout use.
The all-corner post-layout dead-zone command is:
make -C OpenPLL spice-bbpd-postlayout-deadzone-pvtThe PVT sweep uses the same filled BBPD RCX deck at tt, ff, ss, sf,
and fs with phase offsets of 0, 2, 5, 10, 20, 50, 100, 200, 500, and
1000 ps. One ss/feedback-leading 10 ps primary run hit an ngspice
final-time timestep failure at 20 ns, so the script retried that row with an
18 ns stop time; the first BBPD event is still fully measured.
Measured all-corner dead-zone summary:
| Corner | Zero-offset UP-DN skew |
Smallest correct REF-leading offset | Smallest correct FB-leading offset | Failed rows |
|---|---|---|---|---|
ff |
+9.724 ps | 2 ps | 10 ps | 0 |
fs |
+4.240 ps | 2 ps | 5 ps | 0 |
sf |
+26.404 ps | 2 ps | 50 ps | 0 |
ss |
+20.970 ps | 2 ps | 50 ps | 0 |
tt |
+13.464 ps | 2 ps | 20 ps | 0 |
Across the sampled PVT grid, reference-leading polarity is correct at the smallest tested 2 ps offset. Feedback-leading polarity needs up to 50 ps in the slow-skew corners because the current reset/delay path has a systematic UP-side offset.
The closed-loop command is:
make -C OpenPLL spice-pll-loop
make -C OpenPLL spice-pll-loop-filled-dcoThis is a PLL-level SPICE acquisition check, not a full extracted PLL post-layout simulation. The generated deck uses:
- The transistor-level Sky130 standard-cell BBPD subcircuits.
- A behavioral DCO frequency model derived from the no-fill post-layout DCO RCX smoke measurements: 50.944084 MHz at code 0 and 60.002956 MHz at code 255.
- An ideal feedback divider with
NDIV=5. - A numerical digital-code state driven by the BBPD
UPandDNpulse outputs. The real RTL loop filter is a fixed-point digital accumulator controlled byDLF_KIandDLF_KP; there is no physical loop current in the digital PLL.
The reset source is held deasserted for the full transient after the initial 5 ns release. Earlier long-window sampled-loop runs reused a periodic reset source that could assert again mid-run, so those sampled acquisition numbers are not treated as validation evidence.
The reference is 11.2 MHz, so the target DCO frequency is 56.0 MHz. The target 8-bit code for the measured no-fill post-layout DCO span is 142.320.
Measured loop-acquisition cases:
| Case | Start code | End code | Average frequency | Average error | Result |
|---|---|---|---|---|---|
| Low start | 0.0 | 144.590 | 55.991 MHz | -0.009 MHz | Pass |
| High start | 255.0 | 123.152 | 55.343 MHz | -0.657 MHz | Pass |
The pass gate checks that the code moves in the expected direction, the average frequency error over the final 500 ns is within 0.75 MHz, and the final code is within 32 LSB of the target code.
The filled-DCO calibrated command uses the same transistor-level BBPD and loop
harness, but replaces the no-fill endpoint DCO model with a smooth five-point
piecewise model fitted to the filled signoff RCX measurements: 46.256726 MHz at
code 0, 47.950391 MHz at code 64, 49.762118 MHz at code 128, 51.618437 MHz at
code 192, and 52.349831 MHz at code 255. It sets
REF=9.95242356154668 MHz with NDIV=5, so the target DCO frequency is the
measured filled code-128 frequency. The numerical code-slew setting is
24 LSB/us over an 18 us transient.
Measured filled-DCO calibrated loop-acquisition cases:
| Case | Start code | End code | Average frequency | Average error | Result |
|---|---|---|---|---|---|
| Low start | 0.0 | 145.117 | 50.413 MHz | +0.651 MHz | Pass |
| High start | 255.0 | 117.597 | 49.348 MHz | -0.414 MHz | Pass |
The sampled filled-DCO calibrated command is now a diagnostic target:
make -C OpenPLL spice-pll-loop-filled-dco-sampled
make -C OpenPLL spice-pll-loop-sampled-gain-sweep
make -C OpenPLL spice-pll-loop-sampled-pi-sweepIt uses the same five-point DCO model and BBPD cells, but updates the numerical
code state only around feedback-edge sample apertures. Its DLF_STEP=2.5
setting is interpreted as LSB/update, not as a physical current. This tests
sampled update-law sensitivity, but after the reset-source fix it is not a
promoted pass/fail validation target. The sampled PI model also includes a held
sampled BBPD decision and an optional DLF_PROP_LSB proportional offset;
DLF_PROP_LSB=1 is approximately the same immediate 8-bit DCO-code step as
RTL DLF_KP=4. By comparison, RTL DLF_KI=255 is only about 0.25 8-bit
DCO-code LSB per update, so large sampled-SPICE DLF_STEP values are
accelerated surrogate gains rather than literal RTL settings.
Measured reset-fixed sampled filled-DCO calibrated diagnostic cases:
| Case | Start code | End code | Average frequency | Average error | Result |
|---|---|---|---|---|---|
| Low start | 0.0 | 74.086 | 48.430 MHz | -1.332 MHz | Fail |
| High start | 255.0 | 113.513 | 49.352 MHz | -0.410 MHz | Pass |
Retuning DLF_STEP, sample delay, and simulation window without a proportional
term did not find a robust both-rail pass for this sampled surrogate. The useful
conclusion is that the LSB/update tests expose gain and sampling sensitivity;
they are not sufficient lock evidence without the proportional path.
The sampled gain sweep target records a reproducible 9-point reset-fixed grid
under build/spice_pll_sampled_gain_sweep/, using DLF_STEP values of 2.5,
3.0, and 3.5 LSB/update and sample delays of 0, 150, and 300 ps. It runs
independent ngspice decks in parallel with SPICE_PLL_SWEEP_JOBS and writes
sampled_gain_sweep.csv plus sampled_gain_summary.csv.
Measured I-only sampled gain-sweep summary:
DLF_STEP |
DLF_PROP_LSB |
Sample delay | Low result | High result | Max average error | Both pass |
|---|---|---|---|---|---|---|
| 3.5 | 0.0 | 150 ps | Fail, code 105.017 | Fail, code 160.820 | 0.952 MHz | No |
| 3.5 | 0.0 | 0 ps | Pass, code 121.981 | Fail, code 161.842 | 0.982 MHz | No |
| 3.5 | 0.0 | 300 ps | Fail, code 105.951 | Fail, code 162.543 | 1.002 MHz | No |
| 3.0 | 0.0 | 300 ps | Fail, code 91.457 | Fail, code 149.460 | 1.034 MHz | No |
| 3.0 | 0.0 | 0 ps | Fail, code 91.128 | Pass, code 141.136 | 1.044 MHz | No |
| 3.0 | 0.0 | 150 ps | Fail, code 91.045 | Pass, code 142.235 | 1.046 MHz | No |
| 2.5 | 0.0 | 300 ps | Fail, code 76.014 | Pass, code 112.995 | 1.280 MHz | No |
| 2.5 | 0.0 | 150 ps | Fail, code 74.086 | Pass, code 113.513 | 1.332 MHz | No |
| 2.5 | 0.0 | 0 ps | Fail, code 67.665 | Pass, code 113.356 | 1.504 MHz | No |
The sampled PI sweep target records a focused 16-point grid under
build/spice_pll_sampled_pi_sweep/, using DLF_STEP values of 3.0 and 3.5,
DLF_PROP_LSB values of 0, 1, 2, and 4, and sample delays of 0 and 150 ps.
This is the first sampled surrogate that passes both low-start and high-start
with the filled-DCO calibration.
Measured sampled PI passing rows:
DLF_STEP |
DLF_PROP_LSB |
Sample delay | Low result | High result | Max average error |
|---|---|---|---|---|---|
| 3.5 | 4.0 | 0 ps | Pass, code 123.443 | Pass, code 140.087 | 0.351 MHz |
| 3.5 | 4.0 | 150 ps | Pass, code 120.956 | Pass, code 145.106 | 0.496 MHz |
| 3.5 | 2.0 | 0 ps | Pass, code 127.003 | Pass, code 151.372 | 0.678 MHz |
| 3.0 | 2.0 | 150 ps | Pass, code 147.484 | Pass, code 143.238 | 0.686 MHz |
| 3.0 | 2.0 | 0 ps | Pass, code 147.368 | Pass, code 143.656 | 0.705 MHz |
The PI sweep supports the concern that P=0 is too weak or too slow in the
sampled surrogate. The best tested sampled-SPICE point uses
DLF_PROP_LSB=4. That maps to a sampled-loop proportional step rather than
directly to the RTL DLF_KP value: RTL DLF_KP=4 is about
DLF_PROP_LSB=1, while the current filled-DCO behavioral recommendation
DLF_KP=32 is stronger. The sampled PI sweep is therefore useful gain-tuning
evidence, not a final RTL gain setting.
Post-layout-BBPD in-loop diagnostics have also been attempted with the same filled-DCO calibrated behavioral model. The ngspice filled-BBPD RCX loop deck timed out after 240 s per case before reaching the 18 us acquisition window, so it produced no final code/frequency measurements. The PLL loop checker now has an Xyce waveform-output diagnostic path and a repeatable sweep target:
make -C OpenPLL spice-pll-loop-filled-bbpd-xyce-sweepThe sweep records continuous-loop Xyce diagnostics under
build/spice_pll_filled_bbpd_xyce_resolved_sweep/. Xyce treats the first
.TRAN value as the initial timestep, not a maximum timestep, so this target
now sets DTMAX=1 ns through the fourth .TRAN argument. The earlier 40 us
probe without an explicit DTMAX used only about 424 accepted timesteps and
could leave BBPD outputs latched for microseconds, so it is no longer used as
the primary filled-BBPD loop artifact.
With resolved timesteps, the current 4 us continuous-mode grid still does not find a both-rail passing filled-BBPD setting:
| Code slew | DTMAX |
Low result | High result | Max average error |
|---|---|---|---|---|
| 64 LSB/us | 1 ns | Fail, code 23.778 | Fail, code 242.918 | 2.746 MHz |
| 16 LSB/us | 1 ns | Fail, code 9.110 | Fail, code 245.354 | 3.272 MHz |
| 256 LSB/us | 1 ns | Fail, code 85.123 | Fail, code 0.000 | 3.505 MHz |
A separate 20 us polarity cross-check confirms that LOOP_SIGN=+1 is the only
polarity that moves both rails, while LOOP_SIGN=-1 leaves low-start at code
0 and high-start at code 255. The continuous-mode filled-BBPD in-loop Xyce path
is therefore a diagnostic artifact, not promoted lock validation. Runtime is the
limiting factor: the 4 us, DTMAX=1 ns two-rail probe needs roughly 110 s per
gain point on the current serial Xyce build. The installed Xyce reports
Serial from Xyce -capabilities; launching it with mpirun starts duplicate
serial processes, so the practical multicore path here is running independent
decks concurrently with the sweep scripts' --jobs option. With the
MPI-enabled Xyce at $XYCE_MPI_ROOT/bin/Xyce, set
XYCE_MPI_PROCS=N and reduce --jobs or SPICE_PLL_SWEEP_JOBS to avoid
oversubscription, then confirm the deck still converges.
The sampled filled-BBPD Xyce aperture diagnostic is:
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-aperture-sweepThis high-start-only sweep records DLF_STEP=3.5, DLF_PROP_LSB=4,
DTMAX=1 ns, sample delays 0 and 150 ps, and initial DCO phases 0, 0.25, 0.5,
and 0.75 cycles under
build/spice_pll_filled_bbpd_sampled_xyce_aperture_sweep/. The best 2 us row
is phase 0.25 cycles with 150 ps sample delay: high-start moves from code 255
to 216.733 with 2.143 MHz average error. Extending just that aperture to 8 us
under build/spice_pll_filled_bbpd_sampled_xyce_phase025_delay150_8us/ moves
from code 255 to 188.862 with 1.675 MHz average error.
Increasing the sampled integral step at the same aperture finds a passing two-rail filled-BBPD lock probe:
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-lockThat target uses the filled BBPD RCX deck, filled-DCO five-point behavioral
calibration, DLF_STEP=17.5, DLF_PROP_LSB=4, 150 ps sample delay, initial
DCO phase 0.25 cycles, 2.5 us simulation time, and DTMAX=1 ns. It passes with
low-start ending at code 100.826 and high-start ending at code 123.852; the
worst final-window average frequency error is 0.694 MHz. This is promoted
surrogate loop evidence for the filled BBPD macro, but it remains a fixed
aperture behavioral-DCO loop check rather than a full extracted PLL transient.
A follow-up robustness diagnostic at the same gain scanned initial DCO phases
0, 0.25, 0.5, and 0.75 cycles under
build/spice_pll_filled_bbpd_sampled_xyce_phase_robustness/. Only the original
0.25-cycle aperture passes both rails. Phase 0.0 fails low-start at code
176.589 while high-start passes at 152.904; phase 0.5 fails both rails at codes
190.611 and 206.283; phase 0.75 fails both rails at codes 207.462 and 255.000.
This makes the lock probe informative for polarity and one sampled aperture, but
not robust acquisition evidence across arbitrary initial phase.
The reproducible diagnostic targets are:
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-phase-robustness
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-phase-robustness-4us
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-prop8-phase-probeThe 4 us run of the same DLF_STEP=17.5, DLF_PROP_LSB=4 point does not fix
the phase sensitivity. It passes only the low-start rail at phase 0.5, passes
only the high-start rail at phase 0.25, and fails both rails at phases 0.0 and
0.75. A KP32-like sampled proportional probe with DLF_PROP_LSB=8 also fails
all four initial phases; the best row still passes only the high-start rail at
phase 0.25. These negative diagnostics are kept out of the promoted validation
gate.
A separate experimental sampled_latched SPICE surrogate was added to model a
first-pulse BBPD decision latch between feedback updates. At the same gain point,
both LOOP_SIGN=+1 and LOOP_SIGN=-1 fail the four-phase filled-BBPD Xyce
diagnostic, so this latch surrogate is not promoted as validation evidence.
The PVT loop-acquisition command is:
make -C OpenPLL spice-pll-loop-pvtThis command uses measured all-code DCO PVT spans from
build/spice_dco_pvt_all/dco_sweep.csv, selects target code 128 in each
corner, sets NDIV=5, and derives a per-corner reference from that target
frequency. A single fixed reference across all five corners is not checked here,
because the measured DCO PVT spans do not fully overlap. The generated SPICE
deck still uses the transistor-level Sky130 BBPD cell subcircuits, behavioral
DCO frequency model, ideal divider, and numerical digital-code surrogate
described above; it is not a full extracted PLL post-layout simulation.
The PVT target uses --code-slew-lsb-per-us 25, --sim-time-us 20, target
code 128, and an adaptive frequency tolerance of the larger of 1.0 MHz or 32
DCO LSBs for the measured corner span. The code-slew value is only a SPICE
loop-gain knob for the numerical code state; it is not a charge-pump current.
Measured PLL-level PVT acquisition cases:
| Corner | Case | Target frequency | Reference | End code | Average frequency | Average error | Result |
|---|---|---|---|---|---|---|---|
tt |
Low start | 116.382 MHz | 23.276 MHz | 141.034 | 117.928 MHz | +1.547 MHz | Pass |
tt |
High start | 116.382 MHz | 23.276 MHz | 110.906 | 113.570 MHz | -2.811 MHz | Pass |
ff |
Low start | 162.867 MHz | 32.573 MHz | 114.397 | 160.963 MHz | -1.904 MHz | Pass |
ff |
High start | 162.867 MHz | 32.573 MHz | 151.166 | 166.764 MHz | +3.897 MHz | Pass |
ss |
Low start | 76.654 MHz | 15.331 MHz | 119.629 | 75.862 MHz | -0.792 MHz | Pass |
ss |
High start | 76.654 MHz | 15.331 MHz | 126.633 | 76.857 MHz | +0.202 MHz | Pass |
sf |
Low start | 97.698 MHz | 19.540 MHz | 130.339 | 97.810 MHz | +0.112 MHz | Pass |
sf |
High start | 97.698 MHz | 19.540 MHz | 97.924 | 94.273 MHz | -3.425 MHz | Pass |
fs |
Low start | 123.055 MHz | 24.611 MHz | 137.170 | 124.313 MHz | +1.257 MHz | Pass |
fs |
High start | 123.055 MHz | 24.611 MHz | 112.145 | 120.424 MHz | -2.631 MHz | Pass |
All ten PVT rows pass the same direction-of-motion and final-window convergence checks. This improves loop-polarity/acquisition confidence across measured DCO PVT spans, but it remains a PLL-level surrogate rather than transistor-level closed-loop silicon extraction evidence.
The top-level behavioral acquisition command is:
make -C OpenPLL pll-top-model-acqThis is not SPICE. It instantiates IntegerPLL_Top with the behavioral DCO and
a two-flop delayed-reset behavioral BBPD model, so the loop is driven by
reference/feedback phase instead of an ideal code comparator. The default target
uses the modeled code-128 DCO frequency, MMDCLKDIV_RATIO=8,
REF=12.742100 MHz, DLF_KI=255, and the legacy DLF_KP=4.
The digital core captures raw BBPD UP/DN events in the PLLOUT domain and
feeds a held BBPD decision to the DLF. Capture state is flushed while the loop
is disabled or cleared, preventing stale pre-enable BBPD outputs from becoming
the first active command. The latch also prevents a captured UP or DN pulse from
being overwritten into 2'b11 during BBPD reset overlap, which the DLF treats
as idle.
Measured top-level behavioral acquisition cases:
| Case | Start code | End code | Lock time | Min code error | BBPD commands | Result |
|---|---|---|---|---|---|---|
| Low start | 0 | 127 | 37.408 us | 0 | 522 UP / 0 DN / 1927 idle | Pass |
| High start | 255 | 128 | 22.446 us | 0 | 95 UP / 95 DN / 2456 idle | Pass |
The filled-DCO calibrated top-level behavioral command is:
make -C OpenPLL pll-top-filled-dco-acqThis is also not SPICE. It uses the same top-level RTL and behavioral BBPD, but
enables the five-point filled-RCX DCO model, sets MMDCLKDIV_RATIO=8, uses
REF=6.220298 MHz for target code 128, and now selects the stronger
DLF_KI=255, DLF_KP=32 operating point.
Measured filled-DCO calibrated top-level behavioral acquisition cases:
| Case | Start code | End code | Lock time | Min code error | BBPD commands | Result |
|---|---|---|---|---|---|---|
| Low start | 0 | 136 | 70.244 us | 0 | 934 UP / 0 DN / 419 idle | Pass |
| High start | 255 | 136 | 66.519 us | 0 | 431 UP / 14 DN / 938 idle | Pass |
The filled-DCO calibrated top-level gain sweep command is:
make -C OpenPLL pll-top-filled-dco-gain-sweepThis sweep uses the same top-level RTL, behavioral BBPD, and five-point
filled-DCO model as pll-top-filled-dco-acq, but checks DLF_KI values 192
and 255 against DLF_KP values 0, 4, 8, 16, and 32. It writes
build/pll_top_filled_dco_gain_sweep/pll_top_gain_sweep.csv and
pll_top_gain_summary.csv.
Measured filled-DCO calibrated top-level gain sweep summary:
DLF_KI |
DLF_KP |
Low lock | High lock | Final codes | Max final error | Result |
|---|---|---|---|---|---|---|
| 192 | 4 | 99.541 us | 94.094 us | 129 / 127 | 1 | Pass |
| 255 | 8 | 74.385 us | 70.346 us | 126 / 130 | 2 | Pass |
| 255 | 16 | 73.003 us | 68.965 us | 132 / 132 | 4 | Pass |
| 192 | 16 | 96.776 us | 91.491 us | 132 / 132 | 4 | Pass |
| 255 | 32 | 70.244 us | 66.519 us | 136 / 136 | 8 | Pass |
| 192 | 32 | 93.153 us | 88.124 us | 136 / 136 | 8 | Pass |
| 192 | 8 | 98.673 us | 93.333 us | 115 / 130 | 13 | Pass |
| 192 | 0 | 100.571 us | 94.855 us | 138 / 113 | 15 | Pass |
| 255 | 4 | 75.076 us | 70.957 us | 129 / 112 | 16 | Pass |
| 255 | 0 | 75.768 us | 71.568 us | 109 / 134 | 19 | Fail |
The filled top-level phase model therefore supports more proportional gain than
the ideal-detector exact-code setting, but it does not support treating
DLF_KP=0 as a good filled-DCO operating point at DLF_KI=255: that row passes
through the target but ends outside the 16-code endpoint tolerance. DLF_KI=255,
DLF_KP=32 is the current filled-DCO operating recommendation because it is the
fastest passing row in this sweep, stays within eight final codes in the
top-level phase bench, and has transistor-level DLF cone evidence.
This closes the earlier gap where the gain sweep only proved the digital accumulator under an ideal sign detector. It still does not prove extracted closed-loop jitter or post-layout phase stability.
The digital gain-sweep command is:
make -C OpenPLL digital-loop-gain-sweepThis is not SPICE. It is RTL evidence for the real digital loop filter update
law using DLF_KI and DLF_KP. The testbench drives the synthesizable
IntegerPLL_DigitalCore with an ideal sign detector: when DCO_CODE is below
target it drives BBPD=2'b10, and when DCO_CODE is above target it drives
BBPD=2'b01. That isolates digital accumulator behavior and 8-bit code
acquisition from BBPD analog timing, which is validated separately by SPICE.
The current sweep target checks low-start and high-start acquisition from
DCO_CODE=0 and DCO_CODE=255 toward target code 128 using a corrected 200 us
behavioral window. The ideal sign detector is registered on
CLKDIV_RETIMED, so nonzero DLF_KP settings do not create a zero-delay
testbench feedback loop.
Measured digital gain-sweep summary:
DLF_KI |
DLF_KP |
Low lock | High lock | Final codes | Result |
|---|---|---|---|---|---|
| 64 | 0 | 150.308 us | 89.455 us | 128 / 128 | Pass |
| 64 | 4 | 148.561 us | 88.683 us | 128 / 128 | Pass |
| 128 | 4 | 74.324 us | 44.400 us | 128 / 128 | Pass |
| 255 | 0 | 37.846 us | 22.515 us | 128 / 128 | Pass |
| 255 | 2 | 37.627 us | 22.419 us | 128 / 128 | Pass |
| 255 | 4 | 37.408 us | 22.323 us | 127 / 128 | Pass |
| 255 | 16 | 36.102 us | 21.740 us | 121 / 127 | Pass within tolerance |
| 255 | 32 | 34.375 us | 20.948 us | 129 / 127 | Pass within tolerance |
The proportional path is scaled in 10-bit DLF_CODE LSBs, so DLF_KP=4 is
approximately one immediate 8-bit DCO_CODE correction. The exact-code
acquisition setting in this ideal bench is DLF_KI=255, DLF_KP=2, with
37.627 us worst-case lock. DLF_KP=32 is faster inside the loose +/-32-code
window and now leaves only one final code of error in the ideal detector bench;
in the filled-DCO top-level behavioral bench it is a faster bounded-error row,
not an exact endpoint row. The lowest-gain passing ideal-detector point remains
DLF_KI=64, DLF_KP=0, but it needs 150.308 us from the low-code start; with
the filled-DCO phase model, DLF_KI=255, DLF_KP=0 fails the 220 us endpoint
check. Final gain selection still needs extracted closed-loop jitter and
phase-stability validation.
A synthesized-DLF transistor-level static SPICE check now exists:
make -C OpenPLL spice-dlf-static
make -C OpenPLL spice-dlf-static-kp16
make -C OpenPLL spice-dlf-static-kp32It extracts the mapped Sky130 combinational proportional path from DLF state
and held BBPD decision input to top-level DCO_CODE. With a directly driven
mid-scale accumulator state and num_threads=4, the 109-cell static cone
passes the legacy proportional setting and both stronger-P candidates:
DLF_KI |
DLF_KP |
Case | Expected DCO code | Measured DCO code | Result |
|---|---|---|---|---|---|
| 255 | 4 | Hold | 128 | 128 | Pass |
| 255 | 4 | Increase | 129 | 129 | Pass |
| 255 | 4 | Decrease | 127 | 127 | Pass |
| 255 | 16 | Hold | 128 | 128 | Pass |
| 255 | 16 | Increase | 132 | 132 | Pass |
| 255 | 16 | Decrease | 124 | 124 | Pass |
| 255 | 32 | Hold | 128 | 128 | Pass |
| 255 | 32 | Increase | 136 | 136 | Pass |
| 255 | 32 | Decrease | 120 | 120 | Pass |
This is transistor-level Sky130 standard-cell evidence for the proportional DCO-code correction path, not a transient proof of the full sequential integrator update.
A synthesized-DLF transistor-level transient check also exists:
make -C OpenPLL spice-dlf-update
make -C OpenPLL spice-dlf-update-kp16
make -C OpenPLL spice-dlf-update-kp32
make -C OpenPLL spice-dlf-update-full-kp32-overlap
make -C OpenPLL spice-dlf-update-signoff-nl-kp32
make -C OpenPLL spice-dlf-update-signoff-spef-kp32
make -C OpenPLL spice-dlf-update-signoff-spef-rc-kp32
make -C OpenPLL spice-bbpd-dlf-integration
make -C OpenPLL spice-bbpd-dlf-integration-full
make -C OpenPLL spice-bbpd-dlf-integration-signoff-spef-rcThat check extracts the mapped Sky130 DCO-code/DLF sequential cone from
build/synth/IntegerPLL_DigitalCore_sky130.v, drives both PLLOUT and
CLKDIV_RETIMED, and verifies the BBPD decision-latch path plus DLF update. It
reduces the 906-cell mapped digital core to a 330-cell DCO-code update cone for
the current KP32 run, uses Xyce with a 45 ns transient window, and verifies real
accumulator/code response. The pass/fail metric now uses the directional
response-window code as well as the final code, because the proportional term
can be a transient correction while DLF_KI=255 moves the exported 8-bit
DCO_CODE by less than one LSB per update. The overlap rows drive the first raw
BBPD polarity, then force raw BBPD=2'b11 before the enabled update edge; they
verify that the synthesized first-decision latch keeps the original polarity
rather than turning the reset-overlap interval into an idle command:
DLF_KI |
DLF_KP |
Case | Expected movement | Measure time | Start code | End code | Response code | Result |
|---|---|---|---|---|---|---|---|---|
| 255 | 32 | Increase | Up | 44.0 ns | 128 | 128 | 136 | Pass |
| 255 | 32 | Decrease | Down | 44.0 ns | 128 | 127 | 88 | Pass |
| 255 | 32 | UP then 2'b11 |
Up | 44.0 ns | 128 | 128 | 136 | Pass |
| 255 | 32 | DN then 2'b11 |
Down | 44.0 ns | 128 | 127 | 88 | Pass |
A heavier overlap-only target also runs the same reset-overlap update check through the full mapped 906-cell digital-core netlist:
make -C OpenPLL spice-dlf-update-full-kp32-overlapFor DLF_KI=255, DLF_KP=32, the full-core Xyce run passes the UP and DN
reset-overlap response checks. scripts/spice_dlf_update_check.py accepts
--jobs, and the Makefile DLF-update targets pass SPICE_PLL_SWEEP_JOBS, so
independent cases can run concurrently on multiple cores.
A post-PnR final-netlist cone target also reads the signed-off LibreLane netlist:
make -C OpenPLL spice-dlf-update-signoff-nl-kp32That target first runs check-librelane-signoff, then extracts the DCO-code
update cone from
openlane/IntegerPLL_DigitalCore/runs/librelane_signoff/final/nl/IntegerPLL_DigitalCore.nl.v.
The final netlist contains filler/decap/antenna cells and post-PnR single-line
instance syntax; the shared SPICE parser handles that form and extracts a
540-cell DLF cone. The transient schedule is compressed to a 24 ns window so
the 6658-device, 22328-unknown decks finish cleanly on the serial Xyce build:
DLF_KI |
DLF_KP |
Source netlist | Case | Expected movement | Measure time | Start code | End code | Response code | Result |
|---|---|---|---|---|---|---|---|---|---|
| 255 | 32 | final signoff netlist, 540-cell cone | Increase | Up | 23.0 ns | 128 | 128 | 152 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | Decrease | Down | 23.0 ns | 128 | 127 | 0 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | UP then 2'b11 |
Up | 24.0 ns | 128 | 128 | 152 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | DN then 2'b11 |
Down | 24.0 ns | 128 | 127 | 0 | Pass |
This is transistor-level Sky130 standard-cell evidence from the final post-PnR gate netlist. It still does not include SPEF interconnect parasitics in the transient deck and is not a full extracted PLL loop simulation.
The corresponding lumped-SPEF-capacitance target is:
make -C OpenPLL spice-dlf-update-signoff-spef-kp32It uses the same final netlist cone and adds the nominal OpenROAD SPEF total
capacitance for every modeled cone net as a lumped capacitor to VGND. The
current run adds capacitance on 582 routed nets, 2678.819 fF total. The decks
contain 540 standard-cell instances plus 582 CSPEF_* capacitors; Xyce reports
7240 total devices for the inc_mid deck. The four KP32 rows pass:
DLF_KI |
DLF_KP |
Source netlist | SPEF model | Case | Expected movement | Measure time | Start code | End code | Response code | Result |
|---|---|---|---|---|---|---|---|---|---|---|
| 255 | 32 | final signoff netlist, 540-cell cone | 582 lumped caps, 2678.819 fF | Increase | Up | 23.0 ns | 128 | 128 | 152 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | 582 lumped caps, 2678.819 fF | Decrease | Down | 23.0 ns | 128 | 127 | 0 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | 582 lumped caps, 2678.819 fF | UP then 2'b11 |
Up | 24.0 ns | 128 | 128 | 152 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | 582 lumped caps, 2678.819 fF | DN then 2'b11 |
Down | 24.0 ns | 128 | 127 | 0 | Pass |
This is stronger post-route loading evidence than the final-netlist-only deck, but the lumped-capacitance deck still does not insert interconnect resistance between individual cell pins.
The distributed-RC SPEF target is:
make -C OpenPLL spice-dlf-update-signoff-spef-rc-kp32It substitutes SPEF instance-pin nodes into the same final-netlist cone, inserts
the nominal SPEF resistance tree, and grounds the current-net capacitance at
the reported SPEF nodes. Coupling entries are represented as grounded
capacitance at the current-net endpoint so the reduced cone does not require
neighbor nets outside the DLF cone. The current decks contain 540 standard-cell
instances, 2056 substituted SPEF pin nodes, 3373 CSPEF_* capacitors, and
2513 RSPEF_* resistors; Xyce reports 12544 total devices and 25527 unknowns
for the inc_mid deck. The four KP32 rows pass:
DLF_KI |
DLF_KP |
Source netlist | SPEF model | Case | Expected movement | Measure time | Start code | End code | Response code | Result |
|---|---|---|---|---|---|---|---|---|---|---|
| 255 | 32 | final signoff netlist, 540-cell cone | distributed RC, 3373 caps, 2513 resistors | Increase | Up | 23.0 ns | 128 | 128 | 152 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | distributed RC, 3373 caps, 2513 resistors | Decrease | Down | 23.0 ns | 128 | 127 | 32 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | distributed RC, 3373 caps, 2513 resistors | UP then 2'b11 |
Up | 24.0 ns | 128 | 128 | 152 | Pass |
| 255 | 32 | final signoff netlist, 540-cell cone | distributed RC, 3373 caps, 2513 resistors | DN then 2'b11 |
Down | 24.0 ns | 128 | 127 | 32 | Pass |
This is the strongest current post-route transistor-level evidence for the digital DLF update cone. It is still not a full extracted PLL loop transient.
BBPD-to-DLF integration targets drive the mapped DLF update path from the filled post-layout BBPD RCX macro instead of ideal raw BBPD sources:
make -C OpenPLL spice-bbpd-dlf-integration
make -C OpenPLL spice-bbpd-dlf-integration-full
make -C OpenPLL spice-bbpd-dlf-integration-signoff-spef-rcThe BBPD macro is driven by one reference pulse and one divided-feedback pulse;
its BBPD[1:0] outputs directly drive the mapped DLF update logic. The reduced
target uses the DCO-code update cone, while the full target uses all 906 mapped
digital-core cells. The BBPD reset is held until DLF_En=1 and DLF_Clear=0,
matching the top-level reset policy. The DLF update clock remains a boundary
source, so this is a BBPD-output/DLF-input integration check, not a closed
oscillator loop.
| Scope | DLF_KI |
DLF_KP |
BBPD RCX case | Expected movement | Measure time | Start code | End code | Response code | Result |
|---|---|---|---|---|---|---|---|---|---|
| 330-cell cone | 255 | 32 | REF leads feedback | Up | 44.0 ns | 128 | 128 | 136 | Pass |
| 330-cell cone | 255 | 32 | Feedback leads REF | Down | 44.0 ns | 128 | 127 | 88 | Pass |
| 906-cell full core | 255 | 32 | REF leads feedback | Up | 44.0 ns | 128 | 128 | 136 | Pass |
| 906-cell full core | 255 | 32 | Feedback leads REF | Down | 44.0 ns | 128 | 127 | 0 | Pass |
| 540-cell final DLF cone + distributed SPEF RC | 255 | 32 | REF leads feedback | Up | 42.0 ns | 128 | 136 | 152 | Pass |
| 540-cell final DLF cone + distributed SPEF RC | 255 | 32 | Feedback leads REF | Down | 42.0 ns | 128 | 120 | 32 | Pass |
The final-DLF-cone integration deck combines the filled BBPD RCX macro with the post-route distributed-RC DLF cone in one Xyce transient. Each deck contains the BBPD RCX subcircuit, 540 digital-cell instances, 2056 substituted SPEF pin nodes, 3373 grounded SPEF capacitance entries, and 2513 SPEF resistors. Xyce reports 14455 total devices and 30746 unknowns for these integration decks.
On the current serial Xyce build, the refreshed full-core BBPD-RCX cases took
about 306 s each when run concurrently as independent simulator processes. An
MPI-enabled Xyce build is installed at $XYCE_MPI_ROOT/bin/Xyce,
but that build currently aborts at the first 25 ps step on the full mapped
standard-cell DLF deck, so the promoted full-core DLF artifacts use the serial
XYCE binary.
The mapped-loop smoke target closes the short feedback path through the filled BBPD RCX macro and all 906 mapped digital-core cells:
make -C OpenPLL spice-pll-mapped-loop-smokeIt uses the mapped MMD divider to generate CLKDIV_RETIMED, the filled BBPD
RCX macro to compare that feedback clock against REF, and the mapped DLF to
update DCO_CODE. The DCO itself is still the five-point behavioral model
fitted to filled-DCO RCX measurements, so this is not a full extracted PLL
transient. The target uses phase-selected initial DCO states to verify both
first-correction polarities in a 180 ns window:
| Case | Initial DCO phase | Start code | End code | Response code | Expected movement | Result |
|---|---|---|---|---|---|---|
| Low start | 0.0 cycles | 0.0 | 8.0 | 8.0 | Up | Pass |
| High start | 0.25 cycles | 255.0 | 247.0 | 247.0 | Down | Pass |
The installed Xyce binary reports Serial; spice-pll-mapped-loop-smoke
therefore uses SPICE_PLL_SWEEP_JOBS to run the independent low/high decks
concurrently instead of trying to parallelize a single transient solve. The
same target will use per-deck MPI only when XYCE_MPI_PROCS is set with an
MPI-enabled Xyce binary.
spice-pll-mapped-loop-gain-sweep keeps the same full mapped digital core,
filled BBPD RCX macro, and behavioral filled-DCO calibration, starts at code
128, and sweeps the proportional gain under a phase-selected upward decision:
make -C OpenPLL spice-pll-mapped-loop-gain-sweepMeasured 180 ns mapped-loop gain response:
DLF_KI |
DLF_KP |
Check mode | Start code | End code | Response delta | Result |
|---|---|---|---|---|---|---|
| 255 | 0 | No motion | 128.0 | 128.0 | 0.0 | Pass |
| 255 | 4 | Motion | 128.0 | 129.0 | 1.0 | Pass |
| 255 | 8 | Motion | 128.0 | 130.0 | 2.0 | Pass |
| 255 | 16 | Motion | 128.0 | 132.0 | 4.0 | Pass |
| 255 | 32 | Motion | 128.0 | 136.0 | 8.0 | Pass |
This is useful gain-tuning evidence through the mapped divider, filled BBPD, and mapped DLF. It is still behavioral on the DCO side; the extracted-DCO mid-code KP0/KP32 anchors below check the two most important endpoints with the filled DCO RCX macro.
The mapped-loop generator also has extracted-DCO startup smoke targets:
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-startup
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-startup-mpi4-kluThis instantiates the filled DCO RCX macro on the mapped DCO_THERM[254:0]
decoder outputs, keeps the filled BBPD RCX macro in the loop, and labels rows
as dco_model=postlayout_rcx. The promoted target uses serial Xyce
(``) with uic plus a VPWR/VPB rail ramp. In this 50 ns
startup window the digital loop filter has not yet enabled, so the DCO code and
response code remain effectively 0; this is oscillator startup evidence in the
coupled mapped deck, not closed-loop code correction or lock evidence.
| Case | Xyce | Mapped cells | BBPD | DCO | PLLOUT rises after 15 ns | Startup period | Startup frequency | Result |
|---|---|---|---|---|---|---|---|---|
| Low start | Serial | 906 | Filled RCX | Filled RCX | 2 | 21.616261729 ns | 46.261467988 MHz | Pass |
| Low start | MPI4, -linsolv KLU |
906 | Filled RCX | Filled RCX | 2 | 21.616261760 ns | 46.261467923 MHz | Pass |
The MPI4 KLU startup row uses
$XYCE_MPI_ROOT/bin/Xyce -linsolv KLU and records a 4-processor
timing summary. In these targets, "MPI4" means four MPI ranks launched by
mpirun -np 4, not four Xyce threads. It completed the same 50 ns startup deck
in 226.138 s elapsed time, compared with 440.731 s for the serial startup run on
the recorded validation environment. Four ranks are the current empirical default, not a proven
optimum. A short 12 ns extracted-DCO debug timing sweep with the MPI/KLU binary
measured 169.042 s at 1 rank, 123.398 s at 2 ranks, 84.596 s at 4 ranks,
68.961 s at 8 ranks, and 57.493 s at 16 ranks; a 32-rank launch failed because
Open MPI exposed only 16 slots by default. Those 12 ns rows are timing-only
debug runs, not functional validation rows, because the window captures only one
PLLOUT rise. The follow-on FRAC=6 260 ns trend rows below confirm that 16
ranks improve wall time on real extracted-DCO loop decks while preserving the
same endpoint behavior.
The longer extracted-DCO first-correction smoke targets are:
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-motion
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-motion-mpi4-kluThese run the same coupled mapped-core, filled-BBPD-RCX, filled-DCO-RCX deck
to 180 ns from both rails. Both serial and MPI4/KLU cases pass the directional
first-correction check with DLF_KI=255, DLF_KP=32, and
MMDCLKDIV_RATIO=2:
| Case | Xyce | Start code | Response code | End code | Integrator start/end | Corrected-code dwell | Startup frequency | Expected movement | Result |
|---|---|---|---|---|---|---|---|---|---|
| Low start | Serial | 0.0 | 8.0 | 8.0 | 0.00 / 0.00 | 41.612512 ns at code 8 | 46.213639188 MHz | Up | Pass |
| High start | Serial | 255.0 | 166.034845 | 255.0 | 255.00 / 254.75 | 37.150000 ns at code 247 | 51.952310560 MHz | Down | Pass |
| Low start | MPI4, -linsolv KLU |
0.0 | 8.0 | 8.0 | 0.00 / 0.00 | 41.609479 ns at code 8 | 46.234150122 MHz | Up | Pass |
| High start | MPI4, -linsolv KLU |
255.0 | 166.034845 | 255.0 | 255.00 / 254.75 | 37.150000 ns at code 247 | 51.952310820 MHz | Down | Pass |
The high-start waveform includes a stable code-247 dwell interval in the
response window before returning to the high rail by 179 ns. The visible
DCO_CODE response includes the proportional term; the integrator columns show
that the accumulated loop state has moved by at most 0.75 DCO-code LSB in this
short window. The MPI4/KLU first-correction rows completed in 692.448 s
low-start and 512.197 s high-start elapsed time in the recorded validation environment. These
180 ns runs prove startup, feedback divider activity, filled-BBPD decision
propagation, and first DLF output movement through the full 906-cell mapped
digital core. They are still not lock or acquisition validation.
The integrator-trend targets extend the MPI4/KLU extracted-DCO decks to 260 ns:
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-low-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-high-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-high-phase0p5-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-progress-500ns-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-progress-en85-probe-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-ki192-kp8-probe-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-en85-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac5-extracted-dco-progress-300ns-probe-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-midcode-inc-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-extracted-dco-midcode-kp0-hold-mpi4-kluThey keep the same loop settings and initial phases as the first-correction
rows. Low start keeps visible DCO_CODE at code 8 after the first proportional
correction, while the internal DLF integrator advances from 0.00 to 0.25 DCO-code
units by 259 ns. High start ends at visible code 246, reaches a minimum
integrator code of 254.00 DCO-code units, and dwells for 56.925000 ns in the
code-246/247 band. The rows record 11 and 13 PLLOUT rises, 46.220481051 MHz
and 52.482096017 MHz startup frequencies, and 818.450 s and 691.313 s elapsed
wall time in the recorded validation environment. This is the current strongest extracted-DCO loop
evidence because it shows the slow integral state accumulating in both
directions, but it is still far short of full acquisition or lock.
The FRAC=6 extracted-DCO trend companion uses the current gain-tuning candidate
netlist with 889 mapped cells and DLF_KI=255, DLF_KP=32. Low start ends at
visible code 9 after 260 ns, with the integrator moving from 0.00 to 1.75
DCO-code units. High start still ends at visible code 246, but the integrator
ends at 254.00 instead of 254.75 and the measured code no longer dips to the old
code-166 transient. The rows record 11 and 13 PLLOUT rises, 46.225404681 MHz
and 52.447728469 MHz startup frequencies, and 800.325 s and 669.374 s elapsed
wall time. This strengthens the case that FRAC=6 increases integral motion in
the coupled extracted-DCO deck, but it still does not prove acquisition or lock.
The audited MPI16 companion rows use the same FRAC=6 netlist, KLU solver, loop
gains, initial phases, and 260 ns windows. They reproduce the MPI4 endpoints and
integrator motion: low start still ends at code 9 with integrator 1.75, and high
start still ends at code 246 with integrator 254.00. They reduce elapsed wall
time to 568.490 s low-start and 467.746 s high-start, speedups of 1.408x and
1.431x versus the MPI4 rows. This makes 16 MPI ranks the better default for
future long FRAC=6 extracted-DCO diagnostics on this host, but it is an
acceleration result rather than new lock evidence.
spice-pll-mapped-loop-frac6-extracted-dco-progress-500ns-mpi16-klu extends
the FRAC=6 extracted-DCO rail-start check to 500 ns using two concurrent
MPI16/KLU Xyce jobs. Low start moves visible code 0 to 15, with the integrator
moving 0.00 to 7.75, 22 startup PLLOUT rises, and 46.243607848 MHz tail
frequency. High start moves visible code 255 to 240, with the integrator moving
255.00 to 248.00, 25 startup PLLOUT rises, and 53.072273197 MHz tail
frequency. The rows took 1473.445 s and 1408.858 s wall time when run
concurrently. This is stronger true rail-start extracted-DCO progress than the
260 ns trend rows, but both tails remain more than 3 MHz from the
49.762117808 MHz target, so it is not acquisition or lock evidence.
spice-pll-mapped-loop-frac6-extracted-dco-progress-en85-probe-mpi16-klu is a
non-promoted rail-start release-phase probe. It repeats the FRAC=6 rail-start
deck with DLF_En=85 ns, matching the enable timing that helps the local
near-high lock row. That timing is not a global rail-start improvement:
low-start only shows a transient response to code 8 and returns to code 0 by
299 ns, with integrator 0.75 and a 46.204983633 MHz tail. High-start moves
255 to 244 with integrator 252.00 and a 53.133254162 MHz tail. The result says
the enable-85 setting is useful for the phase-selected near-high local check but
should not replace the default rail-start progress target.
spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-mpi16-klu adds a
bounded near-lock extracted-DCO check using lock_window mode. It starts from
code 128 with FRAC=6, DLF_KI=255, DLF_KP=32, runs 220 ns with MPI16/KLU, and
requires code 127..140 plus tail PLLOUT frequency within 0.25 MHz of the
49.762117808 MHz target over 139..219 ns. The passing artifact ends at code
137, integrator 129.75, measures 49.676823500 MHz over four tail rises, and has
0.085294 MHz tail error with 79.725 ns dwell in the code-136/137 band. This is
the strongest extracted-DCO near-lock evidence so far, but it starts near target
and is not rail-to-rail acquisition.
spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-ki192-kp8-probe-mpi16-klu
is a non-promoted lower-P gain diagnostic based on the lower endpoint error seen
in the filled-DCO behavioral top sweep. It runs the same extracted-DCO mid-code
deck with DLF_KI=192, DLF_KP=8, a tighter 127..132 code window, and a
0.15 MHz tail-frequency bound. The artifact fails cleanly: code moves 128 to
131, the integrator moves 128.00 to 129.50, and the tail measures
49.488441487 MHz, 0.273676 MHz below target. This reduces visible code
overshoot but gives worse extracted tail accuracy than the promoted KP32 row,
so it is useful gain-tuning evidence rather than a replacement setting.
spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-probe-mpi16-klu is
an intentionally non-promoted high-side diagnostic using --allow-fail. It
starts from code 160 and requires downward motion plus the same 0.25 MHz tail
frequency bound. The current artifact fails cleanly: code moves 160 to 169,
integrator 160.00 to 161.75, and the tail frequency is 50.602594662 MHz,
0.840477 MHz above target. This says the 220 ns extracted loop still has a
phase-driven upward transient from this nominally high local start; it is a
tuning/phase diagnostic, not lock evidence.
spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-en85-mpi16-klu
repeats that high-side start with DLF_En=85 ns, after the REF edge and before
the feedback edge. This flips the first captured BBPD decision to DN. The 380 ns
MPI16/KLU artifact passes lock_window: code moves 160 to 146, the integrator
moves 160.00 to 154.00, and the tail over 299..379 ns measures
50.001270745 MHz, 0.239153 MHz above target, with four tail rises. The waveform
stays inside the configured 128..161 code band across the lock window and then
dwells for 48.675 ns in the final code-146..148 band. Together with the
mid-code upward row this is stronger two-sided near-lock evidence, but it is
still phase-selected and not rail-start acquisition.
Repeating the FRAC=6 extracted-DCO high-start trend at an initial DCO phase of
0.5 cycles produced the same endpoint and waveform sequence as the 0.25-cycle
row: visible code 255 to 246, integrator 255.00 to 254.00, 13 PLLOUT rises,
52.447728469 MHz startup frequency, and 667.423 s elapsed wall time. That makes
the phase-0.5 row a useful robustness/negative diagnostic, not evidence of
faster high-start convergence.
spice-pll-mapped-loop-extracted-dco-midcode-inc-mpi4-klu starts the same
MPI4/KLU extracted-DCO deck at DLF/DCO code 128 and uses an initial phase that
requests an upward correction. In the 79-179 ns measurement window it moves
visible DCO_CODE from 128 to 136, holds the internal integrator at 128.00, and
dwells at code 136 for 47.250000 ns. This is useful proportional-path and gain
polarity evidence from a non-saturated code, but it does not replace the
low/high 260 ns integral-trend checks or prove lock.
spice-pll-mapped-loop-extracted-dco-midcode-kp0-hold-mpi4-klu reruns the same
mid-code upward-decision extracted-DCO deck with DLF_KP=0. It finishes cleanly
under MPI4/KLU, but visible DCO_CODE stays at 128 for the entire 79-179 ns
measurement window, with 99.725000 ns of code-128 dwell and the internal
integrator still at 128.00. This is promoted as gain-contrast evidence: it
supports the stronger-P choice by showing that the otherwise identical short
extracted loop has no observable 8-bit correction when the proportional path is
disabled.
The promoted artifact audit also measures PLLOUT in the 119-179 ns tail window
of those same two extracted-DCO mid-code waveforms. The KP32 row averages
49.699374052 MHz while the otherwise identical KP0 row averages 49.464265788 MHz,
a 0.235108264 MHz separation. This ties the visible proportional code response to
measured oscillator frequency, but it is still a short-window gain contrast, not
closed-loop acquisition or lock.
The MPI-enabled Xyce binary at $XYCE_MPI_ROOT/bin/Xyce needs an
explicit direct-solver override for this mixed mapped-core plus DCO-RCX deck.
Without -linsolv KLU, the same binary leaves sampled DCO_THERM_0,
DCO_THERM_127, DCO_THERM_128, and DCO_THERM_254 low even at one rank
after the rail reaches 1.8 V, and PLLOUT never starts. With -linsolv KLU,
the 4-rank startup and first-correction decks match the corresponding serial
response metrics. Any future extracted acquisition artifacts still need the
same MPI/KLU-vs-serial correlation before promotion.
The final-signoff functional-netlist mapped-loop smoke target is:
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-smokeThis uses the final digital-core signoff netlist rather than the synthesized mapped netlist. For Xyce compatibility it drops physical-only tap, fill, decap, and antenna diode cells from the final netlist; the simulated functional core contains 1614 mapped standard-cell instances and skips 4029 physical-only instances. The filled BBPD RCX macro and behavioral filled-DCO model are the same as the mapped-loop smoke above, so this is still not a full extracted PLL transient.
| Case | Initial DCO phase | Functional cells | Skipped physical-only cells | Start code | End code | Response code | Expected movement | Result |
|---|---|---|---|---|---|---|---|---|
| Low start | 0.0 cycles | 1614 | 4029 | 0.0 | 0.0 | 8.0 | Up | Pass |
| High start | 0.25 cycles | 1614 | 4029 | 255.0 | 254.0 | 190.0 | Down | Pass |
The hard-top-SPEF loaded mapped-loop smoke target is:
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-smokeThis uses the hard-top-consistent FRAC=6 force-to-mid final digital-core
signoff netlist, DLF_KI=160, DLF_KP=8, and the MPI-enabled Xyce/KLU binary
with four ranks per rail-start case. It keeps 2020 functional mapped cells,
drops 4138 physical-only cells, and adds lumped nominal hard-macro-top SPEF
capacitance on 261 loop/inter-macro nets. The modeled top-level load totals
27097.842 fF and covers all 255 DCO thermometer interconnects. The behavioral
DCO observes the loaded DCO_THERM bus rather than the debug DCO_CODE bus,
matching the hard DCO macro control interface.
| Case | Xyce ranks | Initial DCO phase | Functional cells | Hard-top SPEF cap nets | Hard-top SPEF cap total | Start code | End code | Response code | Expected movement | Result |
|---|---|---|---|---|---|---|---|---|---|---|
| Low start | 4 | 0.0 cycles | 2020 | 261 | 27097.842 fF | 0.0 | 20.0 | 22.0 | Up | Pass |
| High start | 4 | 0.5 cycles | 2020 | 261 | 27097.842 fF | 255.0 | 233.0 | 233.0 | Down | Pass |
This promotes top-level loop-net loading evidence into the mapped-loop smoke, but it is still a lumped-SPEF behavioral-DCO transient. It does not replace a full closed-loop hard-macro-top extracted transient.
The optional distributed hard-top SPEF RC startup diagnostic is:
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-startup-diagnosticThis uses the same final signoff netlist, gains, and hard-top SPEF, but keeps the selected hard-top loop/inter-macro nets as distributed RC. The generated low-start deck covers 261 hard-top SPEF nets, emits 1752 grounded capacitance nodes and 1657 resistors, substitutes 260 digital-core pins onto SPEF endpoint nodes, and covers all 255 DCO thermometer interconnects. The selected capacitance is 27097.841 fF, matching the lumped-cap smoke within rounding.
| Case | Xyce ranks | Check | Functional cells | Hard-top SPEF nets | Cap nodes | Resistors | Digital pin substitutions | PLLOUT rises | Startup frequency | Result |
|---|---|---|---|---|---|---|---|---|---|---|
| Low start | 16 | Startup, 60 ns | 2020 | 261 | 1752 | 1657 | 260 | 3 | 46.270645 MHz | Pass |
Rank-count timing on the same generated 60 ns deck was 223.14 s at one Xyce process, 132.59 s at four MPI ranks, 104.51 s at eight ranks, 90.09 s at 16 ranks, and 132.82 s at 32 hardware-thread ranks. This makes 16 ranks the best tested setting for this distributed-RC diagnostic on the current host. The diagnostic is useful topology evidence, but it is not a two-rail motion check and not a full extracted hard-macro-top closed-loop transient.
The extracted-DCO companion diagnostic is:
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-startup-diagnosticIt keeps the same final force-to-mid signoff digital-core netlist and distributed hard-top SPEF RC, then replaces the behavioral DCO with filled DCO RCX. The 50 ns low-start deck has 2020 functional mapped cells, skips 4138 physical-only cells, covers the same 261 hard-top SPEF nets, emits 1752 grounded capacitance nodes and 1657 resistors, substitutes 260 digital pins, and includes 27097.841 fF of selected hard-top capacitance. The Xyce log reports 63443 total devices and 182651 unknowns.
| Case | Xyce ranks | Check | Functional cells | Skipped physical-only cells | Hard-top SPEF nets | Cap nodes | Resistors | Digital pin substitutions | PLLOUT rises | Startup frequency | Result |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Low start | 16 | Extracted DCO startup, 50 ns | 2020 | 4138 | 261 | 1752 | 1657 | 260 | 2 | 46.202763 MHz | Pass |
The measured PLLOUT period is 21.643727 ns after the 15 ns startup measurement
point. The first full Xyce/MPI16/KLU run completed in about 225.884 s, and the
promoted make target uses --resume for repeat validation. This is stronger
elaboration and startup evidence for the combined extracted-DCO plus hard-top RC
deck, but it is still not a two-rail motion/lock check and not full extracted
hard-macro-top closed-loop signoff.
The extracted-DCO first-motion companion targets are:
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-motion-low-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-motion-high-diagnosticThey extend the same final signoff digital-core, BBPD RCX, DCO RCX, and
distributed hard-top SPEF RC deck through the first post-enable DLF update.
DLF_En releases at 85 ns and both motion checks measure 84..99 ns. The low
start moves upward from code 0 to code 2, and the high start moves downward from
code 255 to code 253, proving two-sided first closed-loop code motion in the
combined extracted-DCO plus hard-top RC deck.
| Case | Xyce ranks | Check | Functional cells | Skipped physical-only cells | Hard-top SPEF nets | Cap nodes | Resistors | Digital pin substitutions | Start code | End code | Response code | Startup frequency | Result |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Low start | 16 | Extracted DCO first motion, 100 ns | 2020 | 4138 | 261 | 1752 | 1657 | 260 | 0.0 | 2.0 | 2.0 | 46.150194 MHz | Pass |
| High start | 16 | Extracted DCO first motion, 100 ns | 2020 | 4138 | 261 | 1752 | 1657 | 260 | 255.0 | 253.0 | 253.0 | 50.278137 MHz | Pass |
The Xyce log reports the same 63443 total devices and 182651 unknowns as the startup deck. The low-start 100 ns transient took 487.306 s Xyce elapsed time, and high-start took 538.010 s. This is stronger than startup-only evidence, but it is still a first-update diagnostic rather than rail-start acquisition, lock, or PVT signoff.
The parallel EINVP hard-top extracted-DCO diagnostics are:
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-startup-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-motion-low-early-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-motion-high-early-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-midcode-lock-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-corner-midcode-lock-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-low-progress-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-high-progress-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-low-lock-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-high-lock-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-pvt-midcode-hold-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-pvt-midcode-lock-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-pvt-ff-low-lock-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-pvt-ff-high-lock-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-pvt-ss-low-lock-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-rc-extracted-dco-pvt-ss-high-lock-diagnosticThese replace the NAND-load DCO RCX deck and hard-top SPEF/SPICE with the
IntegerPLL_DCO_EINVP RCX deck and the signed-off
IntegerPLL_HardMacroTop_EINVP extracted views. The selected E hard-top nets
cover all 255 DCO thermometer interconnects, 261 SPEF nets, 1744 capacitance
nodes, 1627 resistors, 260 digital pin substitutions, and 25247.633 fF selected
capacitance. The Xyce logs report 65871 total devices and 184445 unknowns.
| Case | Xyce ranks | Check | Functional cells | Skipped physical-only cells | Hard-top SPEF nets | Cap nodes | Resistors | Digital pin substitutions | Start code | End code | Response code | Startup frequency | Tail frequency | Result |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Low start | 16 | EINVP extracted-DCO startup, 50 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 0.0 | 0.0 | 0.0 | 50.813495 MHz | - | Pass |
| Low start | 16 | EINVP early first motion, 90 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 0.0 | 2.0 | 2.0 | 50.809027 MHz | - | Pass |
| High start | 16 | EINVP early first motion, 90 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 255.0 | 243.019510 | 243.019510 | 67.502112 MHz | - | Pass |
| Mid start | 16 | EINVP hard-top-loaded extracted-DCO lock window, 220 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 128.0 | 125.0 | 128.0 | 58.324010 MHz | 58.591120 MHz | Pass |
| Mid start min RC | 16 | EINVP hard-top-loaded extracted-DCO min-SPEF lock window, 220 ns | 2020 | 4138 | 261 | 1668 | 1551 | 260 | 128.0 | 125.0 | 128.0 | 58.318588 MHz | 58.500163 MHz | Pass |
| Mid start max RC | 16 | EINVP hard-top-loaded extracted-DCO max-SPEF lock window, 220 ns | 2020 | 4138 | 261 | 1905 | 1798 | 260 | 128.0 | 125.0 | 128.0 | 58.336931 MHz | 58.549789 MHz | Pass |
| Low start | 16 | EINVP hard-top-loaded extracted-DCO rail progress, 360 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 0.0 | 62.0 | 62.0 | 51.881504 MHz | 53.728266 MHz | Pass |
| High start | 16 | EINVP hard-top-loaded extracted-DCO rail progress, 360 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 255.0 | 172.0 | 172.0 | 65.751529 MHz | 62.952232 MHz | Pass |
| Low start | 16 | EINVP hard-top-loaded extracted-DCO lock window, 900 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 0.0 | 122.0 | 128.0 | 55.376858 MHz | 58.485654 MHz | Pass |
| High start | 16 | EINVP hard-top-loaded extracted-DCO lock window, 760 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 255.0 | 132.0 | 126.0 | 62.186448 MHz | 58.804895 MHz | Pass |
| Mid start FF | 16 | EINVP hard-top-loaded extracted-DCO mid-code hold, 220 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 128.0 | 128.0 | 128.0 | 81.388343 MHz | 81.712756 MHz | Pass |
| Mid start SS | 16 | EINVP hard-top-loaded extracted-DCO mid-code hold, 200 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 128.0 | 128.0 | 128.0 | 38.570381 MHz | 38.846037 MHz | Pass |
| Mid start FF | 16 | EINVP hard-top-loaded extracted-DCO PVT lock window, 220 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 128.0 | 134.0 | 134.0 | 81.306357 MHz | 81.575035 MHz | Pass |
| Mid start SS | 16 | EINVP hard-top-loaded extracted-DCO PVT lock window, 240 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 128.0 | 126.0 | 128.0 | 38.594707 MHz | 38.821045 MHz | Pass |
| Low start FF | 16 | EINVP hard-top-loaded extracted-DCO PVT low-rail lock window, 700 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 0.0 | 122.0 | 128.0 | 76.646281 MHz | 81.480028 MHz | Pass |
| High start FF | 16 | EINVP hard-top-loaded extracted-DCO PVT high-rail lock window, 700 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 255.0 | 127.0 | 127.0 | 86.972748 MHz | 82.095815 MHz | Pass |
| Low start SS | 16 | EINVP hard-top-loaded extracted-DCO PVT low-rail lock window, 1400 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 0.0 | 122.0 | 128.0 | 37.073168 MHz | 38.769491 MHz | Pass |
| High start SS | 16 | EINVP hard-top-loaded extracted-DCO PVT high-rail lock window, 1400 ns | 2020 | 4138 | 261 | 1744 | 1627 | 260 | 255.0 | 127.0 | 127.0 | 40.786273 MHz | 39.009555 MHz | Pass |
The E first-motion checks use an early diagnostic enable timing
(DLF_En=40 ns, measurement window 39..89 ns) because the default enable-85
100 ns low-start probe did not leave enough active decision window for this E
DCO phase/startup condition. This is two-sided first-motion evidence for the
integrated E top. The mid-start extracted-DCO lock-window row uses the same
distributed-RC E hard-top deck and retargets REF to 29.286759 MHz, matching
the measured hard-top-loaded E DCO tail rather than the standalone E DCO code
128 target. The standalone-target diagnostic is intentionally not promoted:
it holds code 125..128 but measures 58.573518 MHz, 1.601361 MHz below the
standalone 60.174879 MHz target. The promoted loaded-target row holds code
125..128 in the 150..219 ns lock window with 0.017601 MHz frequency error.
Repeating that same near-lock deck with the E hard-top min/max SPEF views also
passes: min SPEF selects 23096.023 fF, holds code 125..128, and measures
58.500163 MHz with 0.073355 MHz error; max SPEF selects 27119.190 fF, holds
code 125..128, and measures 58.549789 MHz with 0.023730 MHz error.
The loaded-target progress rows use normal DLF_En=85 ns. Low start moves
code 0->62 over 84..359 ns and reaches code 42..62 in the 280..359 ns late
window; high start moves code 255->172 and reaches code 172..192 in the same
late window. This is two-sided rail-escape extracted-DCO progress evidence,
not PVT signoff. The low/high rail-start lock rows use the same loaded
reference and normal enable timing. Low start runs to 900 ns, reaches code
122..128 in the 760..899 ns tail window, and measures 58.485654 MHz with
0.087865 MHz target error. High start runs to 760 ns, reaches code 126..132 in
the 650..759 ns tail window, and measures 58.804895 MHz with 0.231377 MHz
target error. This is TT nominal two-sided extracted-DCO rail-start lock
evidence. The FF/SS midpoint hold rows use DLF_KI=0 and DLF_KP=0 to keep
the extracted loop at code 128 while applying FF or SS device models through
the filled BBPD RCX, filled IntegerPLL_DCO_EINVP RCX, and nominal
distributed hard-top SPEF RC. They calibrate hard-top-loaded code-128
frequencies for later PVT lock targets. The FF/SS PVT lock-window rows then
enable the normal loop gains (DLF_KI=160, DLF_KP=8) at those calibrated
references: FF stays in code 125..134 with 0.137721 MHz tail error, and SS
stays in code 126..128 with 0.024993 MHz tail error. This is near-lock
closed-loop PVT evidence through the FF/SS device models and nominal E hard-top
distributed RC. Extending the FF case from both rails to 700 ns also passes:
low start moves code 0->122, holds code 122..128 in the 580..699 ns tail
window, and measures 81.480028 MHz with 0.232728 MHz target error. High start
moves code 255->127, holds code 127..133 in the same tail window, and measures
82.095815 MHz with 0.383059 MHz target error. This is FF two-rail PVT
acquisition evidence. Extending the SS case from the low rail to 1400 ns also
passes: it moves code 0->122, holds code 122..128 in the 1160..1399 ns tail
window, and measures 38.769491 MHz with 0.076546 MHz target error. The SS
high-rail 1400 ns diagnostic also passes: it moves code 255->127, holds code
127..133 in the 1160..1399 ns tail window, and measures 39.009555 MHz with
0.163517 MHz target error. Together these rows close FF/SS two-rail
extracted-loop PVT lock evidence for the nominal E hard-top distributed-RC
view.
The calibrated EINVP hard-top behavioral-DCO lock-window diagnostics are:
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-lock-low-diagnostic
make -C OpenPLL spice-pll-mapped-loop-signoff-nl-hardtop-einvp-spef-lock-high-diagnosticThese use the signed-off IntegerPLL_HardMacroTop_EINVP nominal SPEF as
lumped top-level capacitance, the final force-to-mid digital-core netlist, the
filled BBPD RCX deck, and a piecewise behavioral DCO fitted to the measured
IntegerPLL_DCO_EINVP five-point RCX table. They are calibrated hard-top loop
checks, separate from the mid-code extracted-DCO row and not rail-start
extracted-DCO signoff.
| Case | Xyce ranks | DCO model | Start code | End code | Response code | Lock observed codes | Tail frequency | Tail abs error | Result |
|---|---|---|---|---|---|---|---|---|---|
| Low start | 16 | EINVP five-point behavioral | 0.0 | 122.0 | 128.0 | 121..128 | 59.936383 MHz | 0.238496 MHz | Pass |
| High start | 16 | EINVP five-point behavioral | 255.0 | 133.0 | 124.0 | 126..133 | 60.235253 MHz | 0.060373 MHz | Pass |
The promoted initial-phase sweep for that same mapped-loop deck is:
make -C OpenPLL spice-pll-mapped-loop-phase-sweepIt runs both rail-start cases at common initial DCO phases 0, 0.25, 0.5,
and 0.75 cycles. The target now uses the same 180 ns window as the smoke
target and the refreshed sweep passes both rail starts at all four tested
phases:
| Initial DCO phase | Low-start response | High-start response | Result |
|---|---|---|---|
| 0.0 cycles | 8.0 | 246.0 | Pass |
| 0.25 cycles | 8.0 | 247.0 | Pass |
| 0.5 cycles | 8.0 | 246.0 | Pass |
| 0.75 cycles | 8.0 | 247.0 | Pass |
This keeps the mapped-loop result in the right category: it is useful electrical connectivity and first-correction polarity evidence across the tested initial phases, but it is not full extracted PLL lock evidence.
spice-pll-mapped-loop-progress-1us extends the same full mapped digital core,
filled BBPD RCX macro, and behavioral filled-DCO model to 1 us with DLF_KI=255,
DLF_KP=32, phase-selected rail starts, and the MPI-enabled Xyce/KLU binary:
make -C OpenPLL spice-pll-mapped-loop-progress-1usMeasured 1 us mapped-loop progress:
| Case | Start code | End code | Response code | Integrator start/end | Start error | End error | Result |
|---|---|---|---|---|---|---|---|
| Low start | 0.0 | 9.0 | 9.0 | 0.00 / 1.75 | -3.505392 MHz | -3.267220 MHz | Pass, progress only |
| High start | 255.0 | 243.0 | 145.808033 | 255.00 / 251.25 | +2.587713 MHz | +2.448400 MHz | Pass, progress only |
This is not a lock result. It proves that the filled-BBPD/mapped-DLF loop keeps responding beyond the first correction and reduces absolute frequency error from both rails, but the final frequency error remains multiple MHz after 1 us. The promoted MPI4/KLU run completed in 356.177 s for low start and 445.105 s for high start, compared with 611.898 s and 751.432 s for the earlier serial Xyce artifact with identical endpoint metrics. The current KP32 setting is therefore too slow for short-window acquisition in this mapped SPICE deck even though MPI makes the evidence less expensive to reproduce.
A non-promoted KP128 500 ns diagnostic confirms the proportional-path tradeoff. Low start reaches response code 33 but ends back at code 0, and high start reaches response code 157.999 but ends back at code 255. The integrator only moves from 0.00 to 1.50 and from 255.00 to 254.25 over that window. Stronger P therefore gives a larger visible transient correction, but by itself does not solve slow held-code convergence from the rails.
The existing RTL already has a DLF_FRAC_WIDTH parameter, so a FRAC=6 candidate
was tested as an integral-gain scaling option without changing the exported
8-bit DCO code. The diagnostic commands are:
make -C OpenPLL digital-loop-gain-sweep-frac6
make -C OpenPLL pll-top-filled-dco-gain-sweep-frac6
make -C OpenPLL spice-pll-mapped-loop-frac6-progress-1us
make -C OpenPLL spice-pll-mapped-loop-frac6-high-phase-500ns
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi4-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-progress-500ns-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-progress-en85-probe-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-ki192-kp8-probe-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-en85-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-probe-mpi16-klu
make -C OpenPLL digital-loop-gain-sweep-frac6-acqboost-s2a3
make -C OpenPLL pll-top-filled-dco-gain-sweep-frac6-acqboost-s2a3
make -C OpenPLL spice-pll-mapped-loop-frac6-acqboost-s2a3-progress-1us
make -C OpenPLL spice-pll-mapped-loop-frac6-acqboost-s2a3-extracted-dco-progress-300ns-probe-mpi16-klu
make -C OpenPLL digital-loop-gain-sweep-frac5
make -C OpenPLL pll-top-filled-dco-gain-sweep-frac5
make -C OpenPLL spice-pll-mapped-loop-frac5-progress-1us
make -C OpenPLL spice-pll-mapped-loop-frac5-extracted-dco-progress-300ns-probe-mpi16-klu
make -C OpenPLL digital-loop-gain-sweep-frac4
make -C OpenPLL pll-top-filled-dco-gain-sweep-frac4
make -C OpenPLL spice-pll-mapped-loop-frac4-progress-500nsBehavioral FRAC=6 results are strong: the ideal digital-loop sweep finds
DLF_KI=255, DLF_KP=32 as the fastest row with 10.063 us worst-case lock and
one final code of error, while DLF_KI=255, DLF_KP=4 reaches exact final
codes with 10.822 us worst-case lock. The filled-DCO top behavioral sweep finds
DLF_KI=192, DLF_KP=8 as the best endpoint row, ending at code 129 from both
rails with 24.963 us worst-case lock and one final code of error; the faster
DLF_KI=255, DLF_KP=32 row locks within 17.901 us but ends at codes 135 and
121.
Mapped-cell SPICE with the filled BBPD RCX macro is more phase/asymmetry
sensitive. The FRAC=6, DLF_KI=255, DLF_KP=32 mapped behavioral-DCO run uses
889 synthesized Sky130 cells, MPI4 Xyce/KLU, and the same 1 us rail-start
window. Low start improves from code 0 to 20, with the integrator moving from
0.00 to 12.75 and frequency error improving from -3.505392 MHz to
-2.976122 MHz. High start now uses the phase 0.5 initial DCO state selected by
the 500 ns high-start phase sweep; it improves from code 255 to 233, with
response code 224.000870, integrator movement from 255.00 to 241.00, and
frequency error improving from +2.587713 MHz to +2.332306 MHz.
An optional same-direction acquisition boost has been added to the DLF and is
disabled by default (DLF_ACQ_BOOST_SHIFT=0). With FRAC=6,
DLF_ACQ_BOOST_SHIFT=2, and DLF_ACQ_BOOST_AFTER=3, the ideal digital-loop
sweep reduces worst-case lock from 10.063 us to 2.870 us for DLF_KI=255,
DLF_KP=32; the lowest-gain passing row in that boosted sweep is
DLF_KI=128, DLF_KP=8 at 5.663 us. The filled-DCO top behavioral sweep
passes both rails for DLF_KI=255, DLF_KP=32 with 5.598 us worst-case lock,
ending at codes 119 and 121. The boosted Sky130 mapped core synthesizes to 970
cells and improves the 1 us mapped behavioral-DCO SPICE row: low-start ends at
code 40 with integrator 40.75 and 46.828179717 MHz tail frequency, while
high-start ends at code 215 with integrator 223.00 and 52.127168500 MHz tail
frequency. A 300 ns postlayout-RCX DCO follow-up with MPI16/KLU confirms the
direction but not the behavioral-model acceleration: low-start moves from code
0 to 10 with integrator 2.75 and 46.200651370 MHz tail frequency, while
high-start moves from code 255 to 245 with integrator 253.00 and
53.168326147 MHz tail frequency. This is only a small improvement over the
non-boosted 300 ns extracted-DCO probe, so acquisition boost remains
non-promoted.
Shorter boost thresholds were also checked as diagnostics. With
DLF_ACQ_BOOST_AFTER=1, DLF_KI=192, and DLF_KP=32, the filled-DCO
top-level behavioral sweep passes, but the mapped behavioral-DCO SPICE probe
rail-collapses the high-start case to the low side before the measurement
window and fails. With DLF_ACQ_BOOST_AFTER=2, DLF_KI=192, and
DLF_KP=32, the mapped behavioral-DCO probe passes weakly, ending at 0->18
and 255->236 in 1 us. The 300 ns postlayout-RCX DCO follow-up is still weak:
low-start ends at code 12 with integrator 4.50 and 46.217968866 MHz tail
frequency, while high-start ends at code 245 with integrator 253.50 and
53.163603778 MHz tail frequency. This points away from pure digital gain
boosting and toward BBPD/update cadence or analog-loop timing as the rail-start
bottleneck.
The promoted mapped behavioral-DCO rail-start candidate adds three default-off
DLF controls: DLF_PROP_RAIL_GUARD=1, DLF_ACQ_RAIL_BOOST=1, and
DLF_ACQ_FORCE_RAIL_CODE=127. The force-to-mid setting deterministically walks
the integral state inward until the 8-bit DCO code reaches the mid-code
neighborhood, then returns control to the normal BBPD PI loop. The Sky130
configuration also keeps DCO_CONTROL_REGISTERED=1, so the binary and
thermometer DCO controls are sampled before they reach the DCO macro boundary.
The reproducible promoted commands are:
make -C OpenPLL digital-loop-gain-sweep-frac6-force127-s4a2
make -C OpenPLL pll-top-filled-dco-gain-sweep-frac6-force127-s4a2
make -C OpenPLL synth-frac6-force127-s4a2
make -C OpenPLL spice-pll-mapped-loop-frac6-force127-s4a2-extracted-dco-progress-500ns-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-force127-s4a2-extracted-dco-lock-820ns-mpi16-klu
make -C OpenPLL librelane-signoff-force127-s4a2
make -C OpenPLL check-librelane-signoff-force127-s4a2
make -C OpenPLL spice-pll-mapped-loop-frac6-force127-s4a2-final-nl-extracted-dco-motion-220ns-mpi16-klu
make -C OpenPLL spice-pll-mapped-loop-frac6-force127-s4a2-final-nl-extracted-dco-lock-820ns-mpi16-kluThe filled-DCO top behavioral sweep with
DLF_FRAC_WIDTH=6, DLF_ACQ_BOOST_SHIFT=4, DLF_ACQ_BOOST_AFTER=2, and
DLF_ACQ_FORCE_RAIL_CODE=127 passes all 63 tested gain points from both rails.
The promoted nonzero-P row is DLF_KI=160, DLF_KP=8, ending at codes 128/127
with 2.010 us worst-case behavioral lock and 1-code worst final error. The
direct Yosys Sky130 mapped core for the registered-control configuration has
1307 cells and 13733.171200 square microns. The added area is dominated by the
255 registered thermometer outputs.
The companion LibreLane force-to-mid signoff run,
librelane-signoff-force127-s4a2, also passes
check-librelane-signoff-force127-s4a2. The final registered-control artifact
has 3164 standard cells, 30.0674% utilization, 67207 microns routed wire length,
13321 routed vias, 2.794 ns worst setup slack, 0.115 ns worst hold slack, zero
DRC/LVS/STA/power-grid violations, 3.431 mW reported total power, and 0.706 mV
worst IR drop.
The older 2 us mapped behavioral-DCO endpoint run is no longer promoted for the
registered-control configuration. A rerun with the binary DCO_CODE observer
showed that mapped binary bus transitions can create misleading low-code
samples even when the endpoint is near code 127, and the high-start deck hit the
1800 s timeout. A rerun with the thermometer observer is more faithful to the
DCO macro interface, but both rail-start decks hit the 2400 s timeout before
completing the 2 us transient. The target is therefore diagnostic only; the
promoted current closed-loop evidence comes from the extracted-DCO checks below.
The companion 500 ns extracted-DCO progress target uses the same force-to-mid mapped core, the filled BBPD RCX macro, and the filled DCO RCX macro in the loop. It runs Xyce/KLU with 16 MPI ranks per deck and two rail-start decks in parallel. Low-start moves from code 0 to 102 with integrator code 0 to 100; high-start moves from code 255 to 153 after dipping as low as code 129, with integrator code 255 to 155. The measured tail frequencies over 119..499 ns are 47.499330 MHz for low-start and 51.553235 MHz for high-start, with 2.262788 MHz and 1.791117 MHz absolute error from the 49.762118 MHz target. The elapsed times were 1499.251 s and 1400.832 s.
The registered-control extracted-DCO lock-window target extends the same setup
to 820 ns and observes the registered thermometer bus. It uses
check_mode=lock_window, full-window DCO-code bounds 112..144 from 700..819 ns,
and a 0.8 MHz tail-frequency tolerance. Low-start passes with tail-window code
122..128, 49.350349 MHz tail frequency, and 0.411769 MHz absolute error.
High-start passes with tail-window code 127..133, 49.505000 MHz tail frequency,
and 0.257118 MHz absolute error. The runs used 16 Xyce/KLU MPI ranks per deck,
two rail-start decks in parallel, and elapsed times of 3431.210 s and
3410.386 s. This is the current strongest TT rail-start extracted-DCO
closed-loop evidence, though it is still a targeted 820 ns window rather than a
full PVT or multi-microsecond extracted PLL signoff.
The force-to-mid final-signoff-netlist extracted-DCO targets use the LibreLane force127 final Verilog netlist, omit physical-only filler/decap/tap cells, and keep the filled BBPD and DCO RCX macros in the loop. The SPICE deck contains 2020 functional mapped digital-core cells and skips 4138 physical-only cells. The shorter 220 ns rail-start motion check passes: low-start moves code 0->22 with 46.417721 MHz tail frequency, and high-start moves code 255->222 with 52.724539 MHz tail frequency. The stronger 820 ns lock-window target then uses Xyce/KLU with 16 MPI ranks per deck and two decks in parallel, checks the 700..819 ns tail against code bounds 112..144 and a 0.8 MHz frequency-error limit, and passes both rails. Low-start ends at code 128 with tail-window code 122..128, 49.364473 MHz tail frequency, and 0.397645 MHz absolute error. High-start ends at code 132 with tail-window code 126..132, 49.488494 MHz tail frequency, and 0.273624 MHz absolute error. The Xyce logs report total elapsed run times of 5135.0 s and 5328.51 s. This is the strongest current post-PnR final-functional-netlist TT closed-loop lock-window evidence, though it is still not full extracted PVT or multi-microsecond rail-start signoff.
That update-cadence hypothesis was tested with an optional
DLF_UPDATE_ON_PLLOUT mode. The default remains unchanged, but the diagnostic
mode clocks the DLF from PLLOUT and advances the integrator on a delayed
sampled divider-update pulse, while preserving the held proportional term. For
the Sky130 hard-top path this is a rebuilt digital-core macro variant, not a
runtime-selectable option on the shipped configured wrapper. With
FRAC=6 and no boost, the ideal digital-loop sweep passes both rails with
DLF_KI=255, DLF_KP=32 at 10.074 us worst-case lock and 16-code final error;
the filled-DCO top behavioral sweep prefers DLF_KI=192, DLF_KP=8, ending at
codes 129/124 with 24.795 us worst-case lock. Combining PLLOUT-update mode with
DLF_ACQ_BOOST_SHIFT=2, DLF_ACQ_BOOST_AFTER=2 gives a better top behavioral
candidate: DLF_KI=192, DLF_KP=32 ends at 137/120 with 6.363 us worst-case
lock.
The mapped behavioral-DCO SPICE result for that fast+boost candidate is not
good enough to promote to extracted-DCO simulation. The synthesized diagnostic
core has 975 cells and 6434.921600 square microns. With DLF_KI=192,
DLF_KP=32, the 1 us mapped run ends low-start at code 0 after a transient
maximum of 15, with integrator 0.00->3.00 and 46.379830515 MHz tail frequency;
high-start improves to 255->217 with integrator 255.00->225.00 and
52.177702655 MHz tail frequency. A lower-gain DLF_KI=128, DLF_KP=8 repeat
does not fix low-start: it ends 0->2 after a transient maximum of 126, while
high-start only reaches 238. Waveform inspection shows alternating low-start
BBPD decisions that repeatedly clamp the proportional output back to the low
rail. The fast-update mode is therefore useful evidence, but not yet a
rail-start solution.
The companion 500 ns FRAC=6 high-start phase sweep shows why this is still diagnostic evidence rather than a promoted setting: phases 0 and 0.25 end near code 243, phase 0.5 holds the best endpoint at code 241, and phase 0.75 snaps back to code 255 after a transient response to code 134.001867. FRAC=6 is now a stronger gain-tuning candidate than the default FRAC=8 for this phase-selected mapped behavioral-DCO run, but it still needs all-phase robustness and extracted DCO loop validation before promotion.
The extracted-DCO FRAC=6 260 ns trends now provide that first coupled check.
Compared with the default-FRAC extracted trends, low-start improves visible code
8 to code 9 and increases integrator movement from 0.25 to 1.75 DCO-code units;
high-start remains at visible code 246 but ends with one full code of integrator
movement instead of 0.25. This is useful extracted-loop gain evidence, not lock.
The 500 ns MPI16/KLU rail-start progress row strengthens that trajectory: low
start reaches code 15 with integrator 7.75, and high start reaches code 240 with
integrator 248.00. It is still far from target, with 46.243607848 MHz and
53.072273197 MHz tail frequencies, so longer-window acquisition remains open.
The MPI16/KLU mid-code lock-window row adds a complementary near-target check:
starting from code 128, it stays inside code 127..140 and measures a
49.676823500 MHz tail frequency against the 49.762117808 MHz target over the
139..219 ns window. A lower-P KI=192, KP=8 diagnostic stays closer in code
at 131 but misses the tighter tail-frequency bound with 49.488441487 MHz,
supporting KP32 as the stronger extracted near-lock choice for now. That local
evidence does not replace rail-start acquisition. The enable-85 high-side companion
starts at code 160 and moves down to code 146 with 0.239153 MHz tail error over
299..379 ns, while the default-enable high-side probe still moves the wrong way
to code 169. This points to BBPD release phase/timing as a remaining condition:
the extracted loop has useful two-sided near-lock evidence, but not robust
rail-start lock.
Follow-up FRAC=5 and FRAC=4 probes bracket that result. In the filled-DCO top
behavioral sweep, FRAC=5 DLF_KI=96, DLF_KP=8 has the cleanest endpoint
row, ending at code 129 from both rails in 24.963 us worst case; FRAC=5
DLF_KI=192, DLF_KP=32 is faster at 12.042 us but ends at code 121 from both
rails. FRAC=4 DLF_KI=192, DLF_KP=32 is faster again at 6.214 us worst case
but still ends at code 121 from both rails in the top model.
Mapped-cell SPICE does not promote either stronger setting. FRAC=4
DLF_KI=192, DLF_KP=32 improves low-start to code 14 in 500 ns, but
high-start snaps back to code 255 after a transient response to code 230.471517.
FRAC=5 DLF_KI=192, DLF_KP=32 needs a longer DLF clear window in the deck so
the high-start seed is captured deterministically. With that setup, the 500 ns
high-start case improves from code 255 to 235, but the 1 us two-rail run ends at
code 5 from low-start after a transient to 20.565868 and at code 239 from
high-start after a transient to 224.000000. These rows are useful negative
gain-tuning evidence: stronger integral scaling helps some transients, but
FRAC=6 remains the best mapped behavioral-DCO candidate so far because it holds
more low-start progress and a better high-start 1 us endpoint.
spice-pll-mapped-loop-frac5-extracted-dco-progress-300ns-probe-mpi16-klu
repeats the FRAC=5 DLF_KI=192, DLF_KP=32, NDIV=2,
clear-100 ns / enable-130 ns setup with the postlayout-RCX DCO and two
concurrent MPI16/KLU Xyce jobs. It passes the motion check cleanly, but it does
not improve the promoted FRAC=6 extracted-DCO evidence: low-start moves code 0
to 8 with 46.190967911 MHz tail frequency, and high-start moves code 255 to 244
with 53.231394237 MHz tail frequency over the 129..299 ns measurement window.
The tail errors remain 3.571150 MHz and 3.469276 MHz from the 49.762117808 MHz
target, so this is reproducible gain-scaling evidence rather than lock or
acquisition validation. The rows took 1080.527 s and 840.300 s elapsed; both
logs include a timing summary for 16 processors.
Longer 220 ns Xyce and ngspice diagnostic runs are still expensive. The default
serial XYCE binary reports Serial in Xyce -capabilities, but the
longer mapped-loop targets use the MPI-enabled build at
$XYCE_MPI_ROOT/bin/Xyce with -linsolv KLU: older promoted
targets use 4 ranks, while the FRAC=6 extracted-DCO MPI16 trend and lock-window
diagnostics use 16 ranks, including the enable-85 high-side lock-window row and
the force-to-mid extracted-DCO progress and 820 ns registered-control
lock-window rows, plus the EINVP hard-top-loaded mid-code extracted-DCO
lock-window row, FF/SS hard-top-loaded mid-code extracted-DCO PVT lock-window
rows, EINVP hard-top-loaded low/high extracted-DCO progress rows, the EINVP
hard-top-loaded low/high extracted-DCO lock-window rows, and calibrated EINVP
behavioral hard-top lock-window rows. The old
30 ns ngspice direct-clock inc_mid run with KI=255, KP=4, and a 90 s
wall-clock limit timed out after 90.191 s; the same bounded run with
num_threads=4 also timed out after 90.191 s. The passing Xyce targets
therefore validate the DCO code update path, BBPD-to-DLF interface, a short
feedback-divider-included mapped-loop smoke, a final-signoff functional-netlist
mapped-loop smoke, a four-phase first-correction sweep, 1 us progress with a
behavioral DCO, the FRAC=6 force-to-mid 500 ns extracted-DCO rail-start progress
probe, and the FRAC=6 force-to-mid 820 ns registered-control extracted-DCO
lock-window probe. The
serial and MPI4-KLU extracted-DCO targets add startup and both-rail
first-correction evidence in the coupled mapped deck, but the extracted
closed-loop evidence is still targeted TT validation rather than full PVT
extracted PLL signoff.
The decoder check uses the mapped Sky130 netlist from make synth and extracts
the backward cone for selected thermometer taps. The refreshed current-RTL
artifacts were run after synthesis of the mapped digital core
and written under build/spice_decoder_current,
build/spice_decoder_full_taps_current, and
build/spice_decoder_all_taps_current. The full-tap target verifies all 255
DCO_THERM outputs at important adjacent and boundary codes; the all-code,
all-tap target verifies every 8-bit DCO_CODE value against every thermometer
tap with a batched ngspice DC sweep.
Command:
make -C OpenPLL spice-dco-decoderAll-code command:
make -C OpenPLL spice-dco-decoder-allFull-tap boundary command:
make -C OpenPLL spice-dco-decoder-full-tapsExhaustive all-code, all-tap command:
make -C OpenPLL spice-dco-decoder-all-tapsMeasured sampled-tap operating-point cases:
| DCO code | Checked taps | Expected high taps | Measured high taps | Result |
|---|---|---|---|---|
| 0 | 0, 1, 2, 126, 127, 128, 253, 254 | 8 | 8 | Pass |
| 1 | 0, 1, 2, 126, 127, 128, 253, 254 | 7 | 7 | Pass |
| 2 | 0, 1, 2, 126, 127, 128, 253, 254 | 6 | 6 | Pass |
| 127 | 0, 1, 2, 126, 127, 128, 253, 254 | 4 | 4 | Pass |
| 128 | 0, 1, 2, 126, 127, 128, 253, 254 | 3 | 3 | Pass |
| 254 | 0, 1, 2, 126, 127, 128, 253, 254 | 1 | 1 | Pass |
| 255 | 0, 1, 2, 126, 127, 128, 253, 254 | 0 | 0 | Pass |
The extracted sampled decoder cone contains 47 Sky130 cells from the mapped digital core. This validates the synthesized decoder polarity at the low-end, midpoint, and high-end 8-bit code boundaries. The exhaustive all-code/all-tap DC sweep below supersedes the older sampled-tap all-code run for current-RTL coverage.
Measured full-tap operating-point cases:
| DCO code | Checked taps | Expected high taps | Measured high taps | Result |
|---|---|---|---|---|
| 0 | all 255 | 255 | 255 | Pass |
| 1 | all 255 | 254 | 254 | Pass |
| 2 | all 255 | 253 | 253 | Pass |
| 127 | all 255 | 128 | 128 | Pass |
| 128 | all 255 | 127 | 127 | Pass |
| 254 | all 255 | 1 | 1 | Pass |
| 255 | all 255 | 0 | 0 | Pass |
The extracted full-tap decoder cone contains 366 Sky130 cells from the mapped digital core. This validates every DCO thermometer output at the low-end, midpoint, and high-end 8-bit code boundaries. Its CSV has 8 rows: one header plus one passing row for each checked code.
The exhaustive all-code, all-tap target uses a batched ngspice DC sweep of the
same 366-cell decoder cone. It validates all 256 DCO_CODE values against all
255 DCO_THERM outputs. Its CSV has 257 rows: one header plus one passing row
for each 8-bit code. The measured high-count sequence is 255, 254, ..., 1, 0,
with no per-tap errors recorded.
Validated so far:
- Sky130 transistor models and
sky130_fd_sc_hdSPICE subcircuits load successfully in ngspice and Xyce for the tested decks. - The DCO starts and oscillates in transient simulation.
- The 8-bit control path has working endpoint and midpoint configurations.
- The representative nonfilled tuning curve is monotonic for the tested top-level
DCO_CODEvalues. - The full 256-code nonfilled TT tuning curve is monotonic in transient SPICE simulation.
- The top-level DCO load polarity is validated: increasing
DCO_CODEreduces the enabled load count. In the current filled RCX deck, frequency increases through code 224 but rolls off at the all-off endpoint. - A synthesized Sky130 DCO decoder cone has SPICE operating-point validation for sampled thermometer taps at low-end, midpoint, and high-end 8-bit code boundaries.
- A synthesized Sky130 DCO decoder cone has all-255-tap SPICE operating-point validation at low-end, midpoint, and high-end 8-bit code boundaries.
- A synthesized Sky130 DCO decoder cone has all-code, all-255-tap SPICE DC
sweep validation for every 8-bit
DCO_CODEvalue. - Endpoint DCO operation is validated across
tt,ff,ss,sf, andfscorners. - Full 256-code DCO operation is validated across
tt,ff,ss,sf, andfs, with monotonic tuning in every corner. - The BBPD produces the correct wider output pulse for reference-leads and feedback-leads cases.
- The current BBPD-decision-latch digital core has post-layout signoff artifacts,
including GDS, SPEF,
extracted LVS SPICE, Magic/KLayout DRC, and Netgen LVS, with zero
route/DRC/LVS/timing/DRV violations reported by
make -C OpenPLL check-librelane-signoff. - The DCO macro has a filled, signoff-clean GDS/SPEF/LVS/DRC result and a Magic RCX transistor-level post-layout deck.
- A filled signoff DCO RCX five-point transient smoke run passes in Xyce at
DCO_CODE0, 64, 128, 192, and 255, measuring 46.257 MHz, 47.950 MHz, 49.762 MHz, 51.618 MHz, and 52.350 MHz from printedPLLOUTcrossings. The consolidated calibration check passes with a 6.093 MHz span and 23.895 kHz/LSB average five-point step. - A filled signoff DCO RCX TT 9-point characterization passes at
DCO_CODE0, 32, 64, 96, 128, 160, 192, 224, and 255. It records positive gain from code 0 through code 224, a 52.565854 MHz peak at code 224, and a bounded 0.216023 MHz high-code roll-off to 52.349831 MHz at code 255. - A focused filled signoff DCO RCX high-code tail characterization passes at
DCO_CODE192, 208, 216, 224, 232, 240, 248, 250, 252, 254, and 255. It localizes the TT peak at code 240, measuring 53.003796 MHz, and records a 0.653965 MHz roll-off to 52.349831 MHz at code 255. - A pre-layout DCO load-style candidate comparison passes for the existing
NAND load and a tri-state
einvpload candidate. In the high-code tail,einvpis monotonic from code 192 to 255 and spans 44.101 MHz, compared with 9.756 MHz for the NAND load. Theeinvprepresentative 5-point sweep is also monotonic and spans 99.974-210.869 MHz. This is not post-layout evidence. - A pre-layout 9-stage
einvpDCO range check passes at TT for codes 0/64/128/192/255, measuring 102.518/119.260/142.355/176.267/229.054 MHz. This supports the 100 MHz-order range target before layout, but the fast candidate is still not post-layout RCX evidence. - A separate filled signoff
IntegerPLL_DCO_EINVPcandidate now passes LibreLane signoff and Magic RCX post-layout SPICE checks. TT filled-RCX smoke at codes 0, 128, and 255 measures 50.955942 MHz, 60.174879 MHz, and 72.479371 MHz. The consolidated five-point calibration adds code 64 at 55.205750 MHz and code 192 at 66.031451 MHz, giving a monotonic 50.955942-72.479371 MHz calibration span across codes 0/64/128/192/255. Focused high-tail TT filled-RCX checks at codes 192, 224, 240, 248, and 255 measure 66.031451 MHz, 69.378381 MHz, 70.929758 MHz, 71.718618 MHz, and 72.479371 MHz, so the candidate high tail is monotonic in the promoted sparse post-layout check. The same candidate also passes four-rank Xyce endpoint smoke at the other PVT corners: 70.251790-99.895518 MHz at FF, 51.688142-70.763937 MHz at FS, 44.076396-64.579620 MHz at SF, and 33.875977-47.497548 MHz at SS. - The current
IntegerPLL_HardMacroTop_EINVPhard-macro top instantiates theIntegerPLL_DCO_EINVP_COARSEcandidate and passes full LibreLane signoff. The extracted-interface check verifies 73 top ports, theIntegerPLL_DCO_EINVP_COARSEoscillator subcircuit, 255 DCO thermometer connections, 47 coarse thermometer connections, 5 antenna-repaired DCO thermometer nets, 374 nominal SPEF nets, 10082 capacitance entries, 1670 resistance entries, and a passing Xyce-norunsyntax/topology probe. - The previous low-frequency EINVP hard-top artifact also passes MPI16/KLU
distributed-RC extracted-loop diagnostics using the final force-to-mid
digital-core netlist, filled BBPD RCX,
IntegerPLL_DCO_EINVPRCX, and the olderIntegerPLL_HardMacroTop_EINVPnominal SPEF. Those historical rows cover 261 hard-top SPEF nets, 1744 capacitance nodes, 1627 resistors, 25247.633 fF selected capacitance, startup at 50.813495 MHz, low first motion 0->2, and high first motion 255->243.019510. A hard-top-loaded mid-code extracted-DCO lock-window diagnostic also passes with code 125..128, 58.591120 MHz tail frequency, and 0.017601 MHz target error. FF/SS mid-code PVT lock-window rows also pass at calibrated references, holding code 125..134 at FF and 126..128 at SS with 0.137721 MHz and 0.024993 MHz tail error. Normal-enable extracted-DCO progress rows at the same loaded target move low start 0->62 and high start 255->172 by 360 ns, measuring 53.728266 MHz and 62.952232 MHz respectively in the late tail window. With the measured five-point E RCX table used as a calibrated behavioral DCO, the same signed-off E hard-top path also passes low/high lock-window diagnostics: low-start moves 0->122 with response 128 and 0.238496 MHz tail error, while high-start moves 255->133 with response 124 and 0.060373 MHz tail error. - A filled signoff DCO RCX TT local-gain transient smoke run passes in
MPI-enabled Xyce at
DCO_CODE120, 128, and 136, measuring 49.558458 MHz, 49.771679 MHz, and 49.977051 MHz. The consolidated local-gain check passes with a 0.026162 MHz/LSB average step around code 128. - Filled signoff DCO RCX PVT endpoint smoke passes in Xyce at
ff,fs,sf, andss. Endpoint ranges are 63.875-72.318 MHz at FF, 46.796-52.659 MHz at FS, 40.092-46.062 MHz at SF, and 30.704-34.328 MHz at SS. The FS/SF/SS endpoints use four MPI ranks. - Bounded filled-DCO RCX endpoint diagnostics in ngspice are reproducible and
produce CSV/log timeout evidence;
num_threads=4does not make the filled ngspice transient practical in the recorded validation environment. - A reduced no-fill DCO RCX deck passes a three-point post-layout transient smoke sweep at codes 0, 128, and 255.
- The BBPD macro has a filled, signoff-clean GDS/SPEF/LVS/DRC result and its filled RCX deck passes post-layout transient polarity validation.
- The filled BBPD RCX deck passes the same post-layout transient polarity
validation across
tt,ff,ss,sf, andfs. - The filled BBPD RCX deck has a TT small-offset dead-zone sweep from 0 ps to
1 ns. The current layout shows +13.464 ps of zero-offset
UP-DNskew, reference-leading polarity correct down to 1 ps, and feedback-leading polarity correct from 20 ps upward. - The filled BBPD RCX deck has all-corner small-offset dead-zone sweeps from
0 ps to 1 ns. The worst sampled zero-offset skew is +26.404 ps at
sf, and the worst sampled feedback-leading threshold is 50 ps atsfandss. - A PLL-level SPICE acquisition harness, using transistor-level Sky130 BBPD cells and a post-layout-measured behavioral DCO model, acquires from both low-code and high-code starting points.
- The PLL-level harness also passes a TT filled-DCO calibrated target fitted to filled RCX measurements at codes 0, 64, 128, 192, and 255.
- The sampled-update filled-DCO harness has reset-fixed diagnostic coverage,
but the default
DLF_STEP=2.5LSB/update case no longer passes from both rails and is not promoted as validation evidence. - A diagnostic sampled-loop SPICE gain sweep covers 9 reset-fixed
DLF_STEP/sample-delay combinations with independent ngspice jobs. No tested combination passes both low-start and high-start acquisition. - A diagnostic sampled-loop PI sweep covers 16 reset-fixed
DLF_STEP/DLF_PROP_LSB/sample-delay combinations. Five combinations pass both rails, with the best tested row usingDLF_STEP=3.5,DLF_PROP_LSB=4, and 0 ps sample delay. - Filled post-layout BBPD in-loop diagnostics now include a passing resolved
sampled Xyce lock probe using the filled BBPD RCX deck, the filled-DCO
five-point behavioral calibration,
DLF_STEP=17.5,DLF_PROP_LSB=4, 150 ps sample delay, and initial DCO phase 0.25 cycles. The same filled-BBPD path is still not a full extracted PLL transient; ngspice times out on the 18 us acquisition deck and the resolved 4 us continuous Xyce sweep withDTMAX=1 nsdoes not find a both-rail passing setting. - The same PLL-level acquisition harness passes low-start and high-start cases
across
tt,ff,ss,sf, andfs, using measured all-code DCO PVT spans and per-corner references for target code 128. - The RTL digital loop filter has a gain-sweep acquisition check using real
DLF_KIandDLF_KPinputs. With corrected nanosecond timing and a registered ideal sign detector,DLF_KI=64,DLF_KP=0is the lowest-gain passing point but takes 150.308 us worst-case. After rescaling the proportional path,DLF_KI=255,DLF_KP=2is the exact-code acquisition point at 37.627 us worst-case in the ideal detector bench.DLF_KI=255,DLF_KP=32is a stronger-P filled-DCO candidate: it leaves at most one code of final error in the ideal detector bench and stays within eight final codes in the filled-DCO top-level behavioral bench. - A top-level behavioral PLL acquisition check passes with the behavioral DCO
and two-flop delayed-reset BBPD model:
DLF_KI=255,DLF_KP=4,MMDCLKDIV_RATIO=8, andREF=12.742100 MHzacquire from code 0 to 127 and from code 255 to 128 toward target code 128. - A filled-DCO calibrated top-level behavioral gain sweep passes nine of ten
DLF_KI/DLF_KPsettings. The promotedpll-top-filled-dco-acqtarget now usesDLF_KI=255,DLF_KP=32, which is the fastest passing row in the current sweep and finishes within eight codes from both rails. TheDLF_KI=255,DLF_KP=0row reaches the target transiently but fails the filled-DCO phase-model endpoint check. - The synthesized Sky130 DLF proportional DCO-code cone has a static
transistor-level SPICE check: 109 mapped cells pass hold, increase, and
decrease cases for stronger-P
DLF_KI=255,DLF_KP=16andDLF_KI=255,DLF_KP=32candidates. - The synthesized Sky130 DLF sequential DCO-code update cone has a transient
Xyce check: the current 330-cell KP32 cone passes increase, decrease,
UP-then-
2'b11, and DN-then-2'b11reset-overlap response checks. A heavier full mapped-core 906-cell Xyce check also passes the KP32 UP/DN reset-overlap cases, and a final-signoff-netlist 540-cell DLF cone passes the same four KP32 directional update cases in compressed 24 ns Xyce runs: without extra interconnect loading, with 582 nominal SPEF lumped capacitances totaling 2678.819 fF, and with distributed nominal SPEF resistance plus 3373 grounded capacitance nodes. Filled-BBPD-RCX to mapped-DLF Xyce integration checks pass KP32 REF-leading and feedback-leading cases for the synthesized cone, the full 906-cell mapped digital core, and the final 540-cell DLF cone with distributed SPEF RC. make -C OpenPLL validate-sky130-pll-artifactspassed 69 promoted evidence groups in the v1 artifact set and wrote consolidated CSV/JSON underbuild/sky130_pll_validation/. In this fast-path development tree it intentionally reports stale physical/SPICE artifacts until regenerated. The gate covers digital-core, DCO, and BBPD signoff metrics; the separateIntegerPLL_DCO_EINVPcandidate signoff; Sky130 structural top compile/control smoke; signed-off macro view/interface assembly; routed hard-macro top integration through OpenROAD detailed routing; full hard-macro top signoff with GDS streamout, min/nom/max SPEF, extracted SPICE, DRC, XOR, and LVS checks; an extracted hard-macro-top SPICE interface and Xyce-norunsyntax/topology probe; parallelIntegerPLL_HardMacroTop_EINVPsignoff and extracted-SPICE interface checks; parallel EINVP hard-top distributed-RC extracted-DCO startup, early low/high first-motion, hard-top-loaded mid-code lock-window across nominal/min/max E hard-top SPEF, FF/SS hard-top-loaded mid-code hold calibration and lock-window diagnostics, FF/SS low/high rail PVT lock-window diagnostics, low/high rail-progress, and low/high rail-start lock-window diagnostics; the Xyce C-interface mixed-signal gain sweep with filled-BBPD RCX; theobjective_deliverable_evidencerow tying the architecture markdown, Sky130 hard-top implementation, 8-bit control resolution, frequency range, and extracted lock-window evidence together; parallel EINVP hard-top calibrated behavioral-DCO low/high lock-window diagnostics; all-code DCO and decoder SPICE; filled-DCO five-point RCX calibration, TT 9-point RCX characterization with the bounded high-code roll-off recorded, focused TT high-code tail RCX characterization, separateeinvpcandidate TT filled-RCX smoke/mid-code/five-point calibration/high-tail post-layout checks, separateeinvpcandidate FF/FS/SF/SS endpoint smoke, TT local-gain RCX smoke, and FF/FS/SF/SS endpoint smoke; filled-BBPD PVT/dead-zone SPICE; PLL-loop surrogate acquisition; the filled-BBPD sampled Xyce lock probe; RTL gain tuning; stronger-P DLF transistor-level SPICE including the final-netlist cone; the mapped-core filled-BBPD loop smoke; the mapped-core filled-BBPD proportional-gain sweep; the mapped-core filled-BBPD four-phase first-correction sweep; the mapped-core filled-BBPD MPI4-KLU 1 us progress probe; the FRAC=6 force-to-mid 820 ns extracted-DCO lock-window probe; the serial and MPI4-KLU extracted-DCO startup smokes; the serial and MPI4-KLU extracted-DCO first-correction smokes; the MPI4-KLU low/high extracted-DCO integrator trends; the MPI16-KLU FRAC=6 low/high extracted-DCO integrator trends; the MPI16-KLU FRAC=6 500 ns rail-start extracted-DCO progress check; the MPI16-KLU FRAC=6 force-to-mid 820 ns rail-start extracted-DCO lock-window check; the force-to-mid final-signoff-netlist 220 ns extracted-DCO motion check; the force-to-mid final-signoff-netlist 820 ns extracted-DCO lock-window check; the MPI16-KLU FRAC=6 mid-code extracted-DCO lock-window check; the MPI16-KLU FRAC=6 enable-85 high-side extracted-DCO lock-window check; the MPI4-KLU mid-code extracted-DCO proportional response; the MPI4-KLU mid-code KP0 extracted-DCO hold contrast; the MPI4-KLU mid-code extracted-DCO measured-frequency contrast; the final-signoff functional-netlist filled-BBPD loop smoke; a force-to-mid final-signoff-netlist mapped-loop smoke with 27097.842 fF of lumped nominal hard-top SPEF capacitance on 261 loop/inter-macro nets, including all DCO thermometer interconnects; and hard-top distributed-RC extracted-DCO startup and low/high first-motion diagnostics. The signoff checks also reject final metrics files older than their RTL/config/SDC sources, so stale physical artifacts do not satisfy the promoted gate.
Not yet complete:
- Full coarse-DCO RCX tuning-curve and PVT transient coverage. The current
IntegerPLL_DCO_EINVP_COARSEsource uses an all-HD 255-load DCO. The hard-top/configured-wrapper post-layout artifacts are current for the 25 MHz-reference release gate, but the path still needs broader all-band PVT DCO coverage and full extracted-DCO-in-loop lock/acquisition evidence before the multiplier targets can be treated as final PLL signoff. - Full closed-loop transistor-level transient SPICE. Current passing DLF transient evidence covers the reduced DCO-code update cone, a short full-core reset-overlap update check, and final-signoff-netlist DLF cones with no extra interconnect loading, lumped nominal SPEF capacitance, and distributed nominal SPEF RC. Filled-BBPD-RCX to mapped-DLF integration also passes through the reduced cone and all mapped digital-core cells. A short feedback-divider-included mapped-loop smoke, a final-signoff functional-netlist mapped-loop smoke with physical-only cells omitted, a force-to-mid final-signoff-netlist mapped-loop smoke with lumped hard-top SPEF loop-net capacitance, behavioral-DCO and extracted-DCO hard-top distributed-RC startup diagnostics, low/high hard-top distributed-RC extracted-DCO first-motion diagnostics for both NAND and EINVP hard-top paths, calibrated behavioral-DCO E hard-top low/high lock-window diagnostics, a hard-top-loaded mid-code E extracted-DCO lock-window diagnostic, FF/SS low/high rail E extracted-DCO PVT lock-window diagnostic, hard-top-loaded low/high E extracted-DCO progress diagnostics, hard-top-loaded low/high E extracted-DCO rail-start lock-window diagnostics, a four-phase first-correction sweep, an MPI4-KLU 1 us progress probe, and a FRAC=6 force-to-mid behavioral-DCO lock probe remains diagnostic for the registered-control RTL because the 2 us reruns timed out. A FRAC=6 force-to-mid 500 ns extracted-DCO progress probe moves both rails strongly, from 0->102 and 255->153, and the registered-control 820 ns extracted-DCO lock-window probe keeps both rail-start tails inside code 112..144 with less than 0.42 MHz TT frequency error. A force-to-mid final-signoff-netlist extracted-DCO 820 ns lock-window check also keeps both rail-start tails inside code 112..144 with less than 0.40 MHz TT frequency error. The extracted-DCO startup, both-rail first-correction smokes, low/high integrator-trend probes, a 500 ns FRAC=6 rail-start progress probe, and FRAC=6 mid-code, enable-85 high-side, and force-to-mid rail-start lock-window checks now pass in the coupled mapped deck, while full extracted PVT signoff and multi-microsecond rail-start lock remain future work.
- BBPD reset-delay optimization and denser metastability characterization around the measured small-offset transition windows.
- Top-level extracted closed-loop transient using the hard-macro signoff SPICE
and SPEF views. Current top-level hard-macro physical signoff covers GDS
streamout, DRC, XOR, RCX/SPEF, extracted SPICE, LVS, macro-interface
connectivity through the extracted wrapper, and an Xyce
-norunsyntax/topology probe. The hard-top-SPEF mapped-loop smoke adds lumped nominal top-level loop-net capacitance, and the promoted distributed-RC diagnostics elaborate selected hard-top loop/inter-macro RC nets with behavioral and extracted DCO decks through startup and low/high first-motion rows, including the parallel EINVP hard-top path. The E hard-top path also has a hard-top-loaded mid-code extracted-DCO lock-window row, low/high extracted-DCO progress rows, hard-top-loaded low/high extracted-DCO rail-start lock-window rows, FF/SS hard-top-loaded mid-code extracted-DCO lock-window rows, and calibrated behavioral-DCO low/high lock-window rows with lumped top SPEF capacitance, plus FF/SS low/high rail PVT extracted-DCO rail-start lock-window rows. - Full closed-loop transistor-level or post-layout PLL validation.
- Extracted phase-domain loop stability and jitter optimization for final
DLF_KI/DLF_KPsettings. - Single-fixed-reference closed-loop PVT lock validation.