19 / 24 · Concetto
Mantieni la contabilità delle transazioni durante svuotamento e reset
Separa l'annullamento dalla consegna e allinea lo stato valid alle code attese.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
L'annullamento è un evento esplicito del progetto
Il reset riporta il controllo a uno stato noto; lo svuotamento annulla il lavoro in sospeso specificato. Azzerare soltanto i dati non basta. Se valid rimane alto, zero può diventare una falsa transazione. I vecchi bit dei dati con valid a zero sono innocui. Azzera lo stato che indica il possesso del lavoro: full in un buffer con una posizione, count e puntatori in una FIFO, oppure stato FSM e valid del risultato.
Il nostro contratto sincrono con un solo clock esclude accettazione e consegna su un fronte di reset a entrambi gli estremi e vi annulla tutto il lavoro in sospeso. Resettare soltanto un estremo mentre l'altro conta il vecchio valid come consegna viola questo accordo. Documenta l'ambito del reset e la politica di disponibilità. I nuovi ingressi dopo il reset appartengono a un nuovo intervallo di transazioni.
| Evento | accepted | delivered | canceled | outstanding |
|---|---|---|---|---|
| Accettare A,B,C | 3 | 0 | 0 | 3 |
| Consegnare A | 3 | 1 | 0 | 2 |
| Annullare B,C | 3 | 1 | 2 | 0 |
| Accettare D | 4 | 1 | 2 | 1 |
| Consegnare D | 4 | 2 | 2 | 0 |
Con l'annullamento, usa accepted-delivered-canceled=outstanding. Annulla ogni transazione non consegnata esattamente una volta. Anche la coda di riferimento deve rimuovere il lavoro annullato, verificando che nessun risultato obsoleto entri nel nuovo intervallo.
Una richiesta di memoria esterna può sopravvivere a uno svuotamento interno. Distingui le risposte tardive tramite un identificatore di generazione, oppure attendi che le vecchie richieste terminino prima di ripartire. Riutilizzare troppo presto un piccolo campo di generazione può confondere una vecchia risposta con una corrente. Il nostro progetto finale non ha risposte esterne ritardate e annulla soltanto i buffer interni.
Uno svuotamento selettivo può conservare il lavoro precedente a un salto rimuovendo le operazioni successive sul percorso errato. Ciò richiede regole definite di ordinamento e commit. Il lavoro non valido non deve aggiornare la memoria o partecipare all'inoltro. Prova il reset a vuoto, in stallo, a pieno e durante potenziali trasferimenti simultanei. Il solo reset iniziale non esercita l'annullamento del lavoro in sospeso.
Prova tu
Accetta cinque transazioni, consegnane due, poi annulla le tre rimanenti. Quindi accettane due e consegnane una. Trova i totali cumulativi di accepted, delivered, canceled e outstanding.
Leggi la spiegazione
Accepted=7, delivered=3, canceled=3, outstanding=1. La contabilità è 7-3-3=1. Gli elementi annullati non sono consegne riuscite.