Altifigence Academy

14 / 24 · Concepto

Ready/valid y estado detenido

La etapa de salida conserva A con out_ready=0 mientras la entrada B es válida. ¿Qué deben hacer la etapa y el productor en el siguiente flanco?

Avanza solo con una transferencia

Un productor activa valid cuando su elemento actual está disponible. Un consumidor activa ready cuando puede aceptarlo. En un flanco ascendente con ambas activadas ocurre una transferencia. Avanza las coordenadas de píxel, el estado de los búferes de línea y la entrada de acumulación asociada solo entonces. Avanzar solo con valid pierde datos durante una pausa del consumidor; avanzar solo con ready cuenta una entrada inexistente.

Mientras valid está a nivel alto y ready a nivel bajo, conserva los mismos datos y valid. Para seguir aceptando entradas mientras la salida está bloqueada, proporciona almacenamiento y deduce la disponibilidad de su capacidad restante. El ejemplo RTL es una etapa de un elemento: acepta uno nuevo cuando está vacía o cuando el actual puede salir.

Secuencia de transferencias resuelta

En los ciclos cero a cuatro, valid=[0,1,1,1,1] y ready=[0,1,0,1,1] dan fire=[0,1,0,1,1]. Cinco relojes aceptan tres píxeles. El elemento detenido en el ciclo dos permanece hasta el tres. Un contador de fila de anchura cuatro no ha completado su primera fila. Contar relojes en lugar de transferencias desplaza todas las coordenadas posteriores de ventanas.

Si la etapa conserva A con out_valid a nivel alto y out_ready a nivel bajo, in_ready está a nivel bajo y A sigue almacenado. Cuando out_ready pasa a nivel alto, puede enviar A y aceptar B en el mismo flanco. Sin entrada de reemplazo, borra output valid. Documenta si se permite el reemplazo simultáneo y qué latencia implica.

El reinicio borra la validez además de los datos. Un fotograma nuevo necesita un reinicio definido de coordenadas y de validez de ventana. Recibir la última entrada difiere de consumir la última salida; activar done demasiado pronto puede dejar que un nuevo fotograma sobrescriba trabajo pendiente.

El código es una etapa de transferencia, no un motor de convolución completo. Si tu flujo instalado admite edición y simulación de SystemVerilog, crea manualmente un archivo y prueba la estabilidad bajo pausa y el reemplazo simultáneo. Aquí no se afirma ejecución de un simulador RTL. El diagrama ilustra fire; no es una traza capturada de hardware.

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
Transferencias aceptadas durante una pausa
Ver los datos de la forma de onda
Datos de la forma de onda: cada carácter es un intervalo; un punto conserva el estado anterior; p representa un ciclo de reloj.
SeñalForma de ondaValores del bus
clockp....
valid01111
ready01011
fire01011

Inténtalo tú

La etapa de salida conserva A con out_ready=0 mientras la entrada B es válida. ¿Qué deben hacer la etapa y el productor en el siguiente flanco?

Leer la explicación

La etapa pone in_ready a nivel bajo y conserva A con out_valid. El productor conserva B con in_valid. Los elementos estables podrán transferirse después exactamente una vez.

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.