14 / 24 · Concetto
Progetta un registro elastico con una posizione
Accetta in una posizione vuota oppure sostituisci un elemento consumato contemporaneamente.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Ricava ready dallo spazio disponibile
Un buffer con una posizione contiene un bit full e un registro payload. Quando è vuoto, può accettare un ingresso anche se la destinazione è in stallo. Quando è pieno, può accettare un sostituto se la destinazione consuma l'uscita esistente a quel fronte. Quindi input-ready è !full OR output-ready e output-valid è full. Questo buffer registrato non ha un passaggio combinatorio diretto dei dati.
Se input-ready è alto, full successivo è uguale a input-valid. Acquisisci il payload quando esiste un ingresso; altrimenti svuota la posizione. Se input-ready è basso, conserva full e payload. Azzerare full soltanto perché un'uscita è stata trasferita perde una sostituzione simultanea. Acquisire soltanto in base a input-valid sovrascrive una posizione piena e in stallo.
module elastic_byte (
input logic clk, rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data, in_tag,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data, out_tag
);
logic full;
assign in_ready = !full || out_ready;
assign out_valid = full;
always_ff @(posedge clk) begin
if (rst) full <= 1'b0;
else if (in_ready) begin
full <= in_valid;
if (in_valid) begin
out_data <= in_data;
out_tag <= in_tag;
end
end
end
endmodule| full precedente | out-ready | in-valid | Azione |
|---|---|---|---|
| 0 | 0 | 1 | Memorizzare l'ingresso |
| 1 | 0 | 1 | Rifiutare l'ingresso e mantenere l'uscita |
| 1 | 1 | 1 | Consegnare il vecchio elemento e memorizzare il sostituto |
| 1 | 1 | 0 | Consegnare il vecchio elemento e svuotare la posizione |
Memorizza tag0,y9 al fronte 0. Vai in stallo al fronte 1. Al fronte 2, consuma tag0 e memorizza tag1,y12; la posizione rimane piena. Al fronte 3, consuma tag1 e svuotala se non esiste un ingresso. La sostituzione consente una transazione per ciclo.
Collegare molti stadi crea un percorso combinatorio ready all'indietro. Registrare ready richiede spazio aggiuntivo per gli arrivi prima che la notifica di stallo abbia effetto. Verifica separatamente eventuali restrizioni del bus sui percorsi combinatori. Qualunque sia la larghezza del payload, memorizza i dati e tutti i campi associati nella stessa condizione e verifica tutti e quattro i casi di aggiornamento.
Prova tu
A un fronte con full=1, out-ready=1 e in-valid=1, consuma tag7 e offri tag8. Quali sono full e out-tag successivi? Che cosa va storto se full viene sempre azzerato al consumo?
Leggi la spiegazione
Input-ready è alto, quindi memorizza tag8 e mantieni full=1. Out-tag diventa 8. Azzerare sempre full perde tag8 dopo averlo accettato.