Altifigence Academy

14 / 24 · Concetto

Ready/valid e stato in stallo

Lo stadio di uscita mantiene A con out_ready=0 mentre l'ingresso B è valido. Che cosa devono fare stadio e produttore al fronte successivo?

Avanza soltanto su un trasferimento

Un produttore attiva valid quando l'elemento corrente è disponibile. Un consumatore attiva ready quando può accettarlo. A un fronte di salita con entrambi attivi, avviene un trasferimento. Soltanto allora avanza coordinate dei pixel, stato dei buffer di riga e ingresso di accumulo associato. Avanzare soltanto su valid perde dati durante una pausa del consumatore; avanzare soltanto su ready conta ingressi inesistenti.

Quando valid è alto e ready basso, mantieni gli stessi dati e valid. Per continuare ad accettare ingressi mentre l'uscita è bloccata, fornisci memoria e ricava ready dalla capacità rimanente. L'esempio RTL è uno stadio a un elemento: accetta un nuovo elemento quando è vuoto oppure quando quello corrente può uscire.

Sequenza di trasferimenti svolta

Per i cicli da zero a quattro, valid=[0,1,1,1,1] e ready=[0,1,0,1,1] danno fire=[0,1,0,1,1]. Cinque clock accettano tre pixel. L'elemento in stallo nel ciclo due rimane fino al ciclo tre. Un contatore di riga di larghezza quattro non ha completato la prima riga. Contare i clock anziché i trasferimenti sposta ogni successiva coordinata delle finestre.

Se lo stadio mantiene A con out_valid alto e out_ready basso, in_ready è basso e A rimane memorizzato. Quando out_ready diventa alto, può inviare A e accettare B allo stesso fronte. In assenza di un ingresso sostitutivo, azzera valid di uscita. Documenta se la sostituzione simultanea è consentita e quale latenza implica.

Reset azzera la validità oltre ai dati. Un nuovo frame richiede un reset definito delle coordinate e della validità delle finestre. Ricevere l'ultimo ingresso è diverso da consumare l'ultima uscita; attivare done troppo presto può consentire a un nuovo frame di sovrascrivere lavoro in sospeso.

Il codice è uno stadio di trasferimento, non un motore completo di convoluzione. Se il tuo flusso installato supporta modifica e simulazione SystemVerilog, crea manualmente un file e prova la stabilità durante la pausa e la sostituzione simultanea. Qui non viene attestata un'esecuzione di simulatore RTL. Il diagramma illustra fire; non è una traccia hardware acquisita.

SystemVerilog
module sample_stage (
  input logic clk, reset,
  input logic in_valid,
  output logic in_ready,
  input logic signed [7:0] in_data,
  output logic out_valid,
  input logic out_ready,
  output logic signed [7:0] out_data
);
  assign in_ready = !out_valid || out_ready;
  always_ff @(posedge clk) begin
    if (reset) begin
      out_valid <= 1'b0;
      out_data <= '0;
    end else if (in_ready) begin
      out_valid <= in_valid;
      if (in_valid) out_data <= in_data;
    end
  end
endmodule
Trasferimenti accettati durante una pausa
Mostra i dati della forma d’onda
Dati della forma d’onda: ogni carattere è un intervallo; il punto mantiene lo stato precedente; p è un ciclo di clock.
SegnaleForma d’ondaValori del bus
clockp....
valid01111
ready01011
fire01011

Prova tu

Lo stadio di uscita mantiene A con out_ready=0 mentre l'ingresso B è valido. Che cosa devono fare stadio e produttore al fronte successivo?

Leggi la spiegazione

Lo stadio porta in_ready basso e conserva A con out_valid. Il produttore conserva B con in_valid. Gli elementi stabili possono essere trasferiti successivamente esattamente una volta.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.