Patrick's Blog — pre-silicon-v2

How fast can a chip go before it starts getting the wrong answer?

A one-tile silicon experiment that predicts its own failure point — and will tell us whether the prediction was right.

Every digital chip has a speed limit. Push the clock a little faster, drop the supply a little lower, or let the die get hot, and eventually a signal arrives too late to be stored correctly. The chip does not crash or complain; it quietly returns a wrong number.

Engineers normally find that limit with software. A timing report estimates how long every path takes and declares how fast the design may safely run. But a report is a model of the chip, not the chip itself. This project builds a tiny piece of silicon whose only job is to expose the gap between the two.

The question: how accurately can pre-build timing analysis and two cheap on-chip speed sensors predict the exact clock speed at which an arithmetic circuit starts producing wrong answers?

The short version

What we built One 1 × 1 Tiny Tapeout tile in the open IHP SG13G2 process (die 202 × 155 µm): a deliberately slow 16-bit adder, an independent reference adder, two ring-oscillator speed sensors, and counters that record failures.
How it runs Submitted at a conservative 10 MHz. The experiment deliberately overclocks to 10–50 MHz to find the breaking point.
Strongest result so far Timing analysis predicts first failures at 31.0 MHz for the longest configured path at room conditions. A delay-annotated gate-level simulation passes at 29.4 MHz and fails at 31.2 MHz — the same place, from a completely different method.
Status Design verified, hardened, and signoff-clean; the chip is not back from the fab yet. The silicon half of the experiment is still open, and the prediction protocol is frozen in advance.

If you want the engineering detail, the appendices hold every number generated so far.

Definitions of technical jargon are in Appendix A.


1. Define "too slow"

A digital chip is a very large collection of switches. When a switch flips, the change does not appear instantly at its output — it takes a little time to travel through the wire and the next gate. Individually that is picoseconds, but along a long path it adds up.

On each clock tick, registers take a snapshot of their input and hold it until the next tick. A timing failure happens when a snapshot is taken before the correct value has arrived: the register keeps the old value, and everything downstream of it is wrong. The fail is silent.

Three things make paths slower: a faster clock (less time per tick), a lower supply voltage, and a higher temperature. A chip that is perfectly correct at 10 MHz, 1.20 V, and 25 °C can fail at 50 MHz, or at 1.08 V, or when it is hot. Before a chip is built, software called static timing analysis (STA) estimates whether every path arrives in time, reporting slack — time to spare when positive, time missing when negative. This is how the industry decides how fast a design may run. But it is a model, and models disagree with reality in interesting ways. That disagreement is what this project plans to measure.

2. The experiment in one picture

Two predictions already exist, from completely different methods: static timing analysis, and a simulation of the manufactured gate netlist with per-cell delays annotated. They agree closely. What the real chip does is currently unknown.

A frequency ruler: STA predicts 31.0 MHz, the timed simulation passes at 29.4 and fails at 31.2 MHz, and silicon is unknown
Two independent pre-silicon predictions at nominal conditions, longest configured path, carry-heavy workload. The blue bar spans the tested simulation points: pass at 29.4 MHz, fail at 31.2 MHz. The shaded band is the planned 10–50 MHz sweep. Sources: STA dataset, simulation dataset.

The rest of this post explains how each prediction is made, what the design already proves, and what only silicon can settle.

3. Inside the chip: a suspect, a judge, and two stopwatches

V2 chip architecture and complete pin map: dedicated UI inputs, bidirectional UIO configuration/status pins, dedicated UO outputs, clock/reset/enable, DUT and oracle, one-shot capture, and two RO canaries
The design and complete host pin map, drawn from the top-level RTL. UIO appears in both pin panels because the same eight pins receive configuration and later output status bytes. Colors match the placement map below. Solid arrows carry data or counts; dashed arrows are selected control paths. Open the full-size SVG.

The suspect. The device under test is a 16-bit ripple-carry adder — the simplest way to add in hardware: bit 0 produces a carry and hands it to bit 1, which hands its carry to bit 2, and so on. The carry rippling end to end is the slowest thing in the design. To control how slow, the adder is split into four 4-bit segments, and each segment boundary has a delay bank that can insert 0, 16, 32, or 48 inverter pairs. One inverter flips the value; a pair leaves it unchanged but costs time. Four settings × four segments gives a programmable path length.

That delay must physically survive synthesis, which would otherwise delete redundant inverters. The design uses preserved cell wrappers, and the built netlist is inspected afterwards: 384 DUT-bank inverters and two oscillator loops are present in the final layout (structure audit).

The judge. A separate, deliberately fast reference adder computes the same sum with no delay banks. It always settles long before it is used, so any disagreement means the slow adder's answer was captured too late — not that the arithmetic is wrong.

The shutter. The trick that makes failures observable is when the answer is photographed. New operands launch on a rising edge; the DUT's 17-bit answer is captured exactly once on the immediately following falling edge, then held. If it was still settling at that instant, the wrong value is frozen in place and a later, correct result cannot overwrite it. At the next frame boundary — 19 clock cycles after launch — the frozen sample is compared with the reference and an error counter is bumped.

How we lowered the required test frequency. The earlier design gave the adder a full clock cycle to finish. Its longest path was predicted to fail near 61.5 MHz at 25 °C, above our planned 50 MHz ceiling. Taking the snapshot on the falling edge gives it only half a cycle at 50% duty, so it can miss the deadline at a lower clock speed. With the same delay banks, the new predicted boundary is about 31 MHz at 25 °C. This makes room-temperature testing plausible without requiring a 125 °C test; the actual silicon boundary still needs measuring (original audit, half-cycle validation). Normal operation remains 10 MHz, giving the adder 50 ns to finish; the 10–50 MHz sweep deliberately searches for failures.

Clock timing: launch on the rising edge, one-shot capture on the falling edge, comparison 19 cycles later
One measurement, in two views. Top: the clock's HIGH time is the aperture — how long the adder has to finish. Bottom: one frame is 19 clock cycles; operands launch at cycle 0, the sample is taken half a cycle later, and the comparison happens at cycle 18.

Four workloads. A pattern generator feeds the adder four operand streams: pseudorandom (PRBS), a repeating carry-heavy sequence, an alternating carry-free pattern, and a static hold. They push the same hardware along different paths. "Carry-heavy" is a stimulus label, not a claim — the timing analysis separately has to show the sequence really sensitizes the predicted path, and it does for the carry-heavy and PRBS patterns.

Two stopwatches. The tile also carries two ring oscillators — loops of an odd number of inverters that oscillate on their own at a frequency set by gate speed. They are the chip's built-in speedometers: one a generic inverter line, the other structure-matched, passing through delay banks and carry stages to resemble the adder's timing composition (canary RTL). Each drives a 16-bit counter.

4. Turning a timing report into a predicted speed

The experiment analysis fixes the configuration bits, then searches for paths that start at runtime-changing state (the operand registers) and end at the one-shot capture register. For a clock period T, HIGH-time fraction d, and extracted setup slack S, the required aperture is d × T − S. Setting the aperture to exactly what is required gives the predicted failure speed:

required HIGH time = d × T − S
predicted boundary frequency (MHz) = 1000 × d / required HIGH time (ns)

At nominal conditions with d = 0.5 and T = 20 ns, the carry-heavy path needs 16.13 ns of HIGH time, predicting first failures at 31.0 MHz. This is an estimate from extracted timing analysis — most trustworthy near the analyzed operating point, and reported with that caveat.

The important detail is which path is analyzed. The globally slowest path in the chip starts at static configuration bits that never change at runtime, so it answers a different question; the experiment analysis restricts itself to paths a real workload can actually excite.

STA predicted boundary versus configured delay, and timed simulation error rates versus clock period
Left: more deliberate delay brings the predicted failure speed down into the planned sweep. Each point is one of the four ladder settings (0/16/32/48 inverter pairs per segment), carry-heavy workload. Right: the delay-annotated simulation fails near the predicted period at all three corners; dotted lines mark the timing-analysis predictions. Sources: STA CSV, simulation CSV, replotted by plot_v2_blog.py.

5. What the pre-silicon work already shows

The delay settings work as designed. At nominal conditions, stepping the four banks together from 0000 through 1111, 2222, and 3333 lowers the predicted carry-heavy boundary from 84.5 to 53.5, 39.2, and 31.0 MHz — so the longest setting puts the predicted transition inside the planned sweep. A configuration that stays error-free up to 50 MHz is recorded as "beyond the measured range", never assigned a boundary of 50 MHz.

A timed workload really does fail. Running the routed netlist with cell delays annotated, at the longest delay setting and with the carry-heavy workload, gives a clean fail/pass transition at every corner:

Library corner STA boundary Last failing tested period First passing tested period STA minus bracket midpoint
Fast · 1.32 V · −40 °C 45.13 MHz (22.16 ns) 20 ns 22 ns +1.16 ns (+5.5%)
Typical · 1.20 V · 25 °C 31.00 MHz (32.26 ns) 32 ns 34 ns −0.74 ns (−2.2%)
Slow · 1.08 V · 125 °C 19.90 MHz (50.24 ns) 46 ns 48 ns +3.24 ns (+6.9%)

199 completed comparisons per point. The timing analysis lands within 3.3 ns of the simulated transition at every corner — agreement between two independent models, not yet evidence about silicon.

The right clock property is being measured. If the chip reacted to frequency alone, changing the duty cycle would move the failure point. It does not. At a fixed 14 ns of HIGH time — reached with three different period/duty combinations — the simulation produces exactly 49 errors in 199 comparisons every time; at 18 ns, none. Timing analysis independently asks for 16.13 ns. The capture aperture, not the raw frequency, is the variable that matters.

Errors versus clock HIGH time, with all duty-cycle cases landing on the same boundary
Errors per 199 comparisons as a function of the clock's HIGH time. Circles are the 50%-duty period sweep; hollow squares repeat the same HIGH time at 40%, 50%, and 60% duty. All six duty-cycle cases fall on the same boundary, close to the 16.13 ns the timing analysis requires. Source: aperture check.

Workload matters, and the model says so. The same hardware, at the same delay setting, has very different predicted limits depending on what it is asked to do:

Workload Nominal predicted boundary What it exercises
Carry-heavy 31.0 MHz Worst-case carry propagation through every delay bank
PRBS 31.4 MHz Pseudorandom operands; nearly the same path
Carry-free alternating 306.7 MHz Carries blocked; the delay banks are bypassed
Static hold not defined No runtime-changing operands, so no path to predict

The carry-free and static cases are honest "not measurable here" results: one lies above the board's 50 MHz ceiling, the other does not exist at all.

The speed sensors are modeled, and now transient-checked. Extracted analysis of the two oscillator loops predicts, at the longest sensor setting, 381.7 / 260.4 / 165.6 MHz for the generic canary and 150.6 / 103.3 / 66.1 MHz for the matched one (fast / typical / slow). The matched canary is consistently about 2.5× slower — what a longer loop should look like. Those are broken-loop timing estimates. A transistor-level transient simulation of the same post-route extracted netlist, for all 24 corner/setting/canary combinations, gives a mean SPICE/STA frequency ratio of 1.119 — 1.151 for the generic canary, 1.087 for the matched one, range 1.04–1.22, with no outliers. SPICE is faster than the static estimate in every case, which is the expected direction because the transient netlist carries no wire RC. Details and data: extracted RO transient validation.

Modeled canary frequencies and predicted edge counts per window
Left: modeled oscillation frequency versus sensor delay setting. Right: predicted edge counts per counter window, with the 16-bit counter limit marked. Longer windows overflow: at the fastest corner both canaries exceed 16 bits at 16,384 cycles (crosses), and the generic canary does so at the typical corner too. Counts assume a 50 MHz reference clock; the physical build runs at 100 ns normal operation, so host analysis must rescale them. Source: RO dataset; transient cross-check: SPICE comparison.

What these results are not. The timed simulation annotates cell delays only and omits wire interconnect delays and flip-flop timing checks, so it cannot predict metastability or absolute silicon error probabilities. Agreement with STA is a cross-check between two models, not a silicon accuracy result. The transient RO check uses a cell-level extracted netlist with no interconnect RC, so it is a third model view, not silicon. The oscillators are modeled, not measured. And the library "corners" are model conditions — heating one die does not turn it into the slow corner.

6. Is the chip physically real?

Yes — as a verified, signoff-clean design, not yet as returned silicon.

How we lowered area usage. We simplified the supporting logic while keeping all 384 DUT delay-bank inverters and both oscillator loops:

  • Removed a duplicate 16-bit configuration register, reused the startup counter for pin-direction control, and trimmed the measurement-window counter from 16 bits to the 14 it needs.
  • Replaced the step-by-step reference checker and its stored intermediate results with a direct adder. The operands already stay stable until comparison, so this extra storage was unnecessary.
  • Changed the oscillator counters to ripple counters: each bit triggers the next, removing the wide incrementing logic while retaining 16-bit counts.

Together, these changes reduced storage cells from 195 to 152 and active cell area by about 12.5%. We could then lower the placement-density target from 82% to 72%. Final core utilization fell from 82.86% to 72.53% in the same tile. The saving comes from smaller circuitry; changing the density setting alone does not remove gates (development comparison, current build metrics).

The build passes 13 RTL tests, 9 functional gate-level tests with 4 intentional skips, and 10 Tiny Tapeout prechecks, covering configuration, error injection, canary masking, capture retention, freeze/resume, and counter behavior (local build manifest). It uses 72.53% of the core, with 152 sequential cells and 2,809 placed instances (1,637 standard cells plus filler), and reports zero routing DRC, Magic DRC, LVS, and antenna violations.

Corner Worst setup slack at 100 ns Worst hold slack
Fast · 1.32 V · −40 °C +38.82 ns +0.13 ns
Typical · 1.20 V · 25 °C +33.71 ns +0.22 ns
Slow · 1.08 V · 125 °C +24.60 ns +0.38 ns

Normal submitted operation at 10 MHz closes timing comfortably at every corner — while the experiment deliberately overclocks past those limits. Sources: summary report, metrics.

Routed GDS and a color-coded placement map
Left: the rendered layout from GitHub Actions run 34158224984. Right: final placed cells, colored by architecture component. Cyan is the adder and its delay banks; purple and magenta are the two canaries; orange is the 17 one-shot capture flops. The map colors individual cells rather than exclusive regions, because placement interleaves the components. Full-size SVG · cell-by-cell mapping · provenance.

7. What the silicon still has to answer

The measurement protocol was frozen before any silicon data exists (v2 protocol, prediction model). It measures the real boundary at a nominal anchor — room conditions, longest delay, carry-heavy workload — and gives each predictor exactly one multiplicative calibration factor from that single anchor, held fixed everywhere else. Today that factor is 1.0, a placeholder, not a fitted result. If the anchor turns out to be unreachable below 50 MHz, calibration is reported unavailable rather than quietly replaced.

The deliverables are prediction error, missed failures, false warnings, guardband cost, and workload dependence, reported both uncalibrated and calibrated, with negative and censored results kept. Transient validation of the oscillators is now done (extracted RO transient validation); still open: board clock delivery and operating limits, shuttle acceptance, and the measured correlation between the on-chip speed sensors and the arithmetic failure boundary.

The next useful result is a silicon dataset that can challenge the numbers recorded here. When it exists, this page will have to change.


Appendix A — Plain-language glossary

Term Meaning
ApertureThe time a signal has to finish before it is sampled. Here it equals the clock's HIGH time.
CalibrationA correction factor derived from one known reference measurement, applied unchanged elsewhere.
Canary / ring oscillatorA closed loop of gates that oscillates at a frequency proportional to gate speed; used as an on-chip speedometer.
CensoredA result outside the measurable range (here, above 50 MHz). Reported as "not observed", never as a value.
Corner (PVT)A named combination of process speed, voltage, and temperature that a model is evaluated at. Not three temperatures of one die.
DieThe single piece of silicon carrying the circuit.
DRC / LVSAutomated checks that the physical layout obeys manufacturing rules and matches the intended circuit.
DUTDevice under test — here, the deliberately slow 16-bit adder.
ExtractionDeriving real wire resistances and capacitances from the finished layout so timing can be re-analyzed more accurately.
Full adderThe one-bit building block that adds two bits plus a carry-in and produces a sum and a carry-out.
GDSThe file format sent to the factory describing the physical layout.
GuardbandA safety margin subtracted from a predicted limit before operating at it.
Hardening / signoffTurning the design into a full physical layout and then proving it meets timing, area, and manufacturing rules.
MetastabilityA brief, unpredictable state a register can enter if its input changes exactly when it samples.
NetlistThe list of gates and their connections produced by synthesis.
OracleAn independent, fast reference circuit used to decide whether the DUT's answer is correct.
PRBSPseudorandom bit sequence — a deterministic but unpredictable-looking operand stream.
Register / flip-flopA storage element that captures and holds a value on a clock edge.
SDFA file of per-cell delays used to make a gate-level simulation behave like a manufactured chip.
SensitizeTo make a path actually carry a changing signal, so that its delay can affect the result.
ShuttleA scheduled shared manufacturing run that several designs are placed on together.
SlackTime to spare (positive) or time missing (negative) on a timing path.
STAStatic timing analysis — software that sums delays along paths and checks them against the clock.
SynthesisTurning hardware description code into a gate-level netlist.
Tiny TapeoutA shared multi-project shuttle that puts many small designs on one manufactured chip.

Appendix B — Every STA prediction (96 cases)

Three library corners × eight delay configurations × four workloads. Values are the predicted first-failure frequency in MHz; "no runtime path" means the workload never changes operands, so no boundary is defined.

Heatmap of all 96 predicted first-failure frequencies
All 96 case-analyzed predictions at a glance. Source: experiment_sta.csv, figure generated by plot_v2_blog.py.
Corner Delay Carry-heavy PRBS Carry-free Static hold
Fast0000126.90130.89438.60no runtime path
Fast111178.8680.52438.60no runtime path
Fast222257.3458.21438.60no runtime path
Fast333345.1345.66438.60no runtime path
Fast300087.2689.29438.60no runtime path
Fast000387.4189.44438.60no runtime path
Fast213066.4067.57438.60no runtime path
Fast120366.4967.66438.60no runtime path
Typical000084.4687.72306.75no runtime path
Typical111153.4854.77306.75no runtime path
Typical222239.1939.87306.75no runtime path
Typical333331.0031.43306.75no runtime path
Typical300058.9660.53306.75no runtime path
Typical000359.1060.68306.75no runtime path
Typical213045.2146.12306.75no runtime path
Typical120345.2946.21306.75no runtime path
Slow000054.0556.05204.92no runtime path
Slow111134.2235.04204.92no runtime path
Slow222225.1425.57204.92no runtime path
Slow333319.9020.17204.92no runtime path
Slow300037.7638.76204.92no runtime path
Slow000337.8838.88204.92no runtime path
Slow213028.9929.55204.92no runtime path
Slow120329.0429.60204.92no runtime path

B.1 How one number is produced

The longest configured path (3333), carry-heavy workload, showing the extracted arrival time at the capture register and the arithmetic that converts slack into a boundary:

Corner Arrival (ns) Setup slack at 20 ns Required HIGH time (ns) Capture register Sensitizing vector Predicted boundary
Fast · 1.32 V · −40 °C 10.98 −1.08 11.08 result_reg[16] a=0xFFFF,b=0x0001,cin=0 45.13 MHz
Typical · 1.20 V · 25 °C 16.08 −6.13 16.13 result_reg[16] a=0xFFFF,b=0x0001,cin=0 31.00 MHz
Slow · 1.08 V · 125 °C 25.17 −15.12 25.12 result_reg[16] a=0xFFFF,b=0x0001,cin=0 19.90 MHz

The full table also records, per case: startpoint, endpoint, path delay, arrival, required time, slack, the case-analyzed configuration word, the worst unrelated register-to-register path, and the tool/PDK identity — see the CSV and JSON.

B.2 The ladder, in detail

Corner Setting Workload Arrival (ns) Slack (ns) Boundary (MHz)
Fast0000carry-heavy3.85+6.06126.90
Fast0000PRBS3.72+6.18130.89
Fast1111carry-heavy6.24+3.6678.86
Fast1111PRBS6.12+3.7980.52
Fast2222carry-heavy8.62+1.2857.34
Fast2222PRBS8.50+1.4158.21
Fast3333carry-heavy10.98−1.0845.13
Fast3333PRBS10.86−0.9545.66
Typical0000carry-heavy5.87+4.0884.46
Typical0000PRBS5.65+4.3087.72
Typical1111carry-heavy9.31+0.6553.48
Typical1111PRBS9.09+0.8754.77
Typical2222carry-heavy12.71−2.7639.19
Typical2222PRBS12.49−2.5439.87
Typical3333carry-heavy16.08−6.1331.00
Typical3333PRBS15.86−5.9131.43
Slow0000carry-heavy9.30+0.7554.05
Slow0000PRBS8.97+1.0856.05
Slow1111carry-heavy14.66−4.6134.22
Slow1111PRBS14.32−4.2735.04
Slow2222carry-heavy19.94−9.8925.14
Slow2222PRBS19.60−9.5525.57
Slow3333carry-heavy25.17−15.1219.90
Slow3333PRBS24.84−14.7920.17

Appendix C — Every timed-simulation run (23)

Cell-delay-annotated gate-level simulation of the routed netlist. Interconnect delays and flip-flop timing checks are not annotated. "Compared" is the number of completed comparisons; launches include the initial pipeline fill, so compared = max(launches − 1, 0).

Corner Period (ns) Duty HIGH time (ns) Clock (MHz) Config Workload Launches Compared Errors Error rate
zero-delay reference200.510.050.00x4DFFcarry-heavy20019900.0%
Fast180.59.055.60x4DFFcarry-heavy2001994924.6%
Fast200.510.050.00x4DFFcarry-heavy2001994924.6%
Fast220.511.045.50x4DFFcarry-heavy20019900.0%
Fast240.512.041.70x4DFFcarry-heavy20019900.0%
Fast260.513.038.50x4DFFcarry-heavy20019900.0%
Typical200.510.050.00x4DFFcarry-heavy2001994924.6%
Typical260.513.038.50x4DFFcarry-heavy2001994924.6%
Typical280.514.035.70x4DFFcarry-heavy2001994924.6%
Typical300.515.033.30x4DFFcarry-heavy2001994924.6%
Typical320.516.031.20x4DFFcarry-heavy2001994924.6%
Typical340.517.029.40x4DFFcarry-heavy20019900.0%
Typical360.518.027.80x4DFFcarry-heavy20019900.0%
Typical400.520.025.00x4DFFcarry-heavy20019900.0%
Slow360.518.027.80x4DFFcarry-heavy2001994924.6%
Slow400.520.025.00x4DFFcarry-heavy2001994924.6%
Slow420.521.023.80x4DFFcarry-heavy2001994924.6%
Slow440.522.022.70x4DFFcarry-heavy2001994924.6%
Slow460.523.021.70x4DFFcarry-heavy2001994924.6%
Slow480.524.020.80x4DFFcarry-heavy20019900.0%
Slow500.525.020.00x4DFFcarry-heavy20019900.0%
Slow540.527.018.50x4DFFcarry-heavy20019900.0%
Slow600.530.016.70x4DFFcarry-heavy20019900.0%

Duty-cycle check (nominal corner). At 40%, 50%, and 60% duty, periods of 35.0, 28.0, and 23.33 ns all give 14 ns of HIGH time and 49 errors; periods of 45.0, 36.0, and 30.0 ns all give 18 ns of HIGH time and 0 errors. Controls: PRBS at a 40 ns period, carry-free alternating at 20 ns, and static hold at 20 ns all report 0 errors in 199 comparisons. Static hold has no runtime-sensitizable path, so the prediction table leaves its boundary undefined rather than inventing a value. Both the error counter and the launch counter saturate at 65,535, so longer measurements must be split into bounded batches. Source: sdfsim.csv, aperture-check.json.

Appendix D — Every ring-oscillator prediction (24 rows)

Modeled loop delay, oscillation frequency, and predicted edge counts per counter window (256 / 1,024 / 4,096 / 16,384 clock cycles) at a 50 MHz reference clock. Counts marked ✗ exceed 65,536 and would wrap in the 16-bit hardware counters.

Corner Canary Selection Loop delay (ns) Modeled f (MHz) win0 win1 win2 win3 win3 fits?
Fastgeneric00.491020.45,22420,89783,591 ✗334,367 ✗no
Fastmatched00.82609.83,12112,48749,951199,804 ✗no
Fastgeneric10.76657.93,36813,47353,894215,578 ✗no
Fastmatched11.66301.21,5426,16824,67498,698 ✗no
Fastgeneric21.05476.22,4389,75239,009156,038 ✗no
Fastmatched22.50200.01,0244,09616,38465,536 ✗no
Fastgeneric31.31381.71,9547,81631,267125,068 ✗no
Fastmatched33.32150.67713,08412,33749,349yes
Typicalgeneric00.72694.43,55514,22256,888227,555 ✗no
Typicalmatched01.25400.02,0488,19232,768131,072 ✗no
Typicalgeneric11.12446.42,2859,14236,571146,285 ✗no
Typicalmatched12.45204.11,0444,17916,71866,873 ✗no
Typicalgeneric21.54324.71,6626,64926,597106,389 ✗no
Typicalmatched23.67136.26972,79011,16044,643yes
Typicalgeneric31.92260.41,3335,33321,33385,333 ✗no
Typicalmatched34.84103.35282,1158,46233,851yes
Slowgeneric01.14438.62,2458,98235,929143,719 ✗no
Slowmatched01.97253.81,2995,19720,79183,167 ✗no
Slowgeneric11.76284.11,4545,81823,27293,090 ✗no
Slowmatched13.86129.56632,65210,61142,445yes
Slowgeneric22.43205.81,0534,21316,85567,423 ✗no
Slowmatched25.7587.04451,7807,12328,493yes
Slowgeneric33.02165.68473,39013,56254,251yes
Slowmatched37.5766.13381,3525,41021,643yes

Only the 256-cycle window (win0) fits in 16 bits for both canaries at every corner, which is why the frozen protocol predeclares selection 3 with window 0. Two caveats for host analysis: the status byte's "dead" flags only report a zero count after a window — they are not calibrated warnings that the DUT is about to fail — and the canary counters, unlike the error and launch counters, have no overflow flag, so a wrapped count is silently wrong. An earlier attempt to read canary counts out of the signoff simulation was discarded as invalid: oscillator timing arcs are disabled in the constraints, so those cells carry hard zero delays and the counts are simulator artifacts (diagnosis). Source: ro_predict.csv.

Appendix E — Prediction model and calibration

Model tpv-predict-2.0.0, frozen before any silicon data. Two canary predictors scale the nominal STA ladder by the ratio of the modeled oscillator count at the target corner to the count at nominal conditions, at the same reference clock, selection, and window. Nominal RO-based predictions therefore equal nominal STA by construction — their agreement is not evidence that one canary is more accurate than the other.

Predicted first-failure frequency (MHz), carry-heavy workload

Delay Fast STA Fast generic Fast matched Typical STA Typical generic Typical matched Slow STA Slow generic Slow matched
0000126.90123.80123.3084.4684.4684.4654.0553.6754.07
111178.8678.3978.0953.4853.4853.4834.2233.9834.23
222257.3457.4457.2239.1939.1939.1925.1424.9025.08
333345.1345.4445.2631.0031.0031.0019.9019.7019.84
300087.2686.4386.1058.9658.9658.9637.7637.4637.74
000387.4186.6486.3059.1059.1059.1037.8837.5537.83
213066.4066.2766.0145.2145.2145.2128.9928.7328.94
120366.4966.3966.1345.2945.2945.2929.0428.7828.99

Predicted first-failure frequency (MHz), PRBS workload

Delay Fast STA Fast generic Fast matched Typical STA Typical generic Typical matched Slow STA Slow generic Slow matched
0000130.90128.60128.1087.7287.7287.7256.0555.7456.15
111180.5280.2879.9754.7754.7654.7735.0434.8035.06
222258.2158.4558.2239.8739.8739.8725.5725.3425.52
333345.6646.0745.8931.4331.4331.4320.1719.9720.12
300089.2988.7388.3960.5360.5360.5338.7638.4638.75
000389.4488.9588.6160.6860.6860.6838.8838.5638.84
213067.5767.6167.3546.1246.1246.1229.5529.3129.53
120367.6667.7467.4846.2146.2146.2129.6029.3629.58

Predeclared canary readout, selection 3, window 0 (256 cycles)

Corner Generic (edges) Matched (edges) Generic / matched
Fast · 1.32 V · −40 °C1,9547712.534
Typical · 1.20 V · 25 °C1,3335282.525
Slow · 1.08 V · 125 °C8473382.506

Calibration. Each predictor gets one factor k = F_measured / P_predicted from the nominal anchor (1.20 V, 25 °C, delay 3333, carry-heavy). Every pre-silicon row currently carries k = 1.0 as an explicit placeholder. If the anchor is censored above 50 MHz, calibration is reported unavailable. Host analysis must also rescale counts by the measured clock frequency (the model assumes 50 MHz), account for the fact that the window counter starts before the oscillators are enabled (about 253 of 256 nominal cycles), and reject wrapped or ambiguous counts. The full 288-row predictor table is in predictions.csv; the generated summary is predict/summary.md.

Appendix F — Verification, signoff, and build provenance

Test results (local build local-dev-safe10)

Suite Passed Skipped Failed
RTL regression (cocotb)1300
Functional gate-level (zero delay)940
Tiny Tapeout precheck1000

The functional gate-level suite removes oscillator loops and runs with zero delay; it checks synthesized logic and the external protocol, not timing. Structural checks confirm 384 DUT-bank inverters, two oscillator loops, and 17 one-shot capture flops survive into the built netlist.

Physical metrics

Metric Value
Core utilization72.53%
Active standard-cell area20,990.8 µm²
Placed instances2,809 (1,637 standard cells + 1,172 filler)
Sequential cells152
Routing DRC / Magic DRC / LVS / antenna violations0 / 0 / 0 / 0
Estimated total power0.221 mW
Die size202.08 × 154.98 µm

Build identity. All quantitative experiment results on this page come from the local development package local-dev-safe10, build commit 7b20196bb74195649679fae6313a891712e87458, analyzed on a dirty worktree with the listed source files verified against the build commit. Tools: LibreLane 3.0.5, IHP PDK revision c4b8b4e5e7a05f375cca3815d51b3a37721fbf5c, support-tools revision 01d5d2814fa9dd61e9d211e0b235a4a592a9316a. The placement figure and the archived CI manifest come from a separate build: GitHub Actions run 34158224984 on commit b9f03f798978840c8bdc2bb574877408e0f33f4c, whose GDS, precheck, gate-level, and viewer jobs all succeeded (manifest). The two identities are not mixed. Earlier "v1" full-cycle datasets exist in the repository's history but are not used anywhere on this page.

Appendix G — Reproducing the figures and data

Every data figure in this post is regenerated from the archived CSVs by one script:

# from the repository root, inside the devcontainer
source /ttsetup/venv/bin/activate
python tools/plot_v2_blog.py

The script runs no HDL, no timing analysis, and no simulation; it only replots archived data and writes docs/figures/v2/provenance.json with the input hashes, tool versions, and the schematic/simulated status of each figure. The architecture diagram is hand-drawn from the RTL, and the placement map comes from tools/plot_v2_placement.py with its own provenance. Raw data lives in data/safe10/: experiment_sta.csv and .json (96 STA cases), sdfsim.csv and .json (23 simulation runs), ro_predict.csv and .json (24 oscillator rows), predict/ (model outputs), and verification/ (tests, structure, metrics, aperture check, build manifest).