7 / 24 · Concetto
Contratti temporali per richieste e risposte di memoria
Distingui letture sincrone, tag ritardati e collisioni sullo stesso indirizzo.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Una memoria è più di un grande array di registri
Un'interfaccia di memoria richiede un contratto temporale oltre alla capacità. Una lettura asincrona modifica l'uscita combinatoria quando cambia l'indirizzo. Una lettura sincrona campiona un indirizzo a un fronte e modifica l'uscita successivamente. Questi modelli richiedono pianificazioni diverse. Anche l'inferenza di una risorsa di memoria del dispositivo dipende dallo stile di codifica e dallo strumento di destinazione. Qui specifichiamo sedici elementi a otto bit con lettura sincrona.
Campiona indirizzo e tag al fronte k. I dati corrispondenti e il tag ritardato appaiono dopo quel fronte; la prima opportunità di consumarli è il fronte k+1. Una lettura di un ciclo non significa risposta combinatoria immediata. Il segnale valid della risposta deve seguire lo stesso ritardo. Associare un valore ritardato al tag corrente di ingresso compromette le richieste successive.
logic [7:0] mem [0:15];
logic [7:0] rd_data;
logic [3:0] rd_tag;
logic rd_valid;
always_ff @(posedge clk) begin
if (wr_en) mem[wr_addr] <= wr_data;
rd_valid <= req_valid;
if (req_valid) begin
rd_data <= mem[req_addr];
rd_tag <= req_tag;
end
if (rst) rd_valid <= 1'b0;
endIn questo modello comportamentale, leggere e scrivere contemporaneamente uno stesso indirizzo restituisce il valore precedente, perché le assegnazioni non bloccanti leggono lo stato precedente. Le primitive di memoria reali hanno modalità di collisione e restrizioni esplicite; consulta le modalità di lettura/scrittura di AMD UG901 e verifica la modalità prevista rispetto alla destinazione e al risultato della sintesi. Azzerare valid non inizializza l'array.
| Fronte | Richiesta accettata | Effetto |
|---|---|---|
| 2 | addr=3,tag=7 | Acquisire il vecchio mem[3]=42 |
| 3 | addr=4,tag=8 | Consumare 42,7 e acquisire il valore successivo |
| 4 | Nessuna richiesta | Azzerare valid della risposta |
Questa pianificazione presume che il consumatore non vada mai in stallo. Se va in stallo al fronte 3, la risposta successiva può sovrascrivere rd_data. Aggiungi spazio per memorizzare le risposte oppure limita le richieste in base alla capacità disponibile, includendo le risposte già in transito. Inizializza esplicitamente la memoria di prova prima di verificare i valori. Verifica la corrispondenza di indirizzi e tag, non soltanto i dati della risposta; un valore corretto associato alla richiesta sbagliata è comunque un errore.
Prova tu
Con mem[3]=42, leggi l'indirizzo 3 e scrivici 99 allo stesso fronte. Che cosa inserisce questo modello in rd_data e qual è il nuovo valore della memoria? Che cosa serve per gli stalli di uscita?
Leggi la spiegazione
rd_data diventa 42, mentre mem[3] diventa 99. Entrambe le assegnazioni leggono lo stato precedente. Gli stalli richiedono spazio per le risposte e un controllo di ammissione che conti le risposte in transito. Verifica separatamente la modalità di collisione della memoria reale di destinazione.