Research · October 2026

First Silicon

Can frontier models find real hardware bugs without raising false alarms? We collected 86 bugs that engineers found and fixed in open-source chip designs, hid which version each model sees, and let a formal checker decide.

Opus 5.5max effortOpus 5.5defaultFable 5.1Sonnet 5.5Haiku 5.5
Caught, zero false alarmsSTRICT · all 86 bugs18.6%16 / 8614.0%12 / 869.3%8 / 868.1%7 / 863.5%3 / 86
Without defective promptsSTRICT · 80 bugs17.5%14 / 8015.0%12 / 8010.0%8 / 808.8%7 / 803.8%3 / 80
OpenTitanSTRICT · 70 bugs15.7%11 / 7012.9%9 / 705.7%4 / 705.7%4 / 701.4%1 / 70
Other open-source projectsSTRICT · 16 bugs in 10 projects31.3%5 / 1618.8%3 / 1625.0%4 / 1618.8%3 / 1612.5%2 / 16
Caught, false alarms allowed86 bugs32.6%28 / 8625.6%22 / 8615.1%13 / 8610.5%9 / 863.5%3 / 86
Precision of alarmstrue alarms / all alarms34%49 / 14532%34 / 10522%21 / 9432%15 / 4721%6 / 28
False alarm on the fixed designbugs · lower is better31.4%27 / 8625.6%22 / 8624.4%21 / 8612.8%11 / 869.3%8 / 86
Fixed after June 2026STRICT · 3 bugs, after training cutoff0 / 30 / 30 / 30 / 30 / 3
STRICT: the bug is caught and no false alarm is raised on either version. Best result per row in bold, in grey when it is not the highlighted model. Claude models run as read-only Claude Code sub-agents with no tools, one run per prompt.
What it shows

The best configuration, Claude Opus 5.5 at maximum effort, catches 16 of the 86 bugs cleanly, and two of its alarms in three are false. Most bugs escape every model: 67 of the 84 genuine fixes are caught cleanly by none of the four models at default settings.

With 86 bugs, the benchmark separates large models from small ones (Opus 5.5 against Haiku 5.5: 10 bugs against 1, p = 0.012 in an exact McNemar test), but not the strongest from each other (p ≥ 0.23).

Caught, no false alarm Caught, with a false alarm Not caught, false alarm Silent
Every bug, every configuration. Each column is one of the 84 genuine bug fixes, sorted by how many configurations catch it (the 2 intentional behaviour changes are left out); hover or tap a column for details. The last two rows add a formal checker and a triage step.
Method

Real bugs. 70 come from OpenTitan and 16 from 10 other projects. Each fix provably changes behaviour at the outputs, as certified by a formal miter; a trivial template (“outputs are zero after reset”) does not catch it; and none was used to train our own models. Two later turned out to be intentional behaviour changes, which we keep and flag.

A blind task. The model reads a documentation excerpt, the port and signal lists, and one version of the module, buggy or fixed, without being told which. It writes 3 to 8 SystemVerilog assertions describing the intended behaviour. File names are neutral, and the two versions of a bug never share a batch.

An exact judge. Yosys and SymbiYosys run every assertion on both versions, with bounded model checking and then a PDR proof. A failure on the buggy version is a catch only if the same assertion is proven on the fixed one; any failure on the fixed version is a false alarm. Under STRICT, a single false alarm cancels the catch.

The name comes from the first chips back from the fab, where a missed bug costs a new mask set and months of delay.

Vincent van Gogh, Starry Night Over the Rhône, 1888
Vincent van Gogh, Starry Night Over the Rhône, 1888. Musée d’Orsay, Paris.
A formal checker in the loop

We let Opus 5.5 call the judge’s bounded model checker up to five times, on the shown version only. The method was designed on 20 bugs and confirmed once on 61 others.

The checker did not close the gap. When an assertion received a counterexample, the model dropped or changed it 79 % of the time, including 8 assertions that had correctly exposed a bug: it found the bug, the tool confirmed it, and the model decided its own assertion was wrong.

61 held-out bugsSTRICTPrecision
Opus 5.5928 %
Opus 5.5, max effort1232 %
Opus 5.5 with the checker1022 %
Opus 5.5, checker and triage1138 %

The triage keeps a counterexample only when two independent reviewers quote, word for word, the sentence of the documentation it contradicts. It is more precise than random removal and stable across passes, but it did not meet our pre-registered criteria. The open problem is judging a counterexample: is the code wrong, or the assertion?

Bug examples · 5 of 86
mor1kx_branch_predictor_saturation_counter
mor1kx · fixed 2016-09-25 · 1306223101 · Caught cleanly by 5 of the 5 models
lsu_arbiter
cva6 · fixed 2018-09-28 · 403db83049 · Caught cleanly by none of the 5 models
spid_fifo2sram_adapter
opentitan · fixed 2021-10-30 · 182c6c6364 · Caught cleanly by 5 of the 5 models
flash_mp
opentitan · fixed 2022-03-15 · 0f81337f87 · Caught cleanly by 1 of the 5 models
adc_ctrl_fsm
opentitan · fixed 2022-04-11 · 04ddf5db14 · Caught cleanly by none of the 5 models

Squares, left to right: Opus 5.5 max, Opus 5.5, Fable 5.1, Sonnet 5.5, Haiku 5.5, with the checker, with checker and triage.

Limitations

The designs are public, and some answers refer to remembered upstream code, which can only inflate scores; only 3 bugs were fixed after the models’ training cutoff, and none is caught. Six prompts had an enum table that did not match the source; without them, STRICT is 14, 12, 8, 7 and 3 out of 80. Each prompt was run once, the judge works at module level with a restricted assertion subset, and the benchmark has not yet been externally validated.

Data

We publish the outcome of every bug, five bugs in full, and a salted SHA-256 commitment for each bug and prompt; the salt is revealed on audit. The other 81 bugs stay private, so the benchmark stays usable for future models. We can evaluate yours.

Contact

Want your model evaluated on First Silicon, or your own design checked? Write to us below, or at contact@umwelt.vision.