Files
chip_ignite/docs/LVS_WAIVER.md
cah 73b9da2aef
Some checks failed
CI / rtl-lint (push) Has been cancelled
docs(waiver): add fresh May 13 GLS PASS on HEAD's PDN-fix wrapper
cf verify ldpc_basic --sim gl re-ran on snoke against commit 8cc8414
(the PDN-fix wrapper, current HEAD). PASSED at 854225 ns with GPIO[7:0]
= 0xAB, 0 critical / 0 errors / 0 warnings, 34169 cycles, 2h 19m
wall-clock. Confirms the May 7 PDN net-assignment swap did not break
gate-level functionality.

Also captures .cf/project.json updates from cf push:
- user_project_wrapper_hash = f7b3548e... (platform GDS hash)
- version 1 -> 2

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 01:56:31 -06:00

78 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LVS Pin-Match Waiver — `user_project_wrapper`
**Status**: 208 LVS pin-match errors on `user_project_wrapper` are accepted as cosmetic.
**Submission**: ChipFoundry shuttle CI2605, May 2026.
## Summary
When `cf harden user_project_wrapper` runs LVS via Magic SPICE-extraction + netgen comparison, it reports 208 "no matching pin" errors and the final status `Top level cell failed pin matching`. **These errors are extraction-layer artifacts, not electrical defects.** Netgen itself reports — on the same run, in the same `netgen-lvs.log``Cell pin lists for user_project_wrapper and user_project_wrapper altered to match` and `Device classes user_project_wrapper and user_project_wrapper are equivalent`. The two netlists are functionally identical; only port labels are missing on the layout-side extraction.
## Root cause
The wrapper has 206 outputs tied to constants:
- `la_data_out[127:0]``128'b0`
- `io_out[37:0]``38'b0`
- `io_oeb[37:0]``38'b1` (all inputs)
- `user_irq[2:1]``2'b0`
Magic's SPICE extraction follows each constant-driven net back to the global power/ground rails. All 128 `la_data_out` bits resolve to the same extracted GND net; all 38 `io_oeb` bits to the same VDD net. Magic places one port label on the merged net (or none), so 205+ of the original output ports lose their labels in the extracted SPICE. Netgen then sees the verilog netlist declaring 206 individual ports and the extracted netlist with only a handful — hence the pin-match mismatch.
The same root cause produces the additional report of `vssd2 in netlist only` (PDN power-net naming asymmetry between netlist and layout — fixed in the May 7 PDN swap, commit `8cc8414`) and `io_oeb[9] in layout only` / `user_irq[2] in layout only` (Magic arbitrarily keeps one label per merged net).
## Why this is not a real defect
1. **Netgen confirms electrical equivalence.** From the LVS report's own final summary:
> `Cell pin lists for user_project_wrapper and user_project_wrapper altered to match.`
> `Device classes user_project_wrapper and user_project_wrapper are equivalent.`
The mismatched pins all belong to nets that, after Magic's extraction, are the same global power/ground nets in both netlists. The connectivity is correct.
2. **Magic DRC: 0 violations.** GDS layout is manufacturable.
3. **Gate-level simulation passes.** All 5 cocotb tests on the Caravel-integrated gate-level netlist (`cf verify <test> --sim gl`) return `GPIO[7:0] = 0xAB` (the firmware's success code):
- `ldpc_basic`, `ldpc_noisy`, `ldpc_max_iter`, `ldpc_back_to_back`, `ldpc_demo` — all PASS (originally verified May 1, 2026 on `cf_wrapper_v5`)
- **Re-verified May 13, 2026 on HEAD (`8cc8414`, the PDN-fix wrapper)**: `ldpc_basic` PASSED at `854225.00ns`, GPIO[7:0]=`0xAB`, 0 criticals / 0 errors / 0 warnings, 34169 cycles consumed (of 37586 recommended timeout), 2h 19min wall-clock. The PDN swap between `cf_wrapper_v5` and HEAD only changes which physical rails connect to `mprj` (`vccd1/vssd1` instead of `vccd2/vssd2`); both rails sit at 1.8 V in simulation, so the other 4 tests' May 1 results apply unchanged to HEAD.
4. **`mpw_precheck`: 17 of 19 checks PASS** (`cf precheck` on `cf_wrapper_v5`, May 1, 2026). The two failures are:
- **KLayout FEOL**: a `SIGSEGV` (signal 11) crash inside the KLayout DRC tool, not a real DRC violation.
- **LVS**: the cosmetic pin-match issue described in this waiver.
All structural, consistency, GPIO, XOR, Magic DRC, KLayout BEOL/Offgrid/Metal-Density/Pin-Labels/ZeroArea, Spike, OEB, License, Documentation, and Makefile checks pass.
## Why per-pin tieoff cells do not help (verified by experiment, May 8 2026)
On May 711, 2026, seven follow-up `cf harden user_project_wrapper` runs (`cf_wrapper_v6` through `v11`) attempted to eliminate the 208 errors. The most thorough — v8 — replaced the bulk `assign la_data_out = 128'b0; …` tieoffs with **206 individually-instantiated `sky130_fd_sc_hd__conb_1` cells**, each with its own logical output net driving a single wrapper output pin, hand-placed via `MANUAL_GLOBAL_PLACEMENTS` next to its target pin:
```verilog
sky130_fd_sc_hd__conb_1 tie_la_data_out_0 (.LO(la_data_out[0]));
sky130_fd_sc_hd__conb_1 tie_la_data_out_1 (.LO(la_data_out[1]));
sky130_fd_sc_hd__conb_1 tie_io_oeb_37 (.HI(io_oeb[37]));
```
**Result: the same 208 LVS errors.** Magic's extraction propagates each `conb_1` output back through its `.LO` / `.HI` port to the global VGND/VPWR rail at the extracted-SPICE level, collapsing all 206 distinct logical nets into the same two power nets. Adding per-pin standard cells changes the synthesized netlist but does not change Magic's extraction behavior.
The v9 and v10 attempts (more placement tweaks and looser routing-DRC tolerance) regressed the layout to 1780 and 1362 routing DRC errors respectively. v11 was interrupted. None succeeded.
The full archive of these experiments is preserved at `experiments/2026-05-12-archive-v6-v11/` with a per-file README explaining what was tried and why it failed. The lessons are also documented in the project repository's `docs/hardening-results.md` ("Wrapper Hardening Attempts (May 7-11, 2026)").
## Comparable precedent
The Caravel reference design `user_proj_example` uses the same bulk constant-tieoff idiom (`assign la_data_out = 128'b0; assign io_out = …; assign io_oeb = …; assign user_irq[2:1] = 2'b0;`) and exhibits the same LVS pin-match pattern when hardened with `SYNTH_ELABORATE_ONLY=true`. This is a known limitation of the Magic + netgen flow on wrappers with bulk-tied unused outputs, not a defect specific to this design.
## What would fix it (deferred — too risky for this submission)
The only methodologically clean fix is to drive the 206 wrapper-output bits from inside the macro `ldpc_decoder_top` as dummy zero outputs, so each wrapper output connects to a distinct extracted macro pin. This requires a full macro re-harden. Yosys synthesis of this macro is non-deterministic (documented in `docs/hardening-results.md`), and the current macro netlist (`balanced_popcount` synthesis, Run 6) is the only run proven to meet TT-corner timing at 50 MHz with clean DRC. Re-hardening the macro to add dummy outputs risks losing that timing closure. The trade-off — 46 hours of re-harden + regression risk vs. a cosmetic LVS issue with no electrical consequence — is not worth taking under the contest's tapeout deadline.
## Conclusion
The 208 LVS pin-match errors are extraction-layer bookkeeping, not electrical defects. The device classes are equivalent, gate-level simulation passes, the GDS is DRC-clean, and 17 of 19 precheck checks pass. The design is electrically correct and manufacturable.
We respectfully request the LVS pin-match failure be accepted as a waived cosmetic issue.
---
**References**
- `docs/hardening-results.md` — full hardening history, including v6v11 attempts and root-cause analysis
- `experiments/2026-05-12-archive-v6-v11/README.md` — archived v6v11 experiment files and per-file analysis
- `signoff/user_project_wrapper/openlane-signoff/netgen-lvs.log` — netgen's own "Device classes equivalent" / "Cell pin lists altered to match" lines
- `signoff/user_project_wrapper/openlane-signoff/lvs.rpt` — full LVS report
- Commit `8cc8414` (May 7, 2026) — PDN net-assignment fix that resolved the prior `vssd1/vssd2` symmetry issue
- Commit `74ad20a` (May 1, 2026, `cf_wrapper_v5`) — golden wrapper hardening