This repo now separates the PLL into two implementation tracks:
rtl/IntegerPLL_DigitalCore.v: ordinary synthesizable digital logic for the loop filter, decoders, feedback divider, and test divider.models/: behavioral BBPD/DCO models for RTL simulation. The BBPD model is a two-flop delayed-reset bang-bang detector, matching the macro topology more closely than a one-edge level sampler.sky130/: experimental Sky130 standard-cell structural BBPD/DCO macro candidates. These should be treated as macro netlists, not logic to be optimized by normal synthesis.scripts/spice_dco_sweep.py: generated ngspice validation for the 8-bit Sky130 DCO macro candidate, including parallel--jobssweeps.scripts/check_dco_sweep.py: coverage and monotonicity checker for measured DCO sweep CSVs. It verifies expected code/corner coverage, load polarity, positive oscillator measurements, minimum span/step thresholds, and writes summary CSV/JSON artifacts.scripts/spice_dco_postlayout.py: post-layout DCO RCX transient runner for ngspice or Xyce. The practical no-fill and filled smoke targets use Xyce waveform crossings; the ngspice filled target remains a timeout diagnostic.scripts/spice_bbpd_check.py: generated ngspice validation for BBPD reference-leads and feedback-leads behavior.scripts/spice_dco_decoder_check.py: ngspice operating-point validation for the synthesized Sky130 DCO decoder cone.scripts/spice_dlf_static_check.py: ngspice operating-point validation for the synthesized Sky130 DLF proportional DCO-code cone.scripts/spice_dlf_update_check.py: ngspice/Xyce transient generator for the synthesized Sky130 DLF/DCO-code update path. The practical reduced-cone and short full-core overlap transient targets use Xyce and can run independent cases in parallel with--jobs; the same runner also supports filled-BBPD RCX outputs driving the mapped DLF update cone and the signed-off final digital-core netlist cone, with optional lumped-capacitance or distributed-RC extraction from OpenROAD SPEF.scripts/spice_pll_loop_check.py: PLL-level acquisition check using transistor-level Sky130 BBPD cells and a behavioral DCO model fitted to measured post-layout DCO smoke data, with an optional all-corner PVT mode driven from measured DCO sweep CSVs. The validated loop targets use ngspice; an Xyce waveform-output path exists for diagnostics but is not yet a promoted loop validation target.scripts/spice_pll_sampled_gain_sweep.py: diagnostic runner for sampled PLL-loop SPICE surrogate gain/aperture sweeps. It runs independent loop decks in parallel and writes combined CSV summaries.scripts/spice_pll_continuous_sweep.py: diagnostic runner for continuous PLL-loop gain/polarity/initial-phase sweeps, used by the filled-BBPD Xyce in-loop diagnostic target.scripts/pll_top_gain_sweep.py: RTL top-level behavioral acquisition gain-sweep runner. It reusesIntegerPLL_Top, the behavioral BBPD/DCO models, and the filled-RCX DCO calibration to compareDLF_KI/DLF_KPsettings.scripts/check_top_macro_assembly.py: fast signed-off macro view/interface assembly check for the digital core, DCO, and BBPD physical views.scripts/check_hard_macro_top.py: routed and full-signoff hard-macro top integration check. It verifies the Librelane hard-macro top config, fixed macro placements, final routed/signoff views and metrics, top-level DCO/digital/BBPD interconnects, power pins, SPEF/SPICE extraction, DRC, XOR, and LVS evidence.scripts/check_hard_macro_top_einvp.py: hard-macro top integration check forIntegerPLL_HardMacroTop_EINVP, which instantiates theIntegerPLL_DCO_EINVP_COARSEone-loop coarse/fine DCO while preserving the same digital-core and BBPD macro interfaces.scripts/check_hard_macro_top_spice.py: simulator-facing extracted-SPICE hard-macro top check. It verifies the final extracted top wrapper's macro pin wiring, all 255 DCO thermometer interconnects after antenna repair, min/nom/max signoff SPEF coverage through the nominal SPEF, and an Xyce-norunsyntax/topology probe of an inlined hard-top SPICE deck.scripts/check_sky130_pll_validation.py: promoted validation artifact gate. It checks the current signoff metrics, Sky130 structural top smoke, signed-off macro assembly views, the routed/signed-off hard-macro top and its extracted-SPICE interface, hard-top-SPEF loaded mapped-loop smoke, all-code DCO/decoder SPICE evidence, filled-RCX DCO/BBPD evidence, loop surrogate acquisition, gain tuning, and stronger-P DLF transistor-level SPICE artifacts including the final-netlist cone, plus mapped-loop and extracted-DCO startup/first-correction smokes, then writes a consolidated CSV/JSON summary.openlane/IntegerPLL_DigitalCore/config.json: LibreLane Classic-flow configuration for the synthesizable digital core.openlane/IntegerPLL_DigitalCore/pnr.sdc: PLL-specific PnR constraints for the digital core.
The current Sky130 high-frequency source/integration path is
IntegerPLL_HardMacroTop_EINVP. It combines the digital core RTL, the filled
IntegerPLL_BBPD macro, the physical IntegerPLL_DCO_EINVP_COARSE oscillator
macro source, and the hard-top hardening flow around those macros. The hard top
and 25 MHz configured wrapper have been regenerated against the current 5-bit
DLF_KP interface and pass the release gate. The exported fine loop control
remains 8 bits:
DCO_CODE[7:0] drives a 255-line thermometer control bus connected to 255 local
HD NAND2 loads,
COARSEBINARY_CODE[5:0] selects the oscillator band through a 47-line coarse
thermometer bus, and MMDCLKDIV_RATIO[7:0] selects the integer feedback
division ratio.
The DCO is deliberately integrated as a separate PLL supply island. The DCO
macro uses local met4/met5 PDN, the parent hard top stitches both VPWR and
VGND into that island with its top-level grid, and the parent route blocks
met3/met4/met5 signal routing over the DCO macro body.
The coarse DCO keeps one macro and one oscillator loop: an HD NAND enable gate,
a 48-position HD NAND/NAND2B turn/pass mirror-delay network driven through the
47-bit coarse thermometer bus, and 255 local HD NAND2 fine loads split between
osc_node and mirror_ret[0]. The active ring and mirror gates use HD
nand2_8 and nand2b_4 cells; the ring-facing output buffer stays
sky130_fd_sc_hd__buf_1 to limit oscillator-node loading. It is not a set of
parallel DCO macros, it does not select a simple muxed feedback tap, and the
coarse path does not use NOT cells as the ring delay.
The current evidence for the all-HD variant includes the 255-load coarse-DCO
source structure, standalone DCO macro signoff, the 25 MHz
divider/configured-wrapper RTL regressions, and configured behavioral
reset-to-tracking checks using the all-HD DCO model. The configured operating
points are C20/code93, C06/code234, C04/code90, C02/code76, and C01/code121 for
100, 250, 300, 400, and 500 MHz respectively, all with KI=16 and KP=4.
The current physical release gate covers hard-top signoff, configured-wrapper
signoff, target-code rows, direct-RCX hold smokes, and direct-RCX near-seed
update summaries.
The older filled IntegerPLL_DCO_EINVP and sparse72 paths remain documented as
low-frequency and 200 MHz diagnostic history. They are useful evidence for loop
methodology and prior macro-hardening work, but they are not the current
100/250/300/400/500 MHz hardtop target.
The older low-frequency hard-top convergence evidence is the hard-top-loaded extracted-DCO lock-window set from the previous EINVP artifact: low rail reaches codes 122..128 with a 58.485654 MHz tail and 0.087865 MHz target error, while high rail reaches codes 126..132 with a 58.804895 MHz tail and 0.231377 MHz target error. FF and SS low/high rail PVT lock-window rows are also present in that legacy artifact audit. Those rows remain useful loop-methodology evidence, but they are not the current coarse-DCO 25 MHz-reference multiplier signoff claim.
Run the consolidated promoted validation artifact audit:
make -C OpenPLL validate-sky130-pll-artifactsFor a heavier sequential run that regenerates the promoted artifacts where practical before auditing them:
make -C OpenPLL validate-sky130-pllThe heavier validate-sky130-pll flow now regenerates the Xyce C-interface
mixed-signal gain sweep before the artifact audit. The v1 artifact set passed
69 evidence groups and wrote
build/sky130_pll_validation/sky130_pll_validation_summary.csv plus
sky130_pll_validation_summary.json. This fast-path development tree changes
RTL/scripts after those artifacts, so the audit intentionally reports stale
physical/SPICE evidence until the matching LibreLane and long Xyce artifacts
are regenerated. It deliberately excludes diagnostic targets that are known not
to pass from both rails.
Run the digital smoke test:
make -C OpenPLL simRun a direct Yosys Sky130 synthesis of the digital core:
make -C OpenPLL synthThe synthesis script uses:
CIEL_SKY130_ROOT=$HOME/.volare/ciel/sky130
PDK_ROOT=$HOME/.volare/ciel/sky130
PDK=sky130A
STD_CELL_LIBRARY=sky130_fd_sc_hd
Run make -C OpenPLL check-pdk-stdcell to print and validate the selected PDK.
If the shell exports either the legacy default PDK_ROOT=$HOME/.volare or the
Ciel registry root PDK_ROOT=$HOME/.volare/ciel/sky130, the Makefile and
direct script defaults resolve it to the usable Ciel PDK root. Pass
PDK_ROOT=... on the make command line or export a non-default root if you
want another Volare PDK target. The current local Ciel tree has usable
sky130_fd_sc_hd and sky130_fd_sc_hs reference views. HD remains the default
for the promoted low-frequency macros; the coarse 100/250/300/400/500 MHz candidate
explicitly selects sky130_fd_sc_hs.
For the independent coarse-band fast-path checks intended to pair with a wide-range DCO, run:
make -C OpenPLL synth-coarse4
make -C OpenPLL digital-loop-gain-sweep-coarse4
make -C OpenPLL pll-top-fast100-coarse4-acq
make -C OpenPLL xyce-pll-mixed-signal-fast100-coarse4-smoke
make -C OpenPLL xyce-pll-analog-dco-mixed-fast100-coarse4-acq
make -C OpenPLL spice-pll-mapped-loop-fast100-coarse4-motionsynth-coarse4 keeps DCO_COARSE_BITS=0, sets DLF_FRAC_WIDTH=2, and enables
DLF_PROP_RAIL_GUARD=1. In that mode the loop filter still drives the full
8-bit DCO_CODE; COARSEBINARY_CODE is an independent band input consumed by
the behavioral DCO model for fast-path acquisition and mixed-signal checks. The
current target uses COARSEBINARY_CODE=1, a 16 MHz coarse-band step,
MMDCLKDIV_RATIO=2, REF=63.443725 MHz, and a 126.88745 MHz output target
near fine code 32. The companion LibreLane config is
openlane/IntegerPLL_DigitalCore/config_coarse4.json; use:
make -C OpenPLL librelane-signoff-coarse4
make -C OpenPLL check-librelane-signoff-coarse4before using the coarse-enabled digital core as a physical macro. The generic
sky130/IntegerPLL_DCO_sky130.v wrapper keeps the existing signed-off physical
DCO pin list and does not consume COARSEBINARY_CODE. The physical
IntegerPLL_DCO_EINVP_COARSE candidate consumes the decoded
COARSETHERMAL_CODE[46:0] pass/turn bus while leaving all 8 exported DCO bits
for fine thermometer control.
The 220 ns fast-path mapped-loop motion check uses the synthesized coarse-band digital core, filled BBPD RCX, and behavioral five-point DCO table with the independent 16 MHz coarse offset. It passes the intended two-rail motion check: low-start code 0 moves to 62 and high-start code 255 moves to 183. This is direction and integration evidence for the 126.88745 MHz target, not a full settling or post-layout fast-DCO signoff result.
xyce-pll-mixed-signal-fast100-coarse4-smoke is a faster bounded mixed-signal
check using the Xyce C-interface: Xyce owns the filled BBPD RCX, while the
compiled driver owns the DLF/divider and the five-point fast DCO table plus the
independent coarse offset. The current low case moves fine code 0 to 36 in 24
cycles; the bounded high-side case moves code 64 to 38 in 15 cycles. Both have
a closest target error of 4 codes around fine code 32. The full 255-to-32 rail
case is not promoted for this C-interface driver because its one-edge-per-cycle
phase model is not robust to large cycle slips.
xyce-pll-analog-dco-mixed-fast100-coarse4-acq keeps the fast DCO phase and
feedback divider inside Xyce instead of the compiled driver. The deck uses the
filled BBPD RCX, a behavioral analog DCO phase integrator with the same
five-point fast table, and an independent 16 MHz coarse offset. The external
C++ driver only performs the fixed-point DLF update and drives the DCO code
YDAC. With KI=128, KP=8, FRAC=2, and target fine code 32, the bounded
four-update cases pass from both sides: 0 to 34 with measured PLLOUT at
127.389 MHz, and 64 to 30 with measured PLLOUT at 126.316 MHz. Both are
within the 2 MHz frequency tolerance around the 126.88745 MHz multiply target.
This is the preferred fast mixed-signal polarity/gain/frequency check, but it
is still not physical fast-DCO signoff or full rail-start settling.
Current Yosys/Liberty estimate for the default IntegerPLL_DigitalCore with
the 8-bit DCO thermometer decoder, registered DCO controls, BBPD event capture,
and independent coarse interface is 1159 mapped Sky130 cells and
12833.558400 square microns at sky130_fd_sc_hd__tt_025C_1v80. The FRAC=2
guard-enabled synth-coarse4 fast-path configuration maps to 1226 cells and
13028.745600 square microns.
For the 25 MHz reference / 200 MHz output exploration, the current physically
checked fast DCO is IntegerPLL_DCO_EINVP_SPARSE72. Regenerate and check that
macro with:
make -C OpenPLL dco-einvp-sparse72-librelane-signoff
make -C OpenPLL check-dco-einvp-sparse72-librelane-signoff
make -C OpenPLL dco-einvp-sparse72-magic-rcx
make -C OpenPLL spice-dco-postlayout-einvp-sparse72-200-probe
make -C OpenPLL xyce-pll-postlayout-calibrated-dco-mixed-fast200-sparse72-lock
make -C OpenPLL xyce-pll-postlayout-dco-mixed-fast200-sparse72-near-lock-motionThe Ciel-PDK run is DRC/LVS/XOR clean and the extracted DCO probe measures
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. The calibrated mixed-signal lock target keeps
the filled BBPD RCX in Xyce and uses a DCO phase model fitted to the sparse72
post-layout RCX points, including the flat lower range below code 184. With
REF=25 MHz, NDIV=8, KI=76, KP=8, and FRAC=2, it passes from both
rails within a 4 MHz target window: code 0 moves to 192 and measures
202.314 MHz; code 255 moves to 191 and measures 196.767 MHz.
The full extracted-DCO mixed-step transient is still too slow for a complete
rail-start regression, but the bounded direct-RCX companion now performs real
post-decision DCO-code updates through Xyce's mixed-step API. It keeps both the
filled BBPD and sparse72 DCO RCX decks in Xyce, releases reset at 5 ns, drives
REF as a 25 MHz pulse source, and uses NDIV=8. The fixed-code row starts and
stays at code 196 and measures PLLOUT at 199.734 MHz. The low-side row starts
from code 184 with divider count 0 and KI=32, KP=4, records six
UP-dominant windows, moves 184 -> 187 -> 189 -> 191 -> 193 -> 195 -> 197, and
measures 200.000 MHz. The high-side row starts from code 220 with divider count 7 and
KI=96, KP=8, records four DN-dominant windows, moves 220 -> 212 -> 206 ->
200 -> 194, and measures 200.000 MHz. The evidence therefore proves post-layout DCO
range, direct-RCX near-target mixed-step correction, and
post-layout-calibrated mixed lock; it is not yet a full rail-to-rail lock
simulation with the 19k-unknown extracted DCO in every loop cycle.
Run LibreLane synthesis for the digital core:
make -C OpenPLL librelane-synthRun LibreLane through detailed routing for the digital core:
make -C OpenPLL librelane-routeRun full LibreLane digital-core signoff:
make -C OpenPLL librelane-signoff
make -C OpenPLL check-librelane-signoffRun full signoff for the promoted FRAC=6 force-to-mid digital-core variant:
make -C OpenPLL librelane-signoff-force127-s4a2
make -C OpenPLL check-librelane-signoff-force127-s4a2The routed digital-core run uses $LIBRELANE_ROOT by default
and can be redirected with LIBRELANE_ROOT. librelane-route stops after
OpenROAD detailed routing. librelane-signoff runs the rest of the Classic
flow, including fill insertion, OpenROAD RCX/SPEF extraction, post-PnR STA,
Magic and KLayout GDS streamout, Magic and KLayout DRC, Magic SPICE extraction
for LVS, and Netgen LVS.
Current full-signoff digital-core results for
openlane/IntegerPLL_DigitalCore/config.json:
| Metric | Value |
|---|---|
| Die area | 90000 square microns |
| Core area | 80146.9 square microns |
| Standard-cell area | 15912.8 square microns |
| Instance utilization | 19.8545% |
| Standard-cell instance count | 2786 |
| Detailed-route DRC errors | 0 |
| Antenna-violating nets/pins | 0 / 0 |
| Power-grid violations | 0 |
| Magic DRC errors | 0 |
| KLayout DRC errors | 0 |
| Magic/KLayout XOR differences | 0 |
| LVS errors | 0 |
| Max slew/cap/fanout violations | 0 / 0 / 0 |
| Setup WNS/TNS | 0 ns / 0 ns |
| Hold WNS/TNS | 0 ns / 0 ns |
| Worst setup/hold slack | 2.611 ns / 0.073 ns |
| Routed wire length | 54506 microns |
| Routed vias | 10925 |
Current full-signoff force-to-mid digital-core results for
openlane/IntegerPLL_DigitalCore/config_force127_s4a2.json:
| Metric | Value |
|---|---|
| Die area | 90000 square microns |
| Core area | 80146.9 square microns |
| Standard-cell area | 24098.1 square microns |
| Instance utilization | 30.0674% |
| Standard-cell instance count | 3164 |
| Detailed-route DRC errors | 0 |
| Antenna-violating nets/pins | 0 / 0 |
| Power-grid violations | 0 |
| Magic DRC errors | 0 |
| KLayout DRC errors | 0 |
| Magic/KLayout XOR differences | 0 |
| LVS errors | 0 |
| Max slew/cap/fanout violations | 0 / 0 / 0 |
| Setup WNS/TNS | 0 ns / 0 ns |
| Hold WNS/TNS | 0 ns / 0 ns |
| Worst setup/hold slack | 2.794 ns / 0.115 ns |
| Routed wire length | 67207 microns |
| Routed vias | 13321 |
| Reported total power | 3.431 mW |
| Worst IR drop | 0.706 mV |
These full-signoff artifacts were regenerated after the BBPD decision-latch and
DLF rail-escape RTL updates, and again after adding the default-off
same-direction acquisition-boost parameters and the default-off PLLOUT-update
mode, force-to-mid acquisition, and registered DCO control outputs.
make -C OpenPLL check-librelane-signoff and
make -C OpenPLL check-librelane-signoff-force127-s4a2 passed in the v1
artifact set against their final views and zero-violation metrics. The signoff
checker also compares final metrics timestamps against the digital-core RTL,
config, and SDC sources, so this fast-path development tree reports those
physical artifacts as stale until they are regenerated.
The final signoff DEF, GDS, Magic/KLayout GDS, LEF, ODB, netlists, SDC, metrics, extracted LVS SPICE, corner SPEF, corner SDF, and corner Liberty files are written under:
OpenPLL/openlane/IntegerPLL_DigitalCore/runs/librelane_signoff/final/
The promoted FRAC=6 force-to-mid variant writes its final signoff views under:
OpenPLL/openlane/IntegerPLL_DigitalCore/runs/librelane_signoff_force127_s4a2/final/
These results validate the synthesizable digital core through post-layout
digital signoff. The extracted IntegerPLL_DigitalCore.spice view is used for
LVS and the SPEF files are used by post-PnR STA; they are not a post-layout
transient SPICE simulation of the DCO, BBPD, or closed-loop PLL.
The Sky130 DCO structural macro can also be hardened with LibreLane:
make -C OpenPLL dco-librelane-signoff
make -C OpenPLL dco-magic-rcxThe filled signoff DCO layout writes final DEF/GDS/LEF/MAG/ODB/netlist/SPEF/LVS SPICE views under:
OpenPLL/openlane/IntegerPLL_DCO/runs/librelane_signoff/final/
Current filled-layout DCO signoff results:
| Metric | Value |
|---|---|
| Die area | 202500 square microns |
| Standard-cell area | 4306.63 square microns |
| Instance utilization | 2.298% |
| Standard-cell instance count | 2896 |
| Detailed-route DRC errors | 0 |
| Antenna-violating nets/pins | 0 / 0 |
| Power-grid violations | 0 |
| Magic DRC errors | 0 |
| KLayout DRC errors | 0 |
| Magic/KLayout XOR differences | 0 |
| LVS errors | 0 |
| Routed wire length | 8412 microns |
| Routed vias | 1022 |
dco-magic-rcx creates a flattened transistor-level RCX deck for the filled
layout at:
OpenPLL/openlane/IntegerPLL_DCO/runs/librelane_signoff/rcx-magic/IntegerPLL_DCO.rcx.spice
That filled deck is real post-layout extraction, but it includes filler/decap devices and is expensive in ngspice. The practical filled signoff smoke target uses Xyce:
make -C OpenPLL spice-dco-postlayout-filledThis target runs the five canonical filled-RCX code-point decks concurrently
through make -j$(DCO_POSTLAYOUT_FILLED_JOBS), with
DCO_POSTLAYOUT_FILLED_JOBS ?= 5. The consolidated calibration check is:
make -C OpenPLL check-dco-postlayout-filledThe denser TT 9-point tuning characterization is:
make -C OpenPLL check-dco-postlayout-filled-tt-9ptThe focused TT high-code tail characterization is:
make -C OpenPLL check-dco-postlayout-filled-highcode-tailThe pre-layout load-cell retuning comparison is:
make -C OpenPLL check-dco-tail-loadstyle-candidatesThe hardened filled-RCX einvp load-cell candidate flow is:
make -C OpenPLL dco-einvp-librelane-signoff
make -C OpenPLL check-dco-einvp-librelane-signoff
make -C OpenPLL dco-einvp-magic-rcx
make -C OpenPLL check-dco-einvp-postlayoutThe older 100 MHz-order fast DCO range probe keeps the same EINVP load style and thermometer interface, but uses a 9-stage enabled ring instead of the promoted 17-stage ring:
make -C OpenPLL check-dco-einvp-fast-9stage-5pt
make -C OpenPLL dco-einvp-fast-librelane-signoff
make -C OpenPLL check-dco-einvp-fast-librelane-signoff
make -C OpenPLL dco-einvp-fast-magic-rcxThe pre-layout check currently measures 102.518 MHz at code 0, 119.260 MHz at code 64, 142.355 MHz at code 128, 176.267 MHz at code 192, and 229.054 MHz at code 255. These numbers are useful for first-pass loop targeting and gain sweeps, but the physical range can shift substantially after fill, routing, RCX, and hard-top loading.
After both the coarse digital-core macro and fast DCO macro are signed off, the future hard-top integration entry point is:
make -C OpenPLL hardtop-einvp-fast-librelane-signoff
make -C OpenPLL check-hard-macro-top-einvp-fast-spiceThat hard top is intentionally separate from the promoted
IntegerPLL_HardMacroTop_EINVP path.
The intended one-macro coarse-DCO physical flow is:
make -C OpenPLL dco-einvp-coarse-librelane-signoff
make -C OpenPLL check-dco-einvp-coarse-librelane-signoff
make -C OpenPLL dco-einvp-coarse-magic-rcx
make -C OpenPLL spice-dco-postlayout-einvp-coarse-target-probeIts RTL-level structural check is already covered by
make -C OpenPLL check-sky130-macros. The current local latest-Ciel run passes
the standalone LibreLane artifact checker for the all-HD coarse DCO macro with
988 standard cells, 0.180960 utilization, 13689 microns routed wire length, and
2436 vias. The current checker uses the KLayout streamout path and skips Magic
streamout/XOR for this standalone DCO artifact. The hard top and configured
wrapper have also been regenerated for the current source/interface, with zero
Magic/KLayout DRC, zero LVS errors, zero power-grid violations, and zero
reported setup/hold violations. Full arbitrary-start extracted-loop lock
evidence for the 25 MHz-reference 100/250/300/400/500 MHz target set remains
future BBPLL/control work.
The current all-HD DCO target probes cover all requested 25 MHz-reference modes
while keeping the ring-facing output buffer at buf_1:
| 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 target sweeps also keep local band context in the configured-tracking summary: 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.
Measured duty remains close to 50% on the selected target bands, and rise/fall
times remain well below 25% of period. The rejected root-connected slow-load
attempt showed why the slow loads must not be attached to osc_node or
mirror_ret[0]: even logically disabled NAND2 inputs added enough capacitance
to open gaps around 300 and 400 MHz.
For the same reason, the output buffer is not a tuning knob for speed recovery:
upsizing it increases the load seen by the oscillator. Speed margin should come
from the ring/mirror cells, selected coarse path, or fine-load placement.
The current mirror-delay coarse DCO no longer uses the earlier mux-selected feedback tap model. Its structural RTL check is:
make -C OpenPLL check-sky130-macrosThe optional pre-layout turn/pass mirror-delay diagnostic is:
make -C OpenPLL check-dco-einvp-coarse-mirror-targetsIt uses a legacy sky130_fd_sc_hs 48-position mirror path, 90 evenly mapped
NAND2 fine loads, and waveform-quality filtering at the buffered PLLOUT
(0.35 <= duty <= 0.65, rise/fall each below 25% of period), while keeping
the output buffer drive at 1. With the current small output buffer it is a
partial pre-layout diagnostic, not the shipping target-range gate. The recorded
rows below predate the all-HD 255-load source and are retained only as topology
history:
| Target | Multiplier | Coarse turn | Fine code estimate | Bracket |
|---|---|---|---|---|
| 100 MHz | 4 | 40 | 183.545 | 98.024700-100.769000 MHz |
| 300 MHz | 12 | 10 | 59.228 | 293.946000-320.011000 MHz |
The 250 and 400 MHz shipping targets are intentionally qualified from the all-HD target probes above instead. This keeps the legacy pre-layout check from encouraging output-buffer upsizing just to close a sampled bracket.
The corresponding configured-mode mixed-signal PLL gate is:
make -C OpenPLL xyce-pll-mixed-signal-25mhz-targetsThat target aliases to the direct extracted-DCO mixed-step hold smoke after
refreshing the DCO target probes above. The selected target codes are
code93, code234, code90, code76, and code121. It remains a configured-mode check, not a
blind rail-start acquisition claim:
COARSEBINARY_CODE selects a characterized mirror-delay path, the fine code is
seeded near the target estimate, and the DLF then performs phase tracking.
The reusable RTL preset table is IntegerPLL_25MHzModeConfig: the external
5-bit FEEDBACK_DIVIDER value /4 selects 100 MHz with C20/code93 and
KI=16/KP=4; /10 selects 250 MHz with C06/code234 and KI=16/KP=4; /12 selects
300 MHz with C04/code90 and KI=16/KP=4; /16 selects 400 MHz with C02/code76 and
KI=16/KP=4; and /20 selects 500 MHz with C01/code121 and KI=16/KP=4. It also
emits the 10-bit DLF seed word target_code << 2 and CONFIG_VALID.
Unsupported divider values hold CONFIG_VALID=0 and do not enable tracking.
The table is checked by:
make -C OpenPLL check-pll-25mhz-divider-configFor normal fixed-mode RTL use, instantiate
IntegerPLL_HardMacroTop_EINVP_25MHzConfigured instead of driving the DLF pins
manually. It wraps IntegerPLL_HardMacroTop_EINVP with
IntegerPLL_25MHzModeController: FEEDBACK_DIVIDER[4:0] is the public
feedback-loop divider input, and PLL_ENABLE starts a
retimed-divider-clocked sequence that holds DLF_Clear long enough to load the
preset seed before asserting DLF_En for tracking. The wrapper test checks all
five supported divider reloads through the hard-macro instance, not only the
isolated controller. The behavioral check uses the real controller, digital
core, divider, and BBPD with a DCO table fitted to the all-HD coarse-band
measurements to verify reset-to-tracking operation and measured frequency for
all five supported divider values. These checks are:
make -C OpenPLL check-pll-25mhz-divider-controller
make -C OpenPLL check-pll-25mhz-configured-wrapper
make -C OpenPLL check-pll-25mhz-configured-behavioralThe calibrated BBPD/DCO-table tracking row uses the per-mode gains above, starts each mode from +/-4 fine codes around the target, and passes the bounded configured tracking gate for all five requested multipliers. That 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.
The current fast source/behavioral gate for the 25 MHz coarse-DCO release 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 HD NAND/NAND2B mirror-delay RTL, rejects ring-facing output
buffer upsizing, checks the 25 MHz divider preset table and configured
divider-controller/wrapper, and checks the configured behavioral PLL
reset-to-tracking row. The heavier
make -C OpenPLL check-sky130-pll-25mhz-release audit checks current post-layout
hard-macro artifact freshness, waveform-qualified target-code rows, direct-RCX
hold smokes, and near-seed direct-RCX update summaries.
The optional direct extracted-DCO mixed-step diagnostic for the hardest target mode is:
make -C OpenPLL xyce-pll-postlayout-dco-mixed-25mhz-500m-hold-smokeIt instantiates the IntegerPLL_DCO_EINVP_COARSE RCX deck and the filled BBPD
RCX deck in Xyce, fixes the DCO at C01/code121, and drives the divider/filter
from the C-interface. The short ADC-sampled frequency estimate is intentionally
loose; the standalone post-layout DCO rows remain the precise frequency
evidence for the 500 MHz target. Single-cycle BBPD motion checks are phase
dependent and are not promoted as frequency-acquisition evidence for this
coarse-DCO path.
The companion near-seed direct-RCX code-update diagnostic is:
make -C OpenPLL xyce-pll-postlayout-dco-mixed-25mhz-nearseed-smokesThe current Ciel-PDK TT run checks low and high starts four fine codes away
from each target. 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, because the
extracted BBPD decision is intentionally phase dependent. The direct-RCX rows
all pass 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. The
ADC-sampled PLLOUT estimates are intentionally loose; the standalone DCO rows
remain the precise frequency evidence. This is stronger near-seed
configured-control evidence, not full extracted-loop rail-start acquisition.
The BBPD C-interface deck includes a local compatibility alias for the latest
Ciel Magic-RCX sky130_fd_pr__special_nfet_01v8 device name, mapped to the
available sky130_fd_pr__nfet_01v8 model with the RCX geometry parameters.
This keeps the BBPD-RCX mixed-signal target runnable on the current Ciel tree;
it does not replace final device-accurate post-layout signoff.
The filled local-gain check is:
make -C OpenPLL check-dco-postlayout-filled-local-gainThe filled PVT endpoint smoke check is:
make -C OpenPLL check-dco-postlayout-filled-pvt-endpointsIn the recorded validation environment, the filled signoff deck now has a passing TT five-point
transient smoke result from printed Xyce PLLOUT crossings: code 0 measures
46.257 MHz, code 64 measures 47.950 MHz, code 128 measures 49.762 MHz,
code 192 measures 51.618 MHz, and code 255 measures 52.350 MHz. This confirms
filled-deck tuning polarity. The consolidated calibration artifact reports a
6.093105 MHz span, a 0.023895 MHz/LSB average step, and measured segment steps
of 0.026464, 0.028308, 0.029005, and 0.011609 MHz/LSB over code ranges 0-64,
64-128, 128-192, and 192-255. The denser TT 9-point check covers codes 0, 32,
64, 96, 128, 160, 192, 224, and 255. It finds positive segment gain through
code 224, peaking at 52.565854 MHz, then a bounded high-code roll-off to
52.349831 MHz at code 255. That 0.216023 MHz roll-off is a real filled-RCX
limitation of the current layout, so this is a tuning characterization rather
than proof of full-range filled-DCO monotonicity. The focused high-code tail
check covers codes 192, 208, 216, 224, 232, 240, 248, 250, 252, 254, and 255.
It localizes the filled-RCX TT peak at code 240, measuring 53.003796 MHz, and
records a 0.653965 MHz roll-off to code 255. This points to the sparse-load
tail ordering/layout as the next DCO retuning target. A pre-layout load-cell
comparison keeps the current NAND load as the baseline and tests a tri-state
einvp load candidate. Over high-tail codes 192, 208, 216, 224, 232, 240,
248, 250, 252, 254, and 255, the einvp candidate is monotonic and spans
44.101 MHz, versus 9.756 MHz for the NAND load. A representative 5-point
einvp sweep at codes 0, 64, 128, 192, and 255 is also monotonic and spans
99.974-210.869 MHz.
The IntegerPLL_DCO_EINVP candidate has now also been hardened separately from
the top-level IntegerPLL_DCO macro. Its filled signoff metrics are clean
with 2896 standard-cell instances, 2.639% utilization, 9354 microns routed
wire length, 1044 vias, zero Magic/KLayout DRC errors, zero XOR differences,
and zero LVS errors. Magic RCX writes:
OpenPLL/openlane/IntegerPLL_DCO_EINVP/runs/librelane_signoff/rcx-magic/IntegerPLL_DCO_EINVP.rcx.spice
check-dco-einvp-postlayout verifies the candidate in MPI-enabled Xyce at TT.
The filled-RCX smoke measures code 0 at 50.955942 MHz, code 128 at
60.174879 MHz, and code 255 at 72.479371 MHz, a monotonic 21.523429 MHz span.
The consolidated five-point calibration adds code 64 at 55.205750 MHz and code
192 at 66.031451 MHz, producing the measured TT calibration table
50.955942/55.205750/60.174879/66.031451/72.479371 MHz for codes
0/64/128/192/255. The focused high-tail check combines codes 192, 224, 240,
248, and 255 and measures 66.031451, 69.378381, 70.929758, 71.718618, and
72.479371 MHz, respectively, a monotonic 6.447920 MHz tail span. This remains
real post-layout evidence for the alternate load topology. The same filled RCX
deck also passes endpoint smoke at the other four PVT corners with four-rank
Xyce: 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 PVT
endpoint target is make -C OpenPLL spice-dco-postlayout-einvp-pvt-endpoints.
The current high-frequency hard-macro source top,
IntegerPLL_HardMacroTop_EINVP, instantiates
IntegerPLL_DCO_EINVP_COARSE. The current physical artifacts for this path pass
hardtop-einvp-librelane-signoff, check-hard-macro-top-einvp-signoff, and
check-hard-macro-top-einvp-spice. The hard-top checker reports 3 embedded
macros, 61063 standard cells, 244759 microns routed wire length, and 2274 vias;
the extracted SPICE/SPEF probe reports 70 top ports, 255 DCO thermometer
connections, 47 coarse thermometer connections, 11602 SPEF capacitance entries,
and 1743 SPEF resistance entries. The DCO has local met4/met5 PDN, the parent
top uses PDN_HOFFSET=13.35 to stitch both DCO supplies, and parent
met3/met4/met5 signal routing is obstructed over the DCO macro body. The
configured physical wrapper flow,
IntegerPLL_HardMacroTop_EINVP_25MHzConfigured, embeds the lower hard macro and
adds the 25 MHz divider controller in one physical macro. The regenerated
configured wrapper reports one embedded macro, 39801 standard cells, 47884
microns routed wire length, and 1369 vias, and passes full signoff.
The wrapper locally buffers the TARGET_MHZ[8] status output with
sky130_fd_sc_hd__buf_8, keeping the long status route off the weak
divider-decode net. The wrapper flow excludes sky130_fd_sc_hd__o21ai_0 because
the current Ciel KLayout deck reports an npc.2 marker in that cell; synthesis
uses the clean o21ai_1 variant.
The older low-frequency E hard-top artifact also has MPI16/KLU extracted-loop
diagnostics with the final force-to-mid digital-core netlist, filled BBPD RCX,
the filled IntegerPLL_DCO_EINVP RCX deck, and distributed nominal SPEF RC from
the previous IntegerPLL_HardMacroTop_EINVP generation. The selected E hard-top
nets cover all 255 DCO
thermometer interconnects, 261 hard-top SPEF nets, 1744 grounded capacitance
nodes, 1627 resistors, 260 digital pin substitutions, and 25247.633 fF of
selected top-level capacitance. The 50 ns startup deck passes with two PLLOUT
rises and 50.813495 MHz startup frequency. Early-enable 90 ns first-motion
decks pass in both directions: low start moves code 0 to 2, and high start
moves code 255 to 243.019510. Using the measured five-point E RCX calibration
as a piecewise behavioral DCO, the same signed-off E hard-top path also passes
calibrated low/high lock-window diagnostics. The low-start MPI16/KLU run moves
code 0 to 122 with response code 128, observes lock-window codes 121..128, and
measures 59.936383 MHz tail frequency with 0.238496 MHz target error. The
high-start run moves code 255 to 133 with response code 124, observes
lock-window codes 126..133, and measures 60.235253 MHz tail frequency with
0.060373 MHz target error. A distributed-RC extracted-DCO mid-code lock-window
diagnostic also passes when the reference is calibrated to the hard-top-loaded
E DCO target. The standalone E code-128 target row shows the top interconnect
load directly: code 128..125 gives a 58.573518 MHz tail, 1.601361 MHz below the
standalone 60.174879 MHz DCO target. Retargeting the reference to
29.286759 MHz for NDIV=2 passes with code 125..128 in the 150..219 ns lock
window, 58.591120 MHz tail frequency, and 0.017601 MHz target error.
Normal-enable rail-progress rows at the same hard-top-loaded target run to
360 ns: low start moves code 0->62 with late-window codes 42..62 and
53.728266 MHz tail frequency, while high start moves code 255->172 with
late-window codes 172..192 and 62.952232 MHz tail frequency. Extending the
rail-start decks to lock-window checks produces two-sided extracted-DCO
rail-start lock evidence: low start runs to 900 ns and reaches code 122..128
with 58.485654 MHz tail frequency and 0.087865 MHz target error, while high
start runs to 760 ns and reaches code 126..132 with 58.804895 MHz tail
frequency and 0.231377 MHz target error. The remaining gap is PVT loop lock
evidence for the EINVP top.
The local-gain check runs the filled RCX deck at TT codes 120, 128,
and 136 with the MPI-enabled Xyce build and measures 49.558458 MHz,
49.771679 MHz, and 49.977051 MHz, giving 0.026162 MHz/LSB average local gain
around the nominal lock code. The same filled RCX deck also passes endpoint
smoke at the other four PVT corners: 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 runs use the MPI-enabled Xyce build at
$XYCE_MPI_ROOT/bin/Xyce with four ranks. This is still not yet
a full filled 256-code tuning curve or all-corner filled PVT sweep. The old
ngspice diagnostic remains available as:
make -C OpenPLL spice-dco-postlayout-filled-ngspiceThe installed Xyce binary reports Serial in Xyce -capabilities, so wrapping
this binary with mpirun would launch serial processes rather than parallelize
one filled-RCX transient solve. Independent code/corner decks can still be
parallelized at the script or Makefile target level. The Xyce-enabled runners
also accept XYCE_MPI_PROCS; the runner checks Xyce -capabilities and refuses
to wrap a serial binary. The MPI-enabled Xyce build at
$XYCE_MPI_ROOT/bin/Xyce reports Parallel with MPI; use it
only after confirming the deck still converges, for example
XYCE=$XYCE_MPI_ROOT/bin/Xyce XYCE_MPI_PROCS=8 make -C OpenPLL spice-dco-postlayout-filled-code128.
The ngspice filled code-255 attempts timed out after 900.368 s with an
80 ns / 100 ps deck and after 900.362 s with a 60 ns / 200 ps deck. A
60 ns / 200 ps diagnostic probe with num_threads=4 also timed out after
120.212 s. make exposes NGSPICE_THREADS ?= 4 for selected single-run
ngspice targets, but threading does not make the filled DCO transient practical
in the recorded validation environment. For a faster three-point oscillator smoke test there is a
separate no-fill extraction path:
make -C OpenPLL dco-librelane-nofill
make -C OpenPLL dco-magic-rcx-nofill
make -C OpenPLL spice-dco-postlayoutThe no-fill layout is not signoff-clean; it intentionally omits filler and therefore reports DRC/LVS errors. Its purpose is only to keep the extracted transient deck small enough for quick oscillator validation. The current Xyce no-fill post-layout smoke sweep measures 50.944 MHz, 55.258 MHz, and 60.003 MHz for top-level-style codes 0, 128, and 255 respectively.
The Sky130 BBPD structural macro is also hardened as a filled, signoff-clean macro:
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-pvtCurrent filled-layout BBPD signoff results:
| Metric | Value |
|---|---|
| Die area | 14400 square microns |
| Standard-cell area | 280.269 square microns |
| Instance utilization | 2.637% |
| Standard-cell instance count | 163 |
| Detailed-route DRC errors | 0 |
| Antenna-violating nets/pins | 0 / 0 |
| Power-grid violations | 0 |
| Magic DRC errors | 0 |
| KLayout DRC errors | 0 |
| Magic/KLayout XOR differences | 0 |
| LVS errors | 0 |
| Routed wire length | 317 microns |
| Routed vias | 56 |
Unlike the DCO smoke target, the BBPD post-layout transient uses the filled
signoff-clean Magic RCX deck directly. It validates both phase polarities:
reference-leading feedback produces a wider UP pulse, and feedback-leading
reference produces a wider DN pulse. The post-layout PVT target validates the
same polarity across tt, ff, ss, sf, and fs using the filled RCX deck.
The TT dead-zone sweep uses the same filled RCX deck from simultaneous edges
through 1 ns of phase offset. It measured +13.464 ps of zero-offset UP-DN
width skew, reference-leading polarity correct down to 1 ps, and
feedback-leading polarity correct from 20 ps upward.
The all-corner dead-zone sweep measured worst-case sampled zero-offset skew of
+26.404 ps at sf, with feedback-leading polarity correct from 50 ps upward
in the slow-skew sf and ss corners.
The RTL keeps DCO load polarity separate from the other thermometer decoders.
DCO_THERM_INVERT=1 is the default so top-level DCO_CODE=0 enables all 255
dummy loads and DCO_CODE=255 enables none. This makes increasing
DCO_CODE increase oscillator frequency, matching the loop filter's
increase-frequency command.
For the independent coarse-band fast path, the DLF polarity above still applies
to the full 8-bit fine code. Raising COARSEBINARY_CODE selects a faster
behavioral DCO band when DCO_COARSE_STEP_MHZ is nonzero, while the DLF trims
with the full fine-code span. A legacy packed diagnostic mode can still be built
with DCO_COARSE_BITS>0; in that mode raising COARSEBINARY_CODE replaces the
high fine-code bits and the DLF trims only the remaining low bits.
Check the structural Sky130 top integration path:
make -C OpenPLL check-sky130-macros
make -C OpenPLL check-top-macro-assembly
make -C OpenPLL hardtop-librelane-route
make -C OpenPLL check-hard-macro-top
make -C OpenPLL hardtop-librelane-signoff
make -C OpenPLL check-hard-macro-top-signoff
make -C OpenPLL check-hard-macro-top-spicecheck-sky130-macros defines USE_POWER_PINS, includes the Sky130 primitive and
standard-cell Verilog models, and elaborates IntegerPLL_Top with the real
Sky130 BBPD/DCO wrappers. It also runs a deterministic top-control smoke with
macro-compatible shells, checking external DLF words 0, 512, and 1020 map to
8-bit DCO codes 0, 128, and 255 with matching 255-bit thermometer counts. The
Sky130 library models emit many Icarus timing-check warnings during the
real-wrapper compile; port or module mismatches should still fail the command.
check-top-macro-assembly verifies the signed-off digital-core, DCO, and BBPD
LEF/GDS/DEF/netlist/SDC views exist, have the expected macro sizes and pin
directions, and match the top-level interconnect for BBPD[1:0],
DCO_THERM[254:0], PLLOUT, and CLKDIV_RETIMED.
hardtop-librelane-route builds IntegerPLL_HardMacroTop from the signed-off
macro views and routes the top-level hard-macro integration through
OpenROAD.DetailedRouting. The promoted check-hard-macro-top result fixes
phase_detector at (315, 40), digital_core at (235, 180), and
oscillator at (160, 620), with a 140 um DCO-to-digital routing channel. The
current routed top has three hard macros, 7739 standard-cell/tap/fill/antenna
instances, 193161 um route wirelength, 1934 vias, and zero final route DRC,
antenna, design-violation, and power-grid violation counts in the Librelane
detailed-route metrics.
hardtop-librelane-signoff runs the full hard-top Librelane signoff. The
promoted signoff artifact writes final DEF, GDS, KLayout GDS, LEF, Magic, ODB,
netlists, SDC, SDF, min/nom/max SPEF, extracted SPICE, Verilog header, render,
and metrics under:
OpenPLL/openlane/IntegerPLL_HardMacroTop/runs/librelane_signoff/final/
The current top-level hard-macro signoff has zero final route DRC, antenna, power-grid, Magic DRC, KLayout DRC, XOR, illegal-overlap, LVS, setup, hold, max-slew, max-cap, max-fanout, and design-violation counts. The hard-top flow intentionally black-boxes all three macro timing models so OpenROAD preserves the physical LEF power pins; the digital-core timing evidence remains the standalone force127 signoff run.
check-hard-macro-top-spice verifies the extracted top SPICE/SPEF wrapper as a
simulator-facing artifact. The current result checks 71 top-level ports, 255
DCO thermometer connections between the digital core and DCO, 44 antenna-repaired
DCO thermometer nets, 325 nominal SPEF nets, 9968 nominal SPEF capacitance
entries, and 1873 nominal SPEF resistance entries. It also generates
build/hard_macro_top_spice/hard_macro_top_spice_norun.spice and runs Xyce
-norun successfully on that inlined extracted-top deck.
check-hard-macro-top-einvp-spice performs the same extracted-interface audit
for the IntegerPLL_HardMacroTop_EINVP coarse-DCO signoff path. The current
result checks 73 top-level ports, the IntegerPLL_DCO_EINVP_COARSE oscillator
subcircuit, 255 DCO thermometer connections, 47 coarse thermometer
connections, 5 antenna-repaired DCO thermometer nets, 374 nominal SPEF nets,
10082 capacitance entries, and 1670 resistance entries, with Xyce -norun
completing syntax and topology analysis.
The promoted EINVP extracted-loop 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-diagnostic
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 E hard-top distributed SPEF RC rather than just the extracted
wrapper topology. They pass with 2020 functional mapped digital-core cells,
4138 skipped physical-only cells, 261 selected hard-top SPEF nets, 1744
capacitance nodes, 1627 resistors, 260 digital pin substitutions, and 25247.633
fF selected capacitance. The startup deck measures 50.813495 MHz; the low-start
first-motion deck moves 0->2, and the high-start deck moves 255->243.019510.
The hard-top-loaded mid-code extracted-DCO lock-window deck starts at code 128,
retargets REF to 29.286759 MHz for the observed loaded E DCO, and holds
code 125..128 with 58.591120 MHz tail frequency and 0.017601 MHz target error.
The min/max E hard-top SPEF variants of that same near-lock deck also pass:
min SPEF selects 23096.023 fF, holds code 125..128, and measures 58.500163 MHz
with 0.073355 MHz target error; max SPEF selects 27119.190 fF, holds code
125..128, and measures 58.549789 MHz with 0.023730 MHz target error.
The low/high extracted-DCO progress decks use the same loaded reference and
normal enable timing. Low start moves code 0->62 over 84..359 ns; its late
window 280..359 ns spans code 42..62 and measures 53.728266 MHz. High start
moves code 255->172; its late window spans code 172..192 and measures
62.952232 MHz. Extending the extracted-DCO decks to rail-start lock windows
passes both sides: low start runs to 900 ns, holds codes 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, holds codes 126..132 in the 650..759 ns tail
window, and measures 58.804895 MHz with 0.231377 MHz target error.
The FF/SS mid-code hold diagnostic keeps DLF_KI=0 and DLF_KP=0, holds the
extracted loop at code 128 through the same filled BBPD RCX, filled
IntegerPLL_DCO_EINVP RCX, and nominal distributed hard-top SPEF RC, and
measures hard-top-loaded code-128 tails of 81.712756 MHz at FF and
38.846037 MHz at SS. This calibrates PVT lock targets. Enabling normal loop
gains at those calibrated references gives FF/SS near-lock evidence through the
same extracted deck: FF holds code 125..134 and measures 81.575035 MHz with
0.137721 MHz target error, while SS holds code 126..128 and measures
38.821045 MHz with 0.024993 MHz target error. The FF rail-start PVT rows are
700 ns extracted-loop diagnostics: 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. The SS low-rail 1400 ns extracted-loop diagnostic
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 extracted-loop 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 provide
FF/SS two-rail extracted-loop PVT lock evidence for the nominal E hard-top
distributed-RC view.
The calibrated behavioral-DCO lock-window decks use the measured E five-point
RCX table and lumped E hard-top SPEF capacitance. They pass from both rails:
low-start moves 0->122 with response 128 and 59.936383 MHz tail frequency,
while high-start moves 255->133 with response 124 and 60.235253 MHz tail
frequency.
Run the representative transistor-level DCO validation:
make -C OpenPLL spiceThe current typical-corner sweep validates top-level DCO_CODE values 0, 64,
128, 192, and 255 with a measured range of roughly 99.836 MHz to 133.013 MHz.
The compact endpoint PVT target validates codes 0 and 255 at tt, ff, ss,
sf, and fs, with a measured span of roughly 66.343 MHz to 187.985 MHz. The
BBPD SPICE target validates both phase polarities. The synthesized DCO decoder
target validates sampled thermometer taps at seven boundary/adjacent codes, the
full-tap decoder target validates all 255 DCO thermometer outputs at those
codes, and the all-code/all-tap decoder target validates all 256 DCO_CODE
values against all 255 DCO thermometer outputs with a batched ngspice DC sweep.
See
SPICE_VALIDATION.md for measured tables and remaining validation gaps. The DCO
SPICE sweep also fails the run if measured frequency is non-monotonic for the
tested code sequence.
Run the PLL-level SPICE acquisition check:
make -C OpenPLL spice-pll-loop
make -C OpenPLL spice-pll-loop-filled-dco
make -C OpenPLL spice-pll-loop-pvtThis uses transistor-level Sky130 BBPD cells, an ideal divider, and a behavioral
DCO frequency model fitted to the no-fill post-layout DCO RCX smoke results. It
currently acquires from both code 0 and code 255 toward the 56.0 MHz target for
REF=11.2 MHz and NDIV=5, with the current no-fill endpoints mapping that
target to code 142.320. The PVT target uses measured all-code DCO spans at
tt, ff, ss, sf, and fs, picks target code 128 in each corner, and
derives a per-corner reference because the measured DCO PVT spans do not fully
overlap. Both low-start and high-start cases pass in all five corners with a
25 LSB/us numerical code-slew setting over 20 us.
The filled-DCO calibrated target uses the same loop harness but fits a
five-point DCO model to the filled signoff RCX transient measurements at codes
0, 64, 128, 192, and 255. It targets the measured filled code-128 frequency
49.762118 MHz with REF=9.95242356154668 MHz and NDIV=5; both low-start and
high-start cases pass with a 24 LSB/us numerical code-slew setting over 18 us.
After the reset-pulse fix, the low-start case ends at code 145.117 with
+0.651 MHz final-window average error, and the high-start case ends at code
117.597 with -0.414 MHz error.
The sampled filled-DCO variant is kept as 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-sweep
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-aperture-sweep
make -C OpenPLL spice-pll-loop-filled-bbpd-sampled-xyce-lockIt uses the same five-point DCO model but updates the numerical code state
around feedback-edge sample apertures with DLF_STEP=2.5 LSB/update. After
the reset-pulse fix and held-decision model update, the default low-start
diagnostic fails at code 74.086 with -1.332 MHz average error, while the
high-start case passes at code 113.513 with -0.410 MHz error. This means the
LSB/update tests are useful for gain and sampling sensitivity, but are not
promoted as lock validation evidence yet. The sampled gain-sweep target covers
DLF_STEP values of 2.5, 3.0, and 3.5 LSB/update at 0, 150, and 300 ps sample
delay using independent ngspice jobs. No point in that 9-case grid passes both
low-start and high-start acquisition. The sampled PI target adds a held sampled
BBPD decision and a proportional DLF_PROP_LSB offset; five of its 16 tested
points pass both rails. The best tested row is DLF_STEP=3.5,
DLF_PROP_LSB=4, and 0 ps sample delay, ending at codes 123.443 and 140.087
with 0.351 MHz worst final-window average error. This supports using
proportional gain, but it is not yet a final RTL gain selection because
DLF_PROP_LSB=4 is a sampled-loop surrogate gain, not the RTL DLF_KP value
directly. RTL DLF_KP=4 is approximately DLF_PROP_LSB=1, while the current
filled-DCO behavioral recommendation DLF_KP=32 is a stronger proportional
setting. RTL DLF_KI=255 is only about 0.25 8-bit DCO-code LSB per update, so
the larger sampled-SPICE steps are accelerated surrogate gains.
The filled-BBPD sampled Xyce aperture sweep uses the post-layout BBPD RCX deck
with DTMAX=1 ns and scans high-start sample aperture phase. The current best
short row uses DLF_STEP=3.5, DLF_PROP_LSB=4, 150 ps sample delay, and
initial DCO phase 0.25 cycles; it moves high-start from code 255 to 216.733 in
2 us. An 8 us follow-up at the same aperture moves from code 255 to 188.862.
Increasing the sampled integral step at the same aperture gives a passing
two-rail filled-BBPD sampled Xyce lock probe: 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 end at codes 100.826 and 123.852 with
0.694 MHz worst final-window average error. This is useful promoted surrogate
evidence for the filled BBPD macro, but it is still not a full extracted
transistor-level PLL simulation.
A four-phase robustness check at that same gain under
build/spice_pll_filled_bbpd_sampled_xyce_phase_robustness/ shows the limit of
the evidence: only the original initial phase 0.25 cycle passes both rails.
Initial phase 0.0 fails low-start, phase 0.5 fails both rails, and phase 0.75
fails both rails. The passing target should therefore be read as a fixed-aperture
filled-BBPD surrogate, not as robust lock across arbitrary initial phase. A
4 us rerun of the same point and a KP32-like DLF_PROP_LSB=8 phase probe also
fail to pass all four phases, so stronger proportional action in this sampled
surrogate is not enough to promote the post-layout-BBPD loop evidence. An
experimental sampled_latched SPICE surrogate was also tried at the same gain;
both loop-current signs fail the four-phase filled-BBPD Xyce diagnostic, so it
is not promoted.
These PLL-level checks are useful loop-polarity and acquisition evidence, but
they are not a substitute for a full extracted transistor-level PLL simulation.
The real RTL loop filter is digital and uses DLF_KI/DLF_KP fixed-point
updates, not a charge-pump current.
The slow extracted mapped-loop Xyce diagnostics are also not app-note
mixed-signal co-simulations. They elaborate the mapped digital-core netlist as
Sky130 standard-cell SPICE and solve those cells as analog devices together
with the BBPD, DCO, and selected SPEF RC. A faster Xyce mixed-signal path should
use Xyce YADC/YDAC bridge devices: Xyce owns the analog BBPD/DCO state, and
an external Python, Icarus/VPI, or compiled C-interface digital driver updates
the divider, DLF, and thermometer code. The current reference environment lacks
libxycecinterface.so, so
make -C OpenPLL xyce-mixed-signal-status reports the bridge-device probe as
available but the shared co-sim interface as missing. A compiled static
C-interface route is available, however: make -C OpenPLL xyce-cinterface-smoke
passes a small YADC/YDAC stepping check, and
make -C OpenPLL xyce-bbpd-cinterface-smoke passes on the filled BBPD RCX macro
with YDAC-driven REF/feedback and YADC-observed UP/DN pulse polarity.
make -C OpenPLL xyce-pll-mixed-signal-smoke now uses that same extracted BBPD
inside a short C-interface mixed-signal loop: an external C++ driver owns the
divider timing, fixed-point DLF update, and a behavioral DCO frequency table
calibrated from filled IntegerPLL_DCO_EINVP RCX TT points. This is the
practical base for gain tuning because it moves the divider/DLF out of the
analog matrix. It is not yet full post-layout PLL validation because the DCO
and digital loop are behavioral in the driver; only the BBPD macro is filled
post-layout RCX in this mixed smoke.
make -C OpenPLL xyce-pll-mixed-signal-gain-sweep adds a focused comparison at
KI=160, FRAC=6, boost_shift=4, and boost_after=2, sweeping KP=0 and
KP=8 from codes 96 and 160 for 10 reference cycles. The latest mixed-BBPD RCX
run passes all four motion checks. It also gives useful proportional-gain
evidence: the KP=0 low-start row ends at code 126 without an exact target hit,
while the KP=8 low-start row reaches exact code 128 at cycle 9. Both
high-start rows cross the target and overshoot, so the mixed sweep supports
nonzero P for responsiveness but does not yet close the final lock/settling
tuning question.
That mixed-signal CSV is now covered by the promoted artifact checker as
xyce_cinterface_mixed_signal_gain_sweep; the checker also includes
objective_deliverable_evidence, a direct requirement-level proof of the Sky130
top, 8-bit control, frequency range, and extracted lock-window evidence. The
checker passes 69 artifact checks after refreshing the top-macro assembly
summary. Longer mixed C-interface
diagnostics confirmed the remaining damping issue: the original KI=160,
KP=8, boost_shift=4, boost_after=2 point walks to codes 156/90 after 20
cycles, and the milder KI=192, KP=8, boost_shift=3, boost_after=2 point
ends low/high at 132/85 after 20 cycles. Treat those as negative settling
evidence, not as final gain signoff.
Do not assume the C-interface targets can be made faster by wrapping the
compiled driver with mpirun. In the current environment, a two-rank YADC/YDAC
smoke reaches Xyce completion but leaves both driver ranks stuck, so
C-interface MPI is not promoted as a usable distributed mixed-signal flow.
Filled post-layout BBPD in-loop continuous-mode diagnostics are not yet practical validation targets. The ngspice 18 us acquisition deck times out with the filled BBPD RCX macro, and the reset-stable continuous Xyce diagnostic sweep still does not pass robust both-rail acquisition:
make -C OpenPLL spice-pll-loop-filled-bbpd-xyce-sweepThe current resolved 4 us grid uses an explicit Xyce DTMAX=1 ns; without that
fourth .TRAN argument, Xyce takes too few accepted timesteps and can leave
the filled BBPD outputs latched for microseconds. No row passes both rails. The
best max-error row is 64 LSB/us: low-start ends at code 23.778 and high-start
ends at code 242.918, with 2.746 MHz worst average error. A 20 us polarity
cross-check confirms LOOP_SIGN=+1 is the moving polarity; LOOP_SIGN=-1
leaves both rails stuck. Runtime is the practical limit: a 4 us, two-rail
resolved probe takes roughly 110 s per gain point on the current serial Xyce
build. The installed Xyce reports Serial from Xyce -capabilities; in the
recorded validation environment, mpirun starts duplicate serial Xyce
processes, so the practical
multicore speedup is --jobs across independent sweep decks. If an MPI-enabled
Xyce deck converges, set XYCE_MPI_PROCS=N for each deck and reduce
SPICE_PLL_SWEEP_JOBS as needed to avoid oversubscribing the machine.
Run the digital-loop gain sweep:
make -C OpenPLL digital-loop-gain-sweepThis is an RTL acquisition check for the real digital loop filter, not SPICE.
It sweeps DLF_KI and DLF_KP using a registered ideal sign detector and
verifies that low-start and high-start cases acquire to target DCO_CODE=128.
With the corrected 200 us window, the rescaled proportional path, and the
first-decision BBPD latch, DLF_KI=64, DLF_KP=0 is the lowest-gain passing
point at 150.308 us worst-case lock time. The exact-code ideal-detector point is
DLF_KI=255, DLF_KP=2, which locks in 37.627 us worst-case. The stronger
filled-DCO acquisition candidate is DLF_KI=255, DLF_KP=32: it locks in
34.375 us worst-case in the ideal bench and leaves only one final code of error
there. Final gain selection still needs phase-domain stability and jitter
validation.
Run the top-level behavioral phase acquisition check:
make -C OpenPLL pll-top-model-acqThis instantiates IntegerPLL_Top with the behavioral DCO and two-flop BBPD
models, sets MMDCLKDIV_RATIO=8 and REF=12.742100 MHz, and verifies the
legacy DLF_KI=255, DLF_KP=4 setting from both code 0 and code 255. The
current result is low-start code 0 to 127 with 37.408 us lock, and high-start
code 255 to 128 with 22.446 us lock.
Run the top-level behavioral phase acquisition check with the filled-RCX DCO calibration:
make -C OpenPLL pll-top-filled-dco-acq
make -C OpenPLL pll-top-filled-dco-gain-sweepThis enables the five-point filled-DCO behavioral model and uses
MMDCLKDIV_RATIO=8, REF=6.220298 MHz, a 16-code target tolerance, and the
promoted DLF_KI=255, DLF_KP=32 setting. The current result is low-start
code 0 to 136 with 70.244 us lock, and high-start code 255 to 136 with
66.519 us lock. Both cases pass by entering the 16-code target window and
reaching exact code 128 transiently. The gain sweep checks DLF_KI 192 and 255
against DLF_KP 0, 4, 8, 16, and 32. Nine of ten points pass; the
DLF_KI=255, DLF_KP=0 row reaches the target transiently but fails the
220 us endpoint tolerance, while DLF_KI=255, DLF_KP=32 is the fastest
passing row and finishes within eight codes from both rails. This is behavioral
phase-domain evidence; extracted jitter/stability validation is still required.
Run the synthesized DLF proportional-path SPICE check:
make -C OpenPLL spice-dlf-static
make -C OpenPLL spice-dlf-static-kp16
make -C OpenPLL spice-dlf-static-kp32This extracts a 109-cell Sky130 combinational cone from the mapped digital core
and verifies that mid-scale hold/increase/decrease cases produce DCO_CODE
128, 129, and 127 with DLF_KI=255, DLF_KP=4. The kp16 and kp32
variants verify stronger-P candidates. KP16 measures hold/increase/decrease
codes 128, 132, and 124; KP32 measures 128, 136, and 120.
Run the synthesized DLF sequential update SPICE check:
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-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-kluThis extracts the sequential DCO-code update cone from the mapped digital core
and uses Xyce to verify both BBPD directions and reset-overlap first decision
capture. The kp32 cone currently contains 330 mapped cells after the
BBPD-event reset gating and DLF rail-escape fix. The check records both final
code and the directional
response-window code, because the proportional term can be a transient bump
while the integral term moves by less than one exported 8-bit DCO-code LSB.
For DLF_KI=255, DLF_KP=32, the refreshed cone run passes UP, DN,
UP-then-2'b11, and DN-then-2'b11 cases: UP reaches response code 136 from
128, while DN reaches a lower response code and ends at 127. The full-core KP32
overlap target uses all mapped cells and also passes the reset-overlap cases.
The installed Xyce binary reports
Serial, so mpirun cannot parallelize a single circuit solve with this
build; the DLF-update targets instead use SPICE_PLL_SWEEP_JOBS to run
independent cases concurrently. An MPI-enabled Xyce build is available at
$XYCE_MPI_ROOT/bin/Xyce, but it currently aborts at the first
25 ps step on the full mapped standard-cell DLF deck, so the promoted full-core
artifacts use `` in serial mode.
spice-dlf-update-signoff-nl-kp32 checks the current LibreLane signoff metrics
and then reads
openlane/IntegerPLL_DigitalCore/runs/librelane_signoff/final/nl/IntegerPLL_DigitalCore.nl.v.
The parser handles the final post-PnR netlist syntax and extracts a 540-cell
DCO-code update cone from the 5643 parsed sky130_fd_sc_hd instances. With a
compressed 24 ns Xyce window, the final-netlist cone passes the same KP32
increase, decrease, UP-then-2'b11, and DN-then-2'b11 checks. This is
post-PnR gate-netlist transistor-level evidence, but the transient deck still
does not include SPEF interconnect parasitics.
spice-dlf-update-signoff-spef-kp32 adds the nominal final SPEF total
capacitance for every modeled cone net as a lumped capacitor. The current run
adds 582 capacitors totaling 2678.819 fF to the same 540-cell final-netlist
cone, and the four KP32 directional update cases still pass. This validates
post-route capacitive loading for the DLF update cone; distributed SPEF
resistance and coupling topology are not inserted yet.
spice-dlf-update-signoff-spef-rc-kp32 substitutes final SPEF instance-pin
nodes into that cone and inserts the nominal SPEF resistance tree plus grounded
capacitance at SPEF nodes. The current decks contain 540 cells, 2056 substituted
pin nodes, 3373 CSPEF_* caps, and 2513 RSPEF_* resistors; all four KP32
directional update cases pass. Coupling entries are grounded at the current-net
endpoint to keep the reduced cone self-contained, so this is distributed
post-route RC evidence for the DLF cone, not a full-chip extracted transient.
spice-bbpd-dlf-integration uses the filled BBPD Magic RCX deck to drive the
same mapped DLF update cone. The BBPD reset is held until DLF_En=1 and
DLF_Clear=0, matching the top-level reset policy. With DLF_KI=255,
DLF_KP=32, REF-leading feedback reaches response code 136 from 128, and
feedback-leading REF reaches a lower response code and ends at 127. The DLF
update clock is still a boundary source in this target, so it verifies the
BBPD-output/DLF-input electrical interface but is not a full closed-loop
oscillator simulation.
spice-bbpd-dlf-integration-full runs the same filled-BBPD-RCX stimulus
through the full mapped digital-core netlist. It passes the same directional
response checks. On the current serial Xyce build, those two full-core cases
took about 306 s each when launched as independent simulator processes.
spice-bbpd-dlf-integration-signoff-spef-rc drives the final 540-cell DLF
cone plus distributed nominal SPEF RC from the filled BBPD RCX macro. The
REF-leading case ends at code 136 with response code 152, and the
feedback-leading case ends at code 120 with response code 32. Each deck includes
2056 substituted SPEF pin nodes, 3373 CSPEF_* caps, and 2513 RSPEF_*
resistors, plus the BBPD RCX subcircuit.
spice-pll-mapped-loop-smoke closes a short feedback-divider-included path
through the full mapped digital-core netlist. The mapped MMD divider drives
CLKDIV_RETIMED, the filled BBPD RCX macro compares it against REF, and the
mapped DLF updates DCO_CODE; the DCO is still the five-point behavioral model
fitted to filled-DCO RCX measurements. With DLF_KI=255, DLF_KP=32, and
MMDCLKDIV_RATIO=2, phase-selected low/high cases pass in a 180 ns Xyce run:
low start at initial DCO phase 0.0 moves code 0 to 8, and high start at phase
0.25 moves code 255 to 247. This proves the mapped divider/BBPD/DLF loop
connectivity and polarity for one short window, not full extracted PLL lock
robustness.
spice-pll-mapped-loop-gain-sweep keeps that same mapped divider, filled BBPD
RCX macro, mapped DLF, and behavioral filled-DCO calibration, then sweeps
DLF_KP from a code-128 start under an upward decision. The 180 ns Xyce rows
are monotonic: DLF_KP=0,4,8,16,32 produces response deltas
0, 1, 2, 4, and 8 DCO-code LSB. This is the mapped-loop gain-tuning companion
to the extracted-DCO KP0/KP32 mid-code anchors below.
The mapped-loop generator also has a diagnostic extracted-DCO mode through
--dco-impl postlayout. It instantiates the filled DCO RCX macro on the mapped
DCO_THERM[254:0] decoder outputs while keeping the filled BBPD RCX macro in
the loop. spice-pll-mapped-loop-extracted-dco-startup promotes a serial-Xyce
startup smoke for the low-start case with uic plus a VPWR/VPB rail ramp. The
50 ns run uses the full 906-cell mapped digital core, filled BBPD RCX, and
filled DCO RCX; it observes two PLLOUT rises after 15 ns, a 21.616261729 ns
startup period, and a 46.261467988 MHz startup frequency. Because DLF_En has
not yet asserted in this window and the DCO code remains effectively 0, this is
startup evidence for the coupled extracted-DCO deck, not code-correction or
lock evidence. spice-pll-mapped-loop-extracted-dco-startup-mpi4-klu runs the
same startup deck with $XYCE_MPI_ROOT/bin/Xyce -linsolv KLU and
four MPI ranks, meaning mpirun -np 4 rather than four Xyce threads. That row
also passes, with a 21.616261760 ns startup period and 46.261467923 MHz startup
frequency, and completed in 226.138 s versus 440.731 s for the serial run on
the recorded validation environment. Four ranks are the current empirical default, not a proven
optimum for all extracted-DCO decks. A short 12 ns extracted-DCO debug timing
sweep 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 FRAC=6 260 ns companion rows below confirm that 16 ranks
improve wall time on real extracted-DCO loop decks while preserving endpoint
behavior. The explicit KLU override is required: the same MPI-capable Xyce
binary without -linsolv KLU leaves the sampled DCO thermometer inputs low and
does not start the oscillator, even at one rank.
spice-pll-mapped-loop-extracted-dco-motion extends that coupled extracted-DCO
deck to 180 ns from both rails. Low start moves code 0 to response/end code 8;
high start begins at code 255, reaches a downward response code of 166.034845,
dwells at code 247 for 37.150000 ns in the response window, and returns to code
255 by the endpoint. Low start dwells at code 8 for 41.612512 ns. The debug
CSV now reports the DLF integrator separately from the visible proportional
output: low-start integrator code remains 0.00 across the measurement window,
while high-start moves from 255.00 to 254.75.
spice-pll-mapped-loop-extracted-dco-motion-mpi4-klu repeats those 180 ns
first-correction decks with $XYCE_MPI_ROOT/bin/Xyce -linsolv KLU
and four MPI ranks. The MPI/KLU rows match the serial response metrics: low
start reaches code 8 with a 41.609479 ns dwell, and high start reaches response
code 166.034845 with the same 37.150000 ns dwell at code 247. The elapsed times
were 692.448 s and 512.197 s, respectively, in the recorded validation environment.
spice-pll-mapped-loop-extracted-dco-low-trend-mpi4-klu and
spice-pll-mapped-loop-extracted-dco-high-trend-mpi4-klu extend the MPI/KLU
decks to 260 ns. 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 runs 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: it proves first directional DLF output movement and slow integral
accumulation in both directions through the full 906-cell mapped digital core
with filled BBPD RCX and filled DCO RCX, but it is still not closed-loop
acquisition or lock validation.
The FRAC=6 extracted-DCO trend targets
spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi4-klu and
spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi4-klu repeat that
260 ns coupled check using the 889-cell FRAC=6 mapped core. Low start improves
from visible code 8 to code 9 and raises integrator movement from 0.25 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 old transient dip to code 166 is gone.
The phase-0.5 high-start repeat
spice-pll-mapped-loop-frac6-extracted-dco-high-phase0p5-trend-mpi4-klu
matches the phase-0.25 waveform sequence and endpoint: 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. This is stronger extracted-loop gain
evidence for FRAC=6 and a neutral phase-sensitivity check, but still not lock.
The MPI16 companion targets
spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi16-klu and
spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi16-klu reproduce the
same endpoints and integrator motion while reducing wall time to 568.490 s and
467.746 s, respectively, versus 800.325 s and 669.374 s for MPI4.
spice-pll-mapped-loop-frac6-extracted-dco-progress-500ns-mpi16-klu extends
that true rail-start extracted-DCO check to 500 ns. Low start moves visible code
0 to 15 with integrator 7.75, and high start moves visible code 255 to 240 with
integrator 248.00. The rows use two concurrent MPI16/KLU Xyce jobs and record
1473.445 s and 1408.858 s elapsed wall time. The tail frequencies are still
46.243607848 MHz and 53.072273197 MHz against the 49.762117808 MHz target, so
this is stronger rail-start progress evidence but not lock.
spice-pll-mapped-loop-frac6-extracted-dco-progress-en85-probe-mpi16-klu tests
whether the DLF_En=85 ns release timing from the near-high local lock row also
helps rail starts. It does not: low-start only responds transiently to code 8
and returns to code 0 by 299 ns with integrator 0.75, while high-start moves
255 to 244 with integrator 252.00. This keeps enable85 as a phase-selected
near-lock aid, not the promoted rail-start setting.
spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-mpi16-klu is one of
the current strongest extracted-DCO near-lock rows. It starts the FRAC=6,
DLF_KI=255, DLF_KP=32 loop at code 128, runs 220 ns with MPI16/KLU, stays
inside code 127..140 over the 139..219 ns lock window, ends at visible code
137 with integrator 129.75, and measures 49.676823500 MHz against the
49.762117808 MHz target. This supports the local gain setting near the target
code, but it starts near lock and is not rail-start acquisition.
spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-ki192-kp8-probe-mpi16-klu
checks the lower-P DLF_KI=192, DLF_KP=8 candidate from the behavioral
filled-DCO top sweep in the same extracted mid-code deck. It is intentionally
non-promoted: visible code moves only 128 to 131 with integrator 129.50, but
the 139-219 ns tail is 49.488441487 MHz, 0.273676 MHz below target, so it
misses the tighter 0.15 MHz bound and is worse than the promoted KP32 row.
The non-promoted diagnostic
spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-probe-mpi16-klu
starts the same loop at code 160 and requires downward motion plus the 0.25 MHz
tail-frequency bound, but it currently fails cleanly: code moves upward to 169,
the integrator advances from 160.00 to 161.75, and the 139-219 ns tail frequency
is 50.602594662 MHz. This is useful phase/tuning evidence because it shows the
short extracted loop can still move the wrong way from a nominally high local
start; it is not promoted lock evidence.
spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-en85-mpi16-klu
reruns that local high-side start with DLF_En=85 ns, after the REF edge and
before the feedback edge. The first captured BBPD decision is DN, and the 380 ns
MPI16/KLU artifact passes lock_window: visible code moves 160 to 146,
integrator moves 160.00 to 154.00, and the 299-379 ns tail measures
50.001270745 MHz, 0.239153 MHz above target, over four rises. The row gives the
mid-code check a useful high-side companion, but it is still release-phase
selected and does not prove rail-start lock.
spice-pll-mapped-loop-extracted-dco-midcode-inc-mpi4-klu starts that same
extracted-DCO deck at code 128 and phase-selects an upward decision. The 180 ns
run moves visible DCO_CODE from 128 to 136, keeps the internal integrator at
128.00, records eight PLLOUT rises and a 48.898483569 MHz startup frequency,
and dwells at code 136 for 47.250000 ns. This is mid-code proportional-path and
gain-polarity evidence, not acquisition or lock evidence.
spice-pll-mapped-loop-extracted-dco-midcode-kp0-hold-mpi4-klu uses the same
initial code, phase, BBPD RCX, DCO RCX, and MPI4/KLU solver settings with
DLF_KP=0. It completes with visible DCO_CODE held at 128 for the full
79-179 ns measurement window and 99.725000 ns of code-128 dwell. This makes the
need for nonzero proportional gain visible in the extracted loop without
claiming acquisition or lock.
The artifact audit also measures PLLOUT over 119-179 ns for those two
extracted-DCO mid-code rows. KP32 averages 49.699374052 MHz, KP0 averages
49.464265788 MHz, and the 0.235108264 MHz delta confirms the visible code
movement is reflected at the oscillator output.
spice-pll-mapped-loop-signoff-nl-smoke runs the same short first-correction
loop through the final digital-core signoff netlist. The simulator drops
physical-only tap, fill, decap, and antenna diode cells for Xyce compatibility;
the resulting functional signoff deck contains 1614 mapped cells and omits
4029 physical-only cells. Low start moves through response code 8, and high
start reaches response code 190 in the 180 ns window. This is stronger
signoff-netlist connectivity evidence, but the DCO is still behavioral.
spice-pll-mapped-loop-signoff-nl-hardtop-spef-smoke repeats a short
mapped-loop smoke using the hard-top-consistent FRAC=6 force-to-mid final
digital-core signoff netlist, DLF_KI=160, DLF_KP=8, and the MPI/KLU Xyce
binary at four ranks per rail-start case. It drops 4138 physical-only cells
from that final netlist, keeps 2020 functional mapped cells, and adds lumped
nominal hard-macro-top SPEF capacitance on 261 loop/inter-macro nets. Those
loads include all 255 DCO thermometer interconnects and total 27097.842 fF.
The behavioral DCO observes the loaded DCO_THERM bus rather than the debug
DCO_CODE bus, matching the hard DCO macro control interface. With the extra
hard-top loading, low-start moves through response code 22 in a 220 ns window
and high-start moves down through response code 233. This is stronger
top-level interconnect-loading evidence than the plain final-netlist smoke, but
it is still a behavioral-DCO mapped-loop transient with lumped top-level SPEF
capacitance, not a full extracted hard-macro-top closed-loop transient.
spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-startup-diagnostic is an
optional topology diagnostic for the same final signoff netlist and gains. It
substitutes the selected digital-core and macro pins onto distributed hard-top
SPEF RC networks rather than collapsing those nets to lumped capacitance. The
generated low-start deck covers the same 261 hard-top loop/inter-macro nets,
emits 1752 grounded capacitance nodes and 1657 resistors, substitutes 260
digital pins, and covers all 255 DCO thermometer interconnects for 27097.841 fF
total selected capacitance. The 60 ns startup check passes with three PLLOUT
rises and a measured 46.270645 MHz startup frequency. On this host, the same
deck completed in 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, so the target defaults to 16 MPI ranks. This is a distributed-RC syntax,
topology, and startup check, not a two-rail motion or lock signoff.
spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-startup-diagnostic
is the extracted-DCO companion. It uses the final force-to-mid signoff
digital-core netlist, filled BBPD RCX, filled DCO RCX, and the same distributed
hard-top SPEF RC selection. The 50 ns low-start deck has 2020 functional mapped
cells, skips 4138 physical-only cells, keeps 261 hard-top SPEF nets with 1752
capacitance nodes and 1657 resistors, substitutes 260 digital pins, and includes
27097.841 fF of selected hard-top capacitance. It passes startup with two PLLOUT
rises after 15 ns, a 21.643727 ns period, and 46.202763 MHz measured startup
frequency. The full Xyce/MPI16/KLU run reported 63443 devices, 182651 unknowns,
and about 225.884 s elapsed time. This proves elaboration and startup for the
combined extracted-DCO plus hard-top RC deck, but it is not two-rail motion,
lock, or PVT signoff.
spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-motion-low-diagnostic
and
spice-pll-mapped-loop-signoff-nl-hardtop-spef-rc-extracted-dco-motion-high-diagnostic
extend that same combined deck through the first active DLF update. With
DLF_En=85 ns and the 84..99 ns measurement window, low-start moves from code 0
to 2 with response code 2 and 46.150194 MHz startup frequency, while high-start
moves from code 255 to 253 with response code 253 and 50.278137 MHz startup
frequency. Both 100 ns decks contain 2020 functional mapped cells, skip 4138
physical-only cells, and include 261 selected hard-top SPEF nets, 1752
capacitance nodes, 1657 resistors, 260 digital pin substitutions, and 27097.841
fF selected hard-top capacitance. Xyce/MPI16/KLU reports 63443 devices and
182651 unknowns; elapsed time was 487.306 s for low-start and 538.010 s for
high-start. This is two-sided first closed-loop motion evidence for the combined
extracted-DCO plus hard-top RC deck, not acquisition, lock, or PVT signoff.
spice-pll-mapped-loop-phase-sweep is the corresponding promoted robustness
probe. It runs low/high rail starts at initial DCO phases 0, 0.25, 0.5, and
0.75 cycles using independent Xyce jobs. 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: low-start response code is 8 at every phase, while
high-start response code is 246 or 247. The result is stronger first-correction
evidence, but it is still a short behavioral-DCO transient rather than full
extracted PLL lock evidence.
spice-pll-mapped-loop-progress-1us extends the same mapped-core, filled-BBPD
RCX, behavioral filled-DCO setup to 1 us at DLF_KI=255, DLF_KP=32 using
the MPI-enabled Xyce/KLU binary.
Low-start moves from code 0 to 9 and reduces frequency error from -3.505392 MHz
to -3.267220 MHz; high-start moves from code 255 to 243, reaches response code
145.808033 during the window, and reduces frequency error from +2.587713 MHz to
+2.448400 MHz. This proves continued closed-loop progress beyond the first
correction, but it is not acquisition or lock. The MPI4/KLU run completed in
356.177 s for low start and 445.105 s for high start, versus 611.898 s and
751.432 s for the earlier serial Xyce artifact with the same endpoint metrics.
A non-promoted KP128 500 ns diagnostic reaches larger transient response codes
but falls back to the rail endpoints; stronger proportional gain alone is not a
substitute for faster integral convergence.
The current gain-tuning candidate is to keep the 10-bit DLF word and exported
8-bit DCO code, but reduce DLF_FRAC_WIDTH from 8 to 6. This uses the existing
RTL parameter as an integral-step scaling knob: DLF_KI=255 becomes about one
8-bit DCO-code LSB per accepted BBPD decision instead of about 0.25 LSB. The
diagnostic targets are digital-loop-gain-sweep-frac6,
pll-top-filled-dco-gain-sweep-frac6, and
spice-pll-mapped-loop-frac6-progress-1us; the high-start phase diagnostic is
spice-pll-mapped-loop-frac6-high-phase-500ns. The extracted-DCO FRAC=6 trend
targets are spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi4-klu and
spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi4-klu, plus the
phase-0.5 high-start repeat
spice-pll-mapped-loop-frac6-extracted-dco-high-phase0p5-trend-mpi4-klu.
The rank-configurable companion targets are
spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi-klu and
spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi-klu; the convenience
aliases spice-pll-mapped-loop-frac6-extracted-dco-low-trend-mpi16-klu and
spice-pll-mapped-loop-frac6-extracted-dco-high-trend-mpi16-klu use 16 ranks on
this host. The longer rail-start progress target is
spice-pll-mapped-loop-frac6-extracted-dco-progress-500ns-mpi16-klu. The
non-promoted rail-start enable-phase diagnostic is
spice-pll-mapped-loop-frac6-extracted-dco-progress-en85-probe-mpi16-klu. The
bounded near-lock companion target is
spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-mpi16-klu; the
non-promoted lower-P gain diagnostic is
spice-pll-mapped-loop-frac6-extracted-dco-midcode-lock-ki192-kp8-probe-mpi16-klu;
the phase-selected high-side near-lock companion is
spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-en85-mpi16-klu. The
non-promoted default-enable high-side diagnostic is
spice-pll-mapped-loop-frac6-extracted-dco-near-high-lock-probe-mpi16-klu. The
non-promoted FRAC=5 extracted-DCO gain-scaling diagnostic is
spice-pll-mapped-loop-frac5-extracted-dco-progress-300ns-probe-mpi16-klu.
The boosted-acquisition reproducers are
digital-loop-gain-sweep-frac6-acqboost-s2a3,
pll-top-filled-dco-gain-sweep-frac6-acqboost-s2a3,
synth-frac6-acqboost-s2a3, and
spice-pll-mapped-loop-frac6-acqboost-s2a3-progress-1us. The postlayout-RCX
DCO follow-up probe is
spice-pll-mapped-loop-frac6-acqboost-s2a3-extracted-dco-progress-300ns-probe-mpi16-klu.
An optional same-direction acquisition boost is now available in the DLF and is
disabled by default. It watches for repeated accepted BBPD decisions in the same
direction and applies DLF_ACQ_BOOST_SHIFT to the integral step after
DLF_ACQ_BOOST_AFTER repeats; it falls back to the normal KI path when the
decision stream changes or idles. The first FRAC=6 probe uses
DLF_ACQ_BOOST_SHIFT=2, DLF_ACQ_BOOST_AFTER=3. It reduces ideal digital-loop
worst-case lock for DLF_KI=255, DLF_KP=32 to 2.870 us, and the filled-DCO
top behavioral row for the same gains passes both rails in 5.598 us worst case.
The boosted Sky130 mapped core has 970 cells and improves the 1 us mapped
behavioral-DCO SPICE endpoints from 0->20 / 255->233 to 0->40 / 255->215. This
is the best current behavioral path toward practical rail-start acquisition,
but the postlayout-RCX DCO follow-up is much weaker: the 300 ns MPI16/KLU probe
ends at 0->10 and 255->245, with only 2.75 low-side and 2.00 high-side
integrator-code movement. The boost remains non-promoted for extracted-DCO
rail-start acquisition.
Two shorter same-direction thresholds were checked as non-promoted diagnostics.
DLF_ACQ_BOOST_AFTER=1 with DLF_KI=192, DLF_KP=32 passes the filled-DCO
top behavioral sweep, but fails the mapped behavioral-DCO SPICE probe because
the high-start case collapses to the low rail before the measurement window.
DLF_ACQ_BOOST_AFTER=2 with the same gains passes the mapped behavioral-DCO
probe at 0->18 and 255->236 in 1 us, but its 300 ns postlayout-RCX DCO probe
only reaches 0->12 and 255->245. Digital-only boost tuning is therefore not yet
closing the extracted-DCO rail-start gap.
The legacy mapped behavioral-DCO acquisition candidate uses
DLF_FRAC_WIDTH=6, DLF_PROP_RAIL_GUARD=1, DLF_ACQ_RAIL_BOOST=1,
DLF_ACQ_FORCE_RAIL_CODE=127, DLF_ACQ_BOOST_SHIFT=4, and
DLF_ACQ_BOOST_AFTER=2. The recommended gain point is DLF_KI=160,
DLF_KP=8, keeping a nonzero proportional path while using deterministic
force-to-mid acquisition from either rail. The reproducible targets are
digital-loop-gain-sweep-frac6-force127-s4a2,
pll-top-filled-dco-gain-sweep-frac6-force127-s4a2,
synth-frac6-force127-s4a2,
spice-pll-mapped-loop-frac6-force127-s4a2-extracted-dco-progress-500ns-mpi16-klu,
and
spice-pll-mapped-loop-frac6-force127-s4a2-extracted-dco-lock-820ns-mpi16-klu.
The corresponding physical signoff targets are librelane-signoff-force127-s4a2
and check-librelane-signoff-force127-s4a2; the post-PnR final-netlist
closed-loop motion target is
spice-pll-mapped-loop-frac6-force127-s4a2-final-nl-extracted-dco-motion-220ns-mpi16-klu,
and the corresponding final-netlist lock-window target is
spice-pll-mapped-loop-frac6-force127-s4a2-final-nl-extracted-dco-lock-820ns-mpi16-klu.
The filled-DCO top behavioral sweep passes all tested gain points from both
rails; the KI=160, KP=8 row ends at codes 128/127 with 2.010 us worst-case
lock. The registered-control direct Yosys Sky130 mapped core has 1307 cells and
13733.171200 square microns, including 255 registered DCO thermometer outputs.
The force-to-mid LibreLane signoff artifact has 3164 stdcells, 30.0674%
utilization, 2.794 ns worst setup slack, 0.115 ns worst hold slack, 67207
microns routed wire length, 13321 vias, 3.431 mW reported total power, 0.706 mV
worst IR drop, and zero DRC/LVS/STA/power-grid violations.
The old 2 us mapped behavioral-DCO endpoint target is not promoted for the registered-control RTL. With the binary code observer, mapped bus transition states can look like low DCO codes; with the thermometer observer, the 2 us reruns timed out before completing. Current promoted loop validation therefore uses the extracted-DCO targets below.
The 500 ns force-to-mid extracted-DCO progress target places the filled DCO RCX macro in that same mapped loop and runs Xyce/KLU with 16 MPI ranks per deck. Low-start moves from code 0 to 102, and high-start moves from code 255 to 153 after dipping to code 129. Tail-frequency error remains 2.262788 MHz low-start and 1.791117 MHz high-start over 119..499 ns, so this is strong rail-start progress evidence rather than extracted-DCO lock.
The 820 ns force-to-mid registered-control extracted-DCO lock-window target uses the filled DCO RCX macro, filled BBPD RCX macro, thermometer-code observation, Xyce/KLU with 16 MPI ranks per deck, and two rail-start decks in parallel. It checks the full 700..819 ns tail window against code bounds 112..144 and a 0.8 MHz frequency-error limit. Low-start passes with code 122..128 and 0.411769 MHz tail error; high-start passes with code 127..133 and 0.257118 MHz tail error. This is the current strongest TT extracted-DCO rail-start lock-window evidence, though not a full PVT or multi-microsecond extracted PLL signoff.
The final-signoff-netlist extracted-DCO targets then instantiate the LibreLane force127 final Verilog netlist in the same loop, skipping 4138 physical-only filler/decap/tap cells and keeping 2020 functional mapped digital-core cells. The 220 ns two-rail Xyce/KLU motion run passes with low-start motion 0->22 and high-start motion 255->222. The stronger 820 ns final-netlist lock-window run also passes both rails with the same 112..144 tail code bounds and 0.8 MHz frequency-error limit: low-start ends at code 128 with tail-window code 122..128 and 0.397645 MHz tail error, while high-start ends at code 132 with tail-window code 126..132 and 0.273624 MHz tail error. This is post-PnR functional-netlist TT closed-loop lock-window evidence, but not full extracted PVT or multi-microsecond rail-start signoff.
An optional DLF_UPDATE_ON_PLLOUT mode was then added as a diagnostic to remove
one divider-cycle of BBPD-decision-to-integrator latency. The default remains
divider-clocked DLF operation. Because the Sky130 hard top instantiates the
digital core as a placed macro, PLLOUT-clocked DLF operation requires rebuilding
that digital-core macro variant; it is not a runtime knob on the shipped
25 MHz configured wrapper. With FRAC=6 and no boost, the ideal digital-loop
sweep passes with DLF_KI=255, DLF_KP=32 at 10.074 us worst-case lock, while
the filled-DCO top behavioral sweep prefers DLF_KI=192, DLF_KP=8, ending at
codes 129/124 in 24.795 us. Combining PLLOUT-update mode with
DLF_ACQ_BOOST_SHIFT=2, DLF_ACQ_BOOST_AFTER=2 improves the top behavioral
candidate to DLF_KI=192, DLF_KP=32, ending at 137/120 in 6.363 us. The
fast+boost mapped Sky130 core synthesizes to 975 cells and 6434.921600 square
microns, but mapped behavioral-DCO SPICE does not justify extracted-DCO
promotion: KI=192, KP=32 ends 0->0 and 255->217 in 1 us, and the lower-gain
KI=128, KP=8 case ends 0->2 and 255->238. The low-start waveform shows
alternating BBPD decisions that pull the proportional output back to the rail,
so this path remains diagnostic rather than a promoted acquisition fix.
The current release promotes the 25 MHz configured RTL/source interface through
IntegerPLL_HardMacroTop_EINVP_25MHzConfigured; the physical wrapper has been
regenerated and is signed-off release evidence. Robust acquisition from
arbitrary phase and code remains the next BBPLL/control architecture extension,
not a packaging gap.
FRAC=6 behavioral results are promising. The ideal digital-loop sweep reaches
10.063 us worst-case lock for DLF_KI=255, DLF_KP=32, and the filled-DCO top
behavioral sweep finds DLF_KI=192, DLF_KP=8 ending at code 129 from both
rails in 24.963 us worst case. The mapped-cell, filled-BBPD RCX, behavioral-DCO
SPICE result is mixed but improved after phase selection: DLF_KI=255,
DLF_KP=32 moves low-start from code 0 to 20 in 1 us, and high-start at initial
DCO phase 0.5 moves from code 255 to 233 with response code 224.000870. A 500 ns
high-start phase sweep ends near code 243 at phases 0 and 0.25, code 241 at
phase 0.5, and code 255 at phase 0.75 after a transient excursion to code
134.001867. This should guide the next gain/phase sweep, but it is not promoted
as final validation evidence yet.
The FRAC=6 extracted-DCO trend now confirms that the stronger integral scaling
is visible in the coupled RCX deck: low-start ends at code 9 with integrator
movement from 0.00 to 1.75, and high-start ends at code 246 with integrator
movement from 255.00 to 254.00. The MPI16 repeats match those endpoints and are
audited as elapsed-time improvements. The 500 ns MPI16 rail-start progress row
extends that to code 15 from low-start and code 240 from high-start, with
integrators 7.75 and 248.00; it is still more than 3 MHz from target. The MPI16
mid-code lock-window row adds near-target evidence by holding code 127..140 and
measuring 49.676823500 MHz against the 49.762117808 MHz target from 139..219 ns.
The lower-P KI=192, KP=8 extracted diagnostic reduces visible code overshoot
to code 131 but misses the tighter tail-frequency target, so KP32 remains the
promoted near-lock setting. It still does not show rail-start closed-loop
acquisition. The enable-85 high-side companion starts at code 160 and moves down
to code 146 with 0.239153 MHz tail error from 299..379 ns, while the
default-enable probe from the same code moves upward to 169 and measures
50.602594662 MHz in the tail window. This is useful two-sided near-lock
evidence, but it remains BBPD release-phase selected.
FRAC=5 and FRAC=4 were also probed as stronger integral-scaling candidates. The
new diagnostic targets are digital-loop-gain-sweep-frac5,
pll-top-filled-dco-gain-sweep-frac5,
spice-pll-mapped-loop-frac5-progress-1us,
spice-pll-mapped-loop-frac5-extracted-dco-progress-300ns-probe-mpi16-klu,
digital-loop-gain-sweep-frac4, pll-top-filled-dco-gain-sweep-frac4, and
spice-pll-mapped-loop-frac4-progress-500ns. The behavioral top model likes
some of these rows, but mapped SPICE does not promote them: FRAC=4
DLF_KI=192, DLF_KP=32 snaps high-start back to code 255 in 500 ns, while
FRAC=5 DLF_KI=192, DLF_KP=32 ends the 1 us mapped run at code 5 from
low-start and code 239 from high-start. FRAC=6 therefore remains the best
mapped behavioral-DCO candidate so far.
The FRAC=5 extracted-DCO probe passes the motion check with the postlayout-RCX DCO and two concurrent MPI16/KLU Xyce jobs, but it is not stronger than the promoted FRAC=6 extracted evidence. Over the 129..299 ns window, low-start moves code 0 to 8 with a 46.190967911 MHz tail, and high-start moves code 255 to 244 with a 53.231394237 MHz tail. Both remain more than 3.4 MHz from the 49.762117808 MHz target, so this is useful negative gain-tuning evidence rather than acquisition or lock. The rows took 1080.527 s and 840.300 s elapsed, and the logs include Xyce timing summaries for 16 processors.
Run a heavier exhaustive typical-corner oscillator transient sweep when needed:
make -C OpenPLL spice-dco-allThis target now validates all 256 top-level DCO_CODE values at TT. The latest
passing run measured a monotonic 99.784 MHz to 132.850 MHz span with strictly
positive adjacent-code frequency steps.
Run the exhaustive all-code PVT oscillator transient sweep:
make -C OpenPLL spice-dco-pvt-allThis validates all 256 top-level DCO_CODE values across tt, ff, ss,
sf, and fs. The latest passing run measured a monotonic 66.324 MHz to
187.555 MHz total span across 1280 code/corner transient cases.
Run only the synthesized decoder SPICE check:
make -C OpenPLL spice-dco-decoderRun sampled-tap synthesized decoder SPICE for every 8-bit code:
make -C OpenPLL spice-dco-decoder-allRun full-tap synthesized decoder SPICE at low-end, midpoint, and high-end code boundaries:
make -C OpenPLL spice-dco-decoder-full-tapsRun all-code, all-tap synthesized decoder SPICE:
make -C OpenPLL spice-dco-decoder-all-tapsThe DLF uses an active-low async reset only for constant reset-to-zero. Loading
an external initial control word is done synchronously through DLF_Clear;
this avoids non-constant async reset behavior that does not map cleanly to
Sky130 standard-cell flip-flops.
openlane/IntegerPLL_DigitalCore/config.tcl is retained as the original
OpenLane-style starter. The active physical-flow configuration is
openlane/IntegerPLL_DigitalCore/config.json, which runs with LibreLane v3.0.4
from $LIBRELANE_ROOT.
The PnR SDC intentionally treats slow SPI/config-style inputs and DCO macro
control outputs as false paths. The synchronous timing target is the 8 ns
PLLOUT domain plus the BBPD and feedback-divider interface. This is the right
constraint shape for a PLL control block, because the 255 DCO thermometer
outputs drive analog/macro controls rather than conventional one-cycle
registered outputs.
Do not send the full IntegerPLL_Top through ordinary digital synthesis until
the BBPD and DCO have been hardened as physical macros. A ring oscillator and
bang-bang detector delay/reset path are intentionally timing-sensitive and can
be broken by optimization.
The digital core includes a small PLLOUT-domain BBPD event-capture latch
before the DLF. It captures the first non-idle BBPD polarity in an update
interval and holds that decision across the next DLF update. The capture state
is cleared while DLF_En=0 or DLF_Clear=1, and the top-level BBPD reset is
held over the same inactive window. This prevents stale pre-enable BBPD state
from becoming the first active DLF command and prevents a captured UP or DN
pulse from being overwritten into 2'b11 during BBPD reset overlap. The event
toggles are gated by a consumed marker, so one long BBPD pulse contributes at
most one captured event before the PLLOUT domain acknowledges it.
The Sky130 DCO in sky130/IntegerPLL_DCO_sky130.v is a first structural
standard-cell ring with an 8-bit decoded NAND load bank. It still needs:
-
Coarse-DCO PLL promotion.
IntegerPLL_DCO_EINVP_COARSEis now the current high-frequency macro path, with HD NAND2 fine loads in source. Standalone DCO signoff, 25 MHz-reference TT target-code probes for 100, 250, 300, 400, and 500 MHz, and hard-top/configured-wrapper signoff are current. The path still needs broader PVT range coverage and full extracted-DCO-in-loop lock/acquisition evidence before it can be treated as final PLL signoff. -
Full transistor-level or post-layout closed-loop lock and acquisition validation. Current loop-level evidence includes behavioral DCO targets fitted to no-fill and filled DCO RCX measurements, DLF update evidence from the final digital-core signoff netlist cone with nominal SPEF distributed RC, plus a short mapped-core filled-BBPD loop smoke, a final-signoff functional mapped-loop smoke, a mapped-loop proportional-gain sweep, a four-phase first-correction sweep, hard-top distributed-RC startup diagnostics with behavioral and extracted DCO decks, hard-top distributed-RC extracted-DCO low/high first-motion diagnostics for both the NAND and EINVP hard-top paths, an MPI4-KLU 1 us mapped-loop progress probe, the FRAC=6 force-to-mid 500 ns extracted-DCO progress probe, the FRAC=6 force-to-mid 820 ns registered-control extracted-DCO lock-window probe, serial and MPI4-KLU extracted-DCO startup smokes, FF/SS low/high rail EINVP extracted-DCO PVT lock-window diagnostics, and serial and MPI4-KLU both-rail extracted-DCO first-correction smokes, plus low/high MPI4-KLU extracted-DCO integrator trend probes, MPI16-KLU FRAC=6 trend repeats, a 500 ns MPI16-KLU FRAC=6 rail-start progress check, and MPI16-KLU FRAC=6 force-to-mid, mid-code, and enable-85 high-side lock-window checks, plus force-to-mid final-signoff-netlist 220 ns motion and 820 ns lock-window extracted-DCO checks, but not full extracted PVT signoff or multi-microsecond rail-start lock.
-
Full filled signoff DCO RCX 256-code tuning-curve and PVT transient coverage. Current passing filled evidence is a TT five-point smoke run in Xyce, a consolidated five-point calibration artifact, a TT local-gain artifact around code 128, and FF/FS/SF/SS endpoint smoke.
-
Placement constraints or manual layout to preserve symmetry and loading.
-
Top-level extracted closed-loop transient using the current hard-macro SPICE and SPEF views. The 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. Historical force-to-mid mapped-loop and distributed-RC diagnostics remain useful methodology evidence, including hard-top-loaded extracted-DCO startup, first-motion, lock-window, rail-progress, PVT, and calibrated behavioral-DCO rows, but they are not part of the current physical release gate.
The Sky130 BBPD in sky130/IntegerPLL_BBPD_sky130.v follows the two-flop
set/reset concept from the report and uses buffer delay chains for the reset
race. It now has filled-layout DRC/LVS/RCX evidence and post-layout transient
polarity validation across the standard Sky130 corners, plus TT small-offset
dead-zone characterization and all-corner sampled small-offset sweeps. It still
needs reset-delay optimization and denser metastability characterization around
the measured transition windows before tapeout use.