NELIX Silicon Lab Docs Launch Silicon Lab Launch Silicon Lab

Reference checks and release gate

The known-bad designs the lab rebuilds to prove its tools still catch faults, what each must show per process, and the automated tests behind the roles, grading, learning-mode and isolation promises.

EngineerDeveloper 11 min read · Updated 2026-10-30

On this page The reference setLatest run (30 October 2026)What was measured (29 October 2026, all four processes)Rerun on 30 October 2026: do the results agree?Antenna reference (30 October 2026)Planted-rule DRC regression (30 October 2026)The same build twice on IHP and ASAP7 (30 October 2026)The release gateAutomated tests kept with the gateLimits

A toolchain that never fails anything proves nothing. Before a release, the lab therefore rebuilds a small set of reference designs with a known fault each and checks that the tools say what they must. The same set, built clean, is the positive control. The results are kept with job ids and tool versions, so a claim like "DRC catches spacing violations on SKY130" always points at a stored build.

The reference set#

ReferenceWhat is wrong on purposeWhat the toolchain must say
ref-cleannothing: an 8-bit counterlint clean; tests pass; build PASSED with DRC, LVS and antenna PASS; setup met
ref-timing-faila 24 x 24 multiply-accumulate with a 2.5 ns clocksetup slack negative
ref-drc-spacinga hand-made 10 x 10 um block with two metal-1 shapes 0.10 um apart (the rule wants 0.14 um)DRC reports errors; the build does not pass
ref-lvs-shorta block whose abstract view has two pins but whose layout joins them with one wireLVS reports a mismatch; the build does not pass
ref-lint-faila latch, a 4-bit value in an 8-bit register, a signal driven from two clock edgeslint flags LATCH, WIDTH, MULTIDRIVEN
ref-sim-failthe counter with a test that demands the wrong valuethe simulation fails
ref-antenna-faila block whose input pin is a small transistor gate (0.05 µm²) behind a 22 µm² metal-1 comb, fed straight from a chip input, with the flow's antenna repair turned off in this reference onlythe antenna check reports the net; the build does not pass

The blocks are written by vvrefs/make_macros.py as plain GDSII and LEF (no library), included in the build as a macro (MACROS in openlane/config.json) and instantiated once in the RTL. The two layout references set ERROR_ON_MAGIC_DRC, ERROR_ON_KLAYOUT_DRC and ERROR_ON_LVS_ERROR to false so the flow runs through sign-off and the lab's own pass rule (the counts in the report) is what has to catch the fault, which is the stricter test. The LVS reference also sets MAGIC_EXT_USE_GDS so the extraction reads the real layout; the flow's default reads the abstract view and would not see a short inside a block.

The antenna reference turns off, in its own openlane/config.json only, every antenna repair the flows have: GRT_REPAIR_ANTENNAS, RUN_HEURISTIC_DIODE_INSERTION, DIODE_ON_PORTS (none), the input buffer (DESIGN_REPAIR_BUFFER_INPUT_PORTS), and on IHP also LibreLane's repair during detailed routing (DRT_ANTENNA_REPAIR_ITERS 0). Every other project keeps the lab's usual repair. Why it is off: with repair on, the flows fix this fault, which is what they should do. Measured: the same design with the usual settings, SKY130 BLD-20261030-0047, had 2 nets over the limit at the first antenna check and 0 after diode insertion (PASSED); on IHP the first antenna-fail build, BLD-20261030-0040, still had LibreLane's routing repair on, which inserted 1 diode, so it PASSED and the gate said FAIL (not caught) until that repair was switched off too.

In the lab the references are ordinary projects of the lab's test account, named vvref-<name>-<process>. Their reports open like any other build report.

Latest run (30 October 2026)#

Record 20261030-155141 with seven references per process, adding antenna-fail (OpenLane's antenna repair is switched off in that reference only, so the planted violation stays): 25 PASS, 3 not applicable, 0 FAIL. The 29 and 30 October results are identical on ASAP7, GF180MCU and IHP SG13G2; on SKY130 the verdicts are identical and the numbers moved only because the builds started using each project's own clock file. A planted-rule DRC regression adds 6 to 8 different rules per deck (SKY130 8, GF180MCU 7, IHP SG13G2 7 Magic / 6 KLayout), every one caught. The gate reruns every Sunday.

What was measured (29 October 2026, all four processes)#

ReferenceSKY130GF180MCUIHP SG13G2ASAP7 (learning)
ref-cleanBLD-20261029-0008: PASSED, setup slack +9.62 nsBLD-20261029-0015: PASSED, +8.96 nsBLD-20261029-0019: PASSED, +13.68 nsBLD-20261029-0024: PASSED (route DRC only), +0.69 ns
ref-timing-failBLD-20261029-0005: setup slack -5.72 nsBLD-20261029-0016: -10.28 nsBLD-20261029-0020: -4.09 nsBLD-20261029-0025: -0.46 ns, shown as "Built, timing not met"
ref-drc-spacingBLD-20261029-0006: DRC FAIL, Magic 2, KLayout 1BLD-20261029-0017: DRC FAIL, Magic 1 (KLayout DRC is not part of the GF180MCU build)BLD-20261029-0021: DRC FAIL, Magic 4, KLayout 1does not apply (no sign-off DRC)
ref-lvs-shortBLD-20261029-0007: LVS FAIL, 46 mismatchesBLD-20261029-0018: LVS FAIL, 41BLD-20261029-0022: LVS FAIL, 8does not apply (no LVS)
ref-lint-failflagged as expected (Verilator 5.044, offline): LATCH, WIDTHEXPAND, MULTIDRIVENas expectedas expectedas expected
ref-sim-fail1 test, 1 failed ("count is 10, expected 11")as expectedas expectedas expected

On SKY130 and GF180MCU, OpenLane 2.3.10 stops a build with "Setup violations found", so the lab's report shows "Tool exited with code 2" and no slack; the slack above is read from the run folder.

The gate records are kept in /var/lib/nelix-complete/vv-gate/. All four are PASS:

ProcessGate recordHow
SKY13020261029-061233The stored builds of the references were re-read; nothing was rebuilt in this run
GF180MCU20261029-160454Rebuilt (--build)
IHP SG13G220261029-161555Rebuilt (--build)
ASAP720261029-164852The first run, 20261029-163953, said FAIL: its clean reference still expected DRC, LVS and antenna results, and the learning flow produces none. The expectation was corrected to "route DRC 0", and the same builds were judged again

The automated tests below passed on 29 October 2026 (record tests-20261029-061347: 66 cases, 0 failed).

Rerun on 30 October 2026: do the results agree?#

Every reference was rebuilt through the lab on every process a second time, on 30 October 2026 (record 20261030-124238), and compared with the 29 October records (sudo nelix-vv-gate --compare; final comparison of all four processes kept as compare-20261030-155239). A third SKY130 rebuild the same day (record 20261030-143008, BLD-20261030-0033 to -0037) agrees with the first 30 October one in every verdict and number (compare-20261030-155243, 0 differences): with the same inputs the builds repeat exactly.

Process30 OctAgreement with 29 Oct
GF180MCU6/6 as expectedidentical: every verdict and every key number (slack +8.955 ns and -10.278 ns, Magic DRC 1, LVS 41)
IHP SG13G26/6 as expectedidentical: every verdict and key number (slack +13.676 ns and -4.092 ns, DRC counts, LVS-short 8 errors). The first LVS-short rebuild (BLD-20261030-0025) stopped on a full disk; it was rebuilt as BLD-20261030-0029 after the disk was grown (record 20261030-141041)
SKY1306/6 as expectedevery verdict agrees; the numbers moved because the input moved: the 29 Oct builds ran before the lab started passing the project's own constraints/clock.sdc to the flow (same 15 ns clock, different input and output constraints). Clean slack +9.621 -> +12.484 ns, timing reference -5.716 -> -5.018 ns, LVS-short 46 -> 12 mismatches (still caught)
ASAP72 builds + lint and simulation as expectedidentical: clean slack +0.688 ns, timing reference -0.457 ns (BLD-20261030-0030, -0032, record 20261030-142053; the first attempts stopped on a full disk)

GF180MCU with KLayout. OpenLane does not run KLayout DRC on GF180MCU, so the gate now runs the GF180 kit's own KLayout deck on the final layout of the spacing reference and of the clean reference (record 20261030-135629): the spacing reference shows exactly the planted rule, M1.2a (metal-1 spacing), 1 marker; the clean reference shows 0 markers in 649 rules. The result is kept per layout fingerprint (sha256) and reused for the same layout.

The layer numbers and spacing rules of the hand-made layout blocks are each kit's own: GF180 Metal1 34/0, 0.23 µm; IHP Metal1 8/0, 0.18 µm. ASAP7 has no sign-off DRC or LVS in the lab, because it is learning only, so the DRC and LVS references do not apply there. What these results mean for the size of design the lab has shown clean is on Qualification envelope.

Antenna reference (30 October 2026)#

ProcessGate recordBuildResult
SKY13020261030-145218BLD-20261030-0038caught: antenna FAIL, 1 net (ant_in, pin u_blk/A, metal 1); DRC and LVS PASS
GF180MCU20261030-145405BLD-20261030-0039caught: 1 net; DRC and LVS PASS
IHP SG13G220261030-151730BLD-20261030-0048caught: 1 net (the first run, 20261030-145553, was not caught: see above)
ASAP7does not applythe learning flow runs no antenna check

The same references through sudo nelix-ci run exit with code 60 (antenna) on all three: CI-20261030-152952-fe7382 (SKY130, BLD-20261030-0054), CI-20261030-153156-d910ec (GF180, BLD-20261030-0055), CI-20261030-153350-715a05 (IHP, BLD-20261030-0056). Code 60 means "antenna violations left after the flow's repair"; in this reference the repair is off on purpose.

Planted-rule DRC regression (30 October 2026)#

sudo nelix-vv-gate --drc-rules --pdk sky130A,gf180mcuD,ihp-sg13g2 checks that each process's two DRC rule decks still catch several different, named rules on a real layout. It takes the final layout of the latest passed clean reference, writes a copy with small planted faults beside the chip (a line too narrow, two shapes too close, a shape too small, on metal 1, 2 and 3, and SKY130's local interconnect), and runs the kit's own Magic and KLayout decks, with the options the chip build uses, on the copy and on the untouched layout. A planted fault counts as caught only when the deck reports that rule's own name inside the fault's spot. The untouched layout must show none of the planted rules (the control). It builds nothing; it checks the decks, not the design.

Process (layout)MagicKLayoutUntouched layout
SKY130 (BLD-20261030-0049)8 of 8 caught: met1.1, met1.2, met1.6, met2.1, met2.2, met3.1, met3.2, li.18 of 8: m1.1, m1.2, m1.6, m2.1, m2.2, m3.1, m3.2, li.1 (sky130A_mr.drc)0 markers in both decks
GF180MCU (BLD-20261030-0005)7 of 7: M1.1, M1.2a, M1.3, M2.1, M2.2a, M3.1, M3.2a7 of 7, the same rule names (GlobalFoundries' run_drc.py, variant D)0 in both
IHP SG13G2 (BLD-20261030-0052)7 of 7: M1.a, M1.b, M1.d, M2.a, M2.b, M3.a, M3.b6 of 6: M1.a, M1.b, M2.a, M2.b, M3.a, M3.b (ihp-sg13g2.drc; it has no metal-1 area rule)0 in both
ASAP7does not apply (no sign-off DRC)

Record drcrules-20261030-154446, PASS; the planted layouts and both decks' reports are kept under vv-gate/drc-rules/<layout sha256>/. The first live run (15:26 UTC) said FAIL: the untouched layout is stored readable by the lab only, so the check container could not open it, and Magic then checked an empty cell. The check now copies the layout first and counts Magic as not run unless it reports the chip's own outline.

The same build twice on IHP and ASAP7 (30 October 2026)#

The clean reference was built twice in a row on each process through the lab (input fingerprint taken before each build, as on SKY130 and GF180):

ProcessBuildsInput fingerprint (both)Measured numbersLayout
IHP SG13G2BLD-20261030-0045, BLD-20261030-00523db923d4b12e…41 of 41 identical (setup and hold slack per corner, area, cell count, DRC, LVS, antenna, power, wire length); the 3 timing models (.lib) identicalidentical once the write date is zeroed
ASAP7BLD-20261030-0046, BLD-20261030-0053802c94b5bc6c…13 of 13 identical (setup +0.688 ns, hold, area, cells, power, routing DRC)identical once the write date is zeroed

Both were also rebuilt from their downloaded bundle alone (sh reproduce/rebuild.sh). An earlier pair (IHP BLD-20261030-0017 against -0045, ASAP7 -0030 against -0046) had identical numbers but different fingerprints: the lab's own build software had been updated in between (one more file), and the fingerprint said so.

The release gate#

sudo nelix-vv-gate runs the fast part (lint and simulation of every reference, offline, one at a time, at the lowest priority) and compares the latest stored chip build of each reference with its expectation. --build rebuilds the references through the lab first (one at a time; it waits while anyone else has work queued, 5 to 20 minutes each). --tests also runs the automated tests below. Every run is kept under /var/lib/nelix-complete/vv-gate/ with the tool versions and image fingerprints it ran with and every job id. Site administrators see the runs at /app/admin/vv-gate.

--compare OLD.json NEW.json lines up two runs reference by reference (verdict, build state, setup slack, DRC, LVS and antenna counts, lint codes, simulation counts, GF180 KLayout markers) and keeps the comparison. A weekly rerun (Sunday 03:30 UTC, every reference on every process, compared with the previous full run) is on since 30 October 2026 (owner approved): sudo nelix-vv-gate --schedule on|off|status. Its first run is Sunday 1 November 2026, 03:30 UTC.

The rule is strict: a reference counts as as expected only on measured evidence (a kept report, a job log, a run folder); without evidence it is not run, never a pass.

Automated tests kept with the gate#

TestProvesHow
Isolation probea job cannot reach the network, other people's files, the server's files, or more processes and memory than its limitone ordinary Simulate job whose test tries each of these; all six must be refused, two controls must work
Roles and seatsa student cannot read teacher data, a teacher sees their own class only, a full class refuses the next student, the university admin sees everythingthe platform's enrolment code on a fresh in-memory database, positive and negative each
Grading golden scoresa correct submission scores 100, a wrong one its expected partial score, the same input twice the same score; hidden test names never reach the studentthe real auto-grader on fixture submissions (never a student's) in a temporary teaching database
Learning-mode matrixthe AI boundary holds in Design Chat, in the AI engineer's repair path and in the terminal, for a class student with an open assignment, without, and for an individualthe decision functions the lab uses, with fixtures; no AI is called

Limits#

  • The gate proves the tools catch these faults. It is not a full regression of every rule in a design-rule deck.
  • Build results depend on the images and kits in use; the gate records their fingerprints so a change is visible.
  • Each process was gated on 29 and 30 October 2026 and every reference agrees between the two days (SKY130's numbers moved only because its input constraints changed, see above).
  • A build that cannot run (for example a full disk) counts as a failure with its reason, never as caught.
  • On GF180MCU the DRC reference is caught by Magic in the build and by the kit's KLayout deck in the gate (the build itself runs no KLayout DRC).
  • The planted-rule regression covers 6 to 8 width, spacing and area rules per deck, not every rule (vias, enclosures, density and the front-end layers are not planted).

Ask Nelix Agent under a gate run opens Design Chat with that run's verdict and every reference that is not as expected (or not run) in the question: what it means for a release and what to check first. The gate's verdicts come from the kept evidence only; the Agent never changes them.

Related

  • Qualification envelopePer process, the largest design the lab has built clean (with its build id), the tool versions and limits, the class of each rule deck, and the claims the lab does not make.

Something unclear or missing? Send feedbackSign in and use Feedback to tell us.