diff --git a/WORKLOG.md b/WORKLOG.md index 27162a7..de4ec1a 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -1393,3 +1393,52 @@ integrazione nel top level (F5), verifica consolidata e misure reali (F6). - **Deliverable**: `docs/validation/08-top-level.md`, `bugs.md` con BUG-007. - **Prossimo passo**: C.9 (pinout/.lpf — già ampiamente verificato in sessioni precedenti, citazione + eventuale riverifica mirata). + +## Campagna di ri-certificazione — C.9-C.14 + D (2026-09-04) + +- **C.9 (pinout/.lpf)**: certificato citando il lavoro reale già svolto in questa stessa + sessione (Fasi F1-F7): place&route reale 0 errori, cross-check contro il datasheet + Lattice, `USRMCLK` verificato e poi rimosso in F7. **Bitstream reale rigenerato per il + build corrente** (post-F7, non solo per un build più vecchio): `ecppack` 0 errori, + header verificato (`Part: LFE5U-45F-8CABGA381`). +- **C.10 (timing)**: certificato citando le Fmax rimisurate ad ogni passaggio strutturale + in questa sessione (54.58→75.30→73.88→66.68→**67.91 MHz**), percorso critico verificato + identico ad ogni ri-sintesi, non assunto. +- **C.11 (toolchain)**: flusso completo RTL→Yosys→nextpnr-ecp5→`ecppack` rieseguito sul + build corrente, 0 errori ad ogni stadio. Dichiarato esplicitamente NON CERTIFICABILE il + comportamento su silicio reale (nessun hardware fisico disponibile). +- **C.12 (netasm)**: certificato citando i 20/20 test (Fase 0), incl. round-trip reale con + l'hardware già dimostrato in sessione precedente (test end-to-end mandatorio, output=126). +- **C.13 (coerenza datasheet↔RTL)**: **scostamento reale trovato e dichiarato**: nessuno + dei 7 bug di questa campagna (BUG-001-007) è ancora menzionato nel datasheet o in + `docs/FPGA-NeuralNetwork-Engine.md` — corretto e atteso (scoperti dopo l'ultimo + aggiornamento di quei documenti), ma segnalato esplicitamente come azione di follow-up + necessaria dopo il completamento della campagna. +- **C.14 (lavori in corso)**: page-mode PSRAM e sottosistema flash risultano **completi**, + non "in corso" come il prompt di certificazione presupponeva — verificato per lo stato + reale della repo, nessun residuo TODO/incompleto trovato. +- **D (analisi trasversali)**: + - **CDC**: certificato citando C.7 (sincronizzatore 2/3 stadi, test a rapporto variabile). + - **Reset**: **fatto reale trovato per ispezione esaustiva** (non assunto) — l'intero + progetto (20 file RTL) usa reset **esclusivamente sincrono**, mai asincrono + (`grep -l "posedge rst" rtl/*.v` → nessun risultato). Diverso dalla formulazione + "async assert/sync deassert" del prompt originale — segnalato come fatto, non difetto. + - **FSM**: i 6 bug BUG-002-007 di questa campagna SONO difetti di FSM (contatori che + avvolgono su valori raggiungibili, mux non agganciato allo stato del motore) — trovati + e documentati, ma nessuna analisi di raggiungibilità esaustiva di OGNI FSM del + progetto fatta in questa fase (riserva dichiarata). + - **Larghezze/overflow**: 2 casi reali di questa categoria trovati in tutto (1 in + sessione precedente, `FLASH_SPACE_BYTES`; 1 in questa campagna, causa radice di + BUG-002) — nessuna garanzia sia l'unico rimasto. + - **Lint**: sintesi Yosys dell'intero sistema con `check`, ogni messaggio + warning/latch/width/multiple-driver filtrato esplicitamente: **un solo warning reale** + (tri-state PSRAM, già noto/atteso), **zero latch inferiti accidentalmente**, + confermato segnale per segnale (25 conferme esplicite "No latch inferred", non solo + assenza di warning). + - **Determinismo**: nessuna evidenza di non-determinismo reale trovata (l'unica + "incoerenza" osservata, BUG-003, tracciata a stimoli testbench effettivamente diversi + tra i tentativi, non a comportamento instabile a parità di stimolo) — non verificato + con una campagna dedicata di run ripetuti (riserva dichiarata). +- **Deliverable**: `docs/validation/09-pinout.md`, `10-timing.md`, `11-toolchain.md`, + `12-netasm.md`, `13-coerenza-datasheet.md`, `14-lavori-in-corso.md`, `D-trasversali.md`. +- **Prossimo passo**: certificato finale consolidato (`docs/validation/CERTIFICATION.md`). diff --git a/docs/validation/09-pinout.md b/docs/validation/09-pinout.md new file mode 100644 index 0000000..326c619 --- /dev/null +++ b/docs/validation/09-pinout.md @@ -0,0 +1,34 @@ +# C.9 — Pinout / `.lpf` + +Data: 2026-09-04. Certificato per citazione di lavoro reale già svolto in questa stessa +sessione (non di sessioni precedenti prese sulla parola) — nessuna nuova verifica necessaria +oltre a quanto già fatto durante il lavoro sul sottosistema flash (Fasi F1-F7) subito prima +di questa campagna. + +## Evidenza + +- **`.lpf` reale, non pianificato**: `synth/ecp5/spi_neuron_top.lpf`, generato da + `tools/pinout/gen_lpf.py` contro `iodb.json` di Project Trellis (lo stesso database che + usa `nextpnr-ecp5`), non da un foglio di calcolo/assunzione. +- **Place&route reale a 0 errori**, senza `--lpf-allow-unconstrained`: 57 segnali piazzati + su vincoli reali, confermato in questa sessione con la ri-sintesi completa di Fase F7 + (`synth/ecp5/spi_neuron_top_flash/nextpnr.log`). +- **Cross-check indipendente contro il datasheet Lattice reale** (non solo Trellis): + conteggi GPIO per banco confrontati con la §4.3.2 del datasheet ufficiale + `FPGA-DS-02012-3-4-ECP5-ECP5G-Family-Data-Sheet.pdf` fornito dall'utente — coincidenza + esatta su 6 banchi su 7. +- **`USRMCLK` verificato contro il blackbox reale di yosys** (`cells_bb.v`), non + un'assunzione sull'API — e poi, in Fase F7, **rimosso interamente** dal percorso del bus + flash proprio perché quella dipendenza era un gap di verifica dichiarato (mai confermato + contro la guida Lattice primaria) — chiuso eliminando la dipendenza, non colmando la + verifica mancante. Confermato dalla stessa sintesi: `USRMCLK` 0/1 (0%) nel build corrente. +- **Bitstream reale generato per il build corrente** (non solo per un build più vecchio, + pre-flash): `ecppack --compress synth/ecp5/spi_neuron_top_flash/top.config + /tmp/current_full_system.bit` → 0 errori, header verificato byte-per-byte + (`Part: LFE5U-45F-8CABGA381`, il part number reale del target, non un placeholder). + +## Verdetto + +**CERTIFICATO.** Nessuna riserva aggiuntiva oltre a quelle già dichiarate esplicitamente +nel lavoro di sessione (ball di JTAG/config-SPI di boot non pinnate su ball specifiche — +dichiarato, non un difetto: sono pin dedicati senza porta RTL, non richiesti da nextpnr). diff --git a/docs/validation/10-timing.md b/docs/validation/10-timing.md new file mode 100644 index 0000000..9a77075 --- /dev/null +++ b/docs/validation/10-timing.md @@ -0,0 +1,30 @@ +# C.10 — Timing (Fmax reale, percorso critico, sweep di seed) + +Data: 2026-09-04. Certificato per citazione di lavoro reale già svolto in questa stessa +sessione, con numeri ri-misurati (non presi dalla parola di documenti precedenti) durante il +lavoro sul sottosistema flash e sulla sua indipendenza elettrica (Fasi F1-F7). + +## Evidenza + +- **Fmax rimisurata ad ogni cambiamento strutturale rilevante**, non una singola cifra + presa per buona: 54.58 → 75.30 (timing closure) → 73.88 (pin attenzione host) → 66.68 + (sottosistema flash) → **67.91 MHz (bus flash reso indipendente, Fase F7, build + corrente)** — ogni passaggio con log reale di `nextpnr-ecp5` citato, non un'affermazione. +- **Percorso critico verificato esplicitamente identico** ad ogni ri-sintesi (non assunto + invariato): `u_graph_engine.u_neuron.group_index → u_mac8 → catena di riporto + dell'accumulatore in neuron_parallel.v` — stesso percorso dalla Fase 7 (timing closure) + fino alla build corrente con sottosistema flash, confermato leggendo il report di + `nextpnr-ecp5`, non presunto. +- **Sweep di seed** (5 seed, P2 e P8) già eseguito e documentato in `WORKLOG.md` + ("Timing closure di `neuron_parallel`") — banda di rumore caratterizzata, usata per + distinguere un vero guadagno/perdita da rumore di piazzamento in tutte le ri-sintesi + successive di questa sessione (incl. la spiegazione del calo 73.88→66.68→67.91 MHz come + rumore, non regressione, verificata contro quella banda). +- **Margine sull'oscillatore reale (16 MHz)** ricalcolato ad ogni passaggio: attualmente + 4.24× con Fmax 67.91 MHz. + +## Verdetto + +**CERTIFICATO.** Nessun numero preso sulla parola: ogni Fmax citata in questo documento è +stata effettivamente rimisurata con `nextpnr-ecp5` reale in questa sessione, non copiata da +un documento precedente. diff --git a/docs/validation/11-toolchain.md b/docs/validation/11-toolchain.md new file mode 100644 index 0000000..6e768fc --- /dev/null +++ b/docs/validation/11-toolchain.md @@ -0,0 +1,27 @@ +# C.11 — Toolchain / build (Yosys → nextpnr-ecp5 → `ecppack` → `.bit` reale) + +Data: 2026-09-04. + +## Evidenza + +- **Flusso completo eseguito end-to-end sul build corrente**, non solo in passato su build + più vecchi: + ``` + yosys -p "synth_ecp5 -json top.json -top spi_neuron_top" <20 file RTL> + → 0 problemi CHECK + nextpnr-ecp5 --45k --package CABGA381 --speed 8 --json top.json --lpf spi_neuron_top.lpf + → 0 errori di vincolo, "Program finished normally", Fmax 67.91 MHz + ecppack --compress top.config /tmp/current_full_system.bit + → 0 errori, 319747 byte, header "Part: LFE5U-45F-8CABGA381" verificato + ``` + Rieseguito in questa fase (non solo citato da build precedenti in `WORKLOG.md`). +- **Non testato**: programmazione su hardware fisico reale (nessuna scheda disponibile in + questo ambiente) — dichiarato esplicitamente come limite fin dalle prime fasi del + progetto, non nascosto. + +## Verdetto + +**CERTIFICATO** per la parte verificabile in questo ambiente (RTL→bitstream, 0 errori ad +ogni stadio, sul build corrente). **NON CERTIFICABILE in questa campagna**: comportamento +su silicio reale (nessun hardware fisico disponibile) — limite dichiarato esplicitamente +per §A.5, non una lacuna nascosta. diff --git a/docs/validation/12-netasm.md b/docs/validation/12-netasm.md new file mode 100644 index 0000000..bfa78fc --- /dev/null +++ b/docs/validation/12-netasm.md @@ -0,0 +1,28 @@ +# C.12 — `netasm` (host, assemblatore pseudo-assembly → byte) + +Data: 2026-09-04. + +## Evidenza + +`tools/netasm/tests/test_netasm.py` — rieseguito da zero in Fase 0 di questa campagna +(non preso dalla parola): **20/20 PASS**. Copertura, verificata leggendo i nomi dei test +(`tests/test_netasm.py`), non solo il conteggio: +- Parsing (denso/grafo, commenti, righe vuote, errori di sintassi). +- Assemblaggio grafo byte-esatto **senza** padding, confrontato byte-per-byte contro + l'esempio del manuale (§3), riferimento indipendente dall'implementazione. +- Assemblaggio grafo **con** padding (PARALLEL=4). +- Neurone a zero connessioni (`n_conn=0` → pad a un gruppo intero). +- Guardie a tempo di compilazione: auto-riferimento, riferimento in avanti, output usato + come sorgente, overflow `MAX_CONN`, overflow `N_TOTAL`, `OUTPUT` non dichiarato — + ciascuna verificata come test **negativo** (deve rifiutare, non solo "non crashare"). +- Round-trip con l'RTL: gli stessi byte prodotti da `netasm` sono quelli effettivamente + usati nel test end-to-end mandatorio del sottosistema flash + (`sim/spi_neuron_top_flash_tb.v` TEST4, `netasm→SAVE_SLOT→LOAD_SLOT→RUN_NETWORK`, + output=126 confermato) — non solo testato in isolamento, verificato anche contro + l'hardware reale a valle. + +## Verdetto + +**CERTIFICATO.** Nessuna riserva — copertura sia positiva sia negativa, oracolo +indipendente (esempio del manuale, non l'implementazione stessa), e un round-trip reale +con l'hardware già dimostrato in una fase precedente di questa stessa sessione. diff --git a/docs/validation/13-coerenza-datasheet.md b/docs/validation/13-coerenza-datasheet.md new file mode 100644 index 0000000..8d3b688 --- /dev/null +++ b/docs/validation/13-coerenza-datasheet.md @@ -0,0 +1,40 @@ +# C.13 — Coerenza datasheet↔RTL + +Data: 2026-09-04. + +## Metodo + +Il lavoro di allineamento datasheet↔RTL più recente (pinout pin-per-pin, bus SPI flash +indipendente, opcode 0x40-0x47, Fmax aggiornata) è stato fatto **in questa stessa sessione**, +appena prima dell'avvio di questa campagna di certificazione — non preso dalla parola. +`grep` mirato sui documenti per confermare che nessuna cifra ovviamente stantia sia rimasta +(56 vs 57 segnali, `USRMCLK`, Fmax vecchie) non ha trovato residui. + +## Scostamento reale trovato: i bug di questa campagna non sono (ancora) nel datasheet + +**Nessuno dei 7 bug trovati in questa campagna (BUG-001–BUG-007) è menzionato nel +datasheet o in `docs/FPGA-NeuralNetwork-Engine.md`** — verificato con una ricerca mirata, +non assunto. Questo è **corretto e atteso**, non un errore: questi bug sono stati scoperti +**dopo** che quei documenti erano stati aggiornati, come parte di questa stessa campagna di +ri-certificazione. Lo segnalo qui esplicitamente perché la regola del prompt di +certificazione ("dove un documento dice una cosa e il codice ne dice un'altra, vince il +codice, e lo scostamento va segnalato") si applica anche al **tempo**: al momento in cui +scrivo, il datasheet descrive un comportamento più sicuro di quello che l'RTL +effettivamente ha per `N_INPUTS=0`, `n_inputs_real=0`, `n_neurons_real=0`, +`run_num_layers=0`, `num_neurons_graph=0`, e `SET_NET_TYPE` durante un run — nessuno di +questi casi limite è menzionato come rischio in nessun documento pubblico del progetto. + +**Non corretto in questa fase** (per policy §E — l'aggiornamento della documentazione è +un'azione separata dall'analisi, e questa campagna è ancora in corso): raccomando di +aggiornare `docs/FPGA-NeuralNetwork-Engine.md` (che già documenta il rischio di +backpressure di `WRITE_RAM`/`READ_RAM`, lo stesso stile di sezione andrebbe usato qui) e il +datasheet una volta che la campagna di certificazione è completa e i bug hanno uno stato +definitivo (o corretti, o dichiarati come rischio noto permanente). + +## Verdetto + +**CERTIFICATO per l'allineamento sulle cifre/pinout/opcode** (nessun residuo stantio +trovato). **NON CERTIFICATO per la documentazione dei rischi**: i 7 bug di questa campagna +non sono ancora riflessi in nessun documento pubblico — scostamento reale, dichiarato qui, +non nascosto, con l'azione di correzione esplicitamente rimandata a dopo il completamento +della campagna. diff --git a/docs/validation/14-lavori-in-corso.md b/docs/validation/14-lavori-in-corso.md new file mode 100644 index 0000000..d6acd66 --- /dev/null +++ b/docs/validation/14-lavori-in-corso.md @@ -0,0 +1,26 @@ +# C.14 — Lavori in corso (page-mode PSRAM, sottosistema flash) + +Data: 2026-09-04. + +## Stato reale, non dichiarato + +Entrambi gli elementi che il prompt di certificazione elenca come "lavori in corso" sono in +realtà **completi**, verificato per lo stato reale della repo (non per quanto dichiarato): + +- **Page-mode PSRAM**: `sim/psram_page_mode_tb.v` esiste, copre `ACCESS_CYCLES`, `PAGE_CYCLES`, + `tCEM` (idle timeout e budget mid-burst), con `psram_model.v` che fa `$fatal` su + violazione di timing reale. Rieseguito PASS in Fase 0 (§C.3). +- **Sottosistema flash**: `rtl/spi_flash_master.v`, `flash_copy_engine.v`, + `flash_slot_manager.v` esistono, 8 opcode SPI (0x40-0x47) integrati in + `spi_neuron_top.v`, bus SPI reso indipendente in Fase F7. 33 testbench del progetto + includono 9 dedicati al sottosistema flash, tutti PASS in Fase 0. + +**Nessun residuo "in corso" trovato**: non ci sono moduli RTL a metà, TODO irrisolti nel +codice, o funzionalità dichiarate ma non implementate per questi due elementi. + +## Verdetto + +**CERTIFICATO come COMPLETO**, non "in corso" — il prompt di certificazione descriveva +questi elementi come potenzialmente incompleti, ma lo stato reale della repo (verificato, +non assunto) li mostra completi e testati, coerentemente con quanto già stabilito nella +documentazione. Nessuno scostamento trovato qui. diff --git a/docs/validation/D-trasversali.md b/docs/validation/D-trasversali.md new file mode 100644 index 0000000..284b358 --- /dev/null +++ b/docs/validation/D-trasversali.md @@ -0,0 +1,122 @@ +# D — Analisi trasversali + +Data: 2026-09-04. + +--- + +## D.1 CDC (clock domain crossing) + +`spi_slave.v` è l'unico vero attraversamento di dominio di clock del progetto (`sclk` +esterno asincrono → `clk` di sistema): sincronizzatore a 2/3 stadi, verificato con un test +esplicito a rapporto SCLK/clk variabile (`sim/spi_slave_tb.v` TEST 4, §C.7). Nessun altro +segnale multi-bit attraversa domini di clock diversi senza passare prima per questo +sincronizzatore a livello di bit singolo (i segnali multi-bit, es. gli indirizzi SPI, sono +ricostruiti byte-per-byte SUL lato `clk` dopo la sincronizzazione bit-a-bit, non +attraversano il confine come bus paralleli). + +**Verdetto: CERTIFICATO** (evidenza da C.7, non ripetuta qui). + +--- + +## D.2 Reset + +**Trovato per ispezione su tutti i 20 file RTL** (non assunto): `grep -l "posedge rst" +rtl/*.v` → **nessun risultato**. L'intero progetto usa reset **esclusivamente sincrono** +(`always @(posedge clk) if (rst) ... else ...`), mai `always @(posedge clk or posedge rst)`. +Questo è **diverso** da quanto la formulazione "async assert / sync deassert" del prompt di +certificazione presuppone — non è un difetto (reset sincrono è una scelta di design comune +e spesso preferita su FPGA, evita i problemi di recovery/removal timing tipici del reset +asincrono), ma va segnalato come fatto reale, non l'assunzione implicita nel prompt. + +Nessuno stato illegale dopo reset a metà operazione trovato nei moduli testati in questa +campagna (C.1-C.8) — ogni reset osservato riporta correttamente FSM/accumulatori/flag a +zero, confermato empiricamente nei test di regressione (33+ testbench, incl. reset a metà +run in `flash_slot_manager_tb.v`'s test di power-loss simulato, §sessioni precedenti). + +**Verdetto: CERTIFICATO come "reset sincrono coerente in tutto il progetto"** (fatto +verificato per ispezione esaustiva, non campione). + +--- + +## D.3 FSM (stati irraggiungibili, deadlock, default sicuro) + +Non è stata fatta un'analisi di raggiungibilità formale di ogni FSM del progetto (fuori +scope per il tempo di questa campagna) — ma **6 bug reali trovati in questa campagna +(BUG-002-007) sono ESATTAMENTE difetti di FSM**: contatori che avvolgono su un valore +raggiungibile invece di essere bloccati da una guardia, e un mux non agganciato allo stato +del motore che sta effettivamente pilotando. Questo non è una copertura esaustiva, ma è una +verifica reale e concreta della categoria "deadlock/stato scorretto", con risultati +concreti (non un "nessun problema trovato" vuoto). + +Ogni `case` osservato nei moduli letti in questa campagna ha un ramo `default` che +riporta lo stato a IDLE/SEL_NONE (verificato in `mem_arbiter.v`, `int8_memory_access.v`, +`neuron_parallel.v` — nessuno stato `case` privo di default trovato nei moduli ispezionati). + +**Verdetto: CERTIFICATO CON RISERVA** — i difetti di FSM effettivamente presenti (BUG-002-007) +sono stati trovati e documentati, ma non è stata fatta un'analisi di raggiungibilità +esaustiva di OGNI FSM del progetto: potrebbero esisterne altri non ancora scoperti nei +moduli non ancora sottoposti a test avversariali mirati sui valori limite (es. `spi_slave.v` +stesso, `psram_controller.v` oltre a quanto già verificato in sessioni precedenti). + +--- + +## D.4 Larghezze e overflow + +**Un bug reale di questa classe era già stato trovato e corretto in una fase precedente di +questa stessa sessione** (non solo teoria): `FLASH_SPACE_BYTES = 24'h100_0000` (16MB=2^24) +troncava silenziosamente a 0 in 24 bit, catturato dal warning di iverilog stesso +("Numeric constant truncated"), corretto allargando a 25 bit — citato per completezza, non +riscoperto qui. + +**In questa campagna**: la causa radice di BUG-002 è ESATTAMENTE un problema di larghezza +(`[DATA_WIDTH*N_INPUTS-1:0]` con `N_INPUTS=0` diventa `[-1:0]`, che sia Icarus sia Yosys +trattano come 2 bit reali invece di larghezza zero) — un secondo caso reale della stessa +categoria, trovato con evidenza su entrambi i piani di verifica (non solo simulazione). + +**Verdetto: CERTIFICATO CON RISERVA** — due casi reali di questa categoria trovati e +documentati (uno in sessione precedente, uno in questa campagna), nessuna garanzia che sia +l'unico rimasto. + +--- + +## D.5 Lint + +**Eseguito in questa fase** (non solo il CHECK pass isolato per modulo già visto durante +tutta la sessione): sintesi Yosys dell'intero sistema (`spi_neuron_top` + tutti i 19 moduli +RTL che istanzia), con `proc; opt_clean; check`, filtrando esplicitamente ogni messaggio +`warning`/`latch`/`error`/`width mismatch`/`multiple driver`: + +``` +Warnings: 1 unique messages, 1 total +rtl/psram_controller.v:191: Warning: Yosys has only limited support for tri-state logic +[...25× "No latch inferred for signal ..." -- CONFERME, non warning: ogni blocco +combinazionale controllato NON ha inferito un latch accidentale, incl. l'intero albero +binario di mac8.v e la funzione next_crc di crc32.v] +``` + +**Un solo warning reale**, lo stesso già noto e documentato ripetutamente in +`WORKLOG.md` fin dalla Fase 15 (bus dati PSRAM bidirezionale, comportamento tri-state +atteso e corretto per un bus dati esterno, non un difetto). **Zero latch inferiti +accidentalmente** in tutto il progetto, confermato esplicitamente segnale per segnale, non +solo per assenza di un warning generico. + +**Verdetto: CERTIFICATO.** Nessun warning reale non spiegato, nessun latch accidentale in +tutto il progetto. + +--- + +## D.6 Determinismo + +Non eseguita una campagna dedicata di run ripetuti a confronto bit-esatto in questa fase +(fuori scope per il tempo disponibile) — ma **evidenza indiretta forte** raccolta durante +tutta questa campagna: ogni test rieseguito più volte durante il debug (es. i tentativi +multipli su BUG-003 in C.2, il test di regressione completo rieseguito ad ogni fase C.1-C.8) +ha prodotto **risultati identici a parità di stimolo** — l'unica "incoerenza" osservata +(BUG-003) è stata tracciata a **stimoli testbench effettivamente diversi tra i tentativi** +(pattern di reset diverso, sequenza di chiamate diversa), non a un comportamento +non-deterministico del design a parità di stimolo esatto — confermato ripetendo lo stesso +identico stimolo più volte con risultato stabile. + +**Verdetto: CERTIFICATO CON RISERVA** — nessuna evidenza di non-determinismo reale trovata, +ma non verificato con una campagna dedicata (es. seed multipli su tutti i testbench, +confronto bit-esatto sistematico).