62 / 63 · Concetto
Interfaccia registri e istante degli effetti
Specificare indirizzi, byte e stop di risposta affinché ogni accettazione produca un solo effetto.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Definire «scrivere un registro»
Prerequisiti: decoderDecoder Attiva la linea corrispondente a un codice binario. Con enable disattivato può portare tutte le uscite a 0. Approfondisci d'indirizzo, ready/validHandshake Contratto che conferma il trasferimento quando valid del mittente e ready del destinatario valgono 1 allo stesso fronte. Include il mantenimento dei dati in attesa. Approfondisci e priorità d'aggiornamento.
Collegare registriRegistro Memorizza uno stato di più bit. I registri sincroni del corso acquisiscono gli ingressi specificati al fronte di clock. Approfondisci di configurazione a un controllore esterno richiede più dell'indirizzo corretto: vanno definiti accettazione, mantenimento della risposta bloccata e scritture su indirizzi di sola lettura. Usiamo una semplice interfaccia richiesta/risposta sullo stesso clock.
Gli indirizzi sono a byte con allineamento a 32 bit. Ogni richiesta genera esattamente una risposta di successo o errore.
| Indirizzo | Nome | Comportamento |
|---|---|---|
| 0x0 | CONFIG | Lettura/scrittura con byte strobe |
| 0x4 | STATUS | Sola lettura; valore all'accettazione |
| 0x8 | COMMAND | Lettura 0; scrivere bit 0 del byte 0 genera start |
| Altri | Indefiniti | Risposta errore, nessuna modifica |
Accettare se lo spazio per la risposta è vuoto o si libera
module register_interface (
input logic clk, rst,
input logic req_valid, req_write,
output logic req_ready,
input logic [3:0] req_addr,
input logic [31:0] req_wdata,
input logic [3:0] req_wstrb,
output logic rsp_valid,
input logic rsp_ready,
output logic [31:0] rsp_rdata,
output logic rsp_error,
input logic [31:0] status_value,
output logic [31:0] config_value,
output logic start_pulse
);
assign req_ready = !rsp_valid || rsp_ready;
always_ff @(posedge clk) begin
if (rst) begin
rsp_valid <= 1'b0;
config_value <= 32'd0;
start_pulse <= 1'b0;
end else begin
start_pulse <= 1'b0;
if (req_ready) begin
rsp_valid <= req_valid;
if (req_valid) begin
rsp_rdata <= 32'd0;
rsp_error <= 1'b0;
case (req_addr)
4'h0: begin
if (req_write) begin
for (int i=0; i<4; i++)
if (req_wstrb[i])
config_value[8*i +: 8]
<= req_wdata[8*i +: 8];
end else rsp_rdata <= config_value;
end
4'h4: begin
if (req_write) rsp_error <= 1'b1;
else rsp_rdata <= status_value;
end
4'h8: begin
if (req_write)
start_pulse <= req_wstrb[0] && req_wdata[0];
end
default: rsp_error <= 1'b1;
endcase
end
end
end
end
endmoduleCon risposta bloccata req_ready=0: scrittura CONFIG e impulso COMMAND non si ripetono. L'effetto può essere già avvenuto mentre attende solo la risposta. Ritrasmettere automaticamente per un ritardo può eseguire il comando due volte.
Calcolare i byte strobe
Con CONFIG=32'h11223344, req_wdata=32'hAABBCCDD, req_wstrb=4'b0101, cambiano solo byte 0 e 2: 32'h11BB33DD. Controllate separatamente allineamento, posizioni e ordine dei byte. Una scrittura wstrb=0000 risponde con successo senza cambiare il valore.
Dal MSBMSB Bit di peso maggiore. L’indice dipende dalla direzione dichiarata: non è necessariamente il numero più alto. Approfondisci l'ordine è byte3,2,1,0. Strobe 0101 seleziona byte2 e byte0, quindi solo BB e DD. Un bit strobe abilita un byte, non un singolo bit.
- CONFIG precedente: 11 | 22 | 33 | 44
- Dati di scrittura: AA | BB | CC | DD
- strobe 0101: Mantenere | Sostituire | Mantenere | Sostituire
- Nuovo CONFIG: 11 | BB | 33 | DD
A quale istante appartiene lo stato?
STATUS salva status_value all'accettazione. Se lo stato reale cambia mentre la risposta attende, rsp_rdata deve restare fermo. Collegare direttamente lo status combinatorio con rsp_valid=1, rsp_ready=0 viola il protocollo.
req_valid e req_ready entrambi 1 a fronti consecutivi indicano due richieste diverse. Dopo l'accettazione il mittente abbassa valid o presenta la richiesta seguente. Tenere la stessa richiesta non implica un'unica esecuzione.
Tre assi di verifica
- Indirizzi/permessi: validi, non allineati, scritture su STATUS e indirizzi indefiniti, controllando errori ed effetti.
- Dati: tutte le combinazioni dei quattro strobe e conservazione dei byte inattivi.
- Flusso: la risposta resta stabile se bloccata per più cicli; conteggio coerente anche consumando una risposta e accettando la successiva insieme.
Prova tu
COMMAND con req_wstrb[0]=1, req_wdata[0]=1 è accettato; rsp_ready resta 0 per tre cicli. start_pulse va ripetuto? Una scrittura STATUS può modificare config_value?
Leggi la spiegazione
start_pulse vale 1 solo per un ciclo dopo l’accettazione, poi 0. Bloccare la risposta non riesegue il comando. Scrivere STATUS genera errore senza cambiare config_value o altro stato. Le politiche di ritentativo prima della risposta devono essere concordate.