Altifigence Academy

14 / 24 · Conceito

Ready/valid e estado em pausa

O estágio de saída mantém A com out_ready=0 enquanto a entrada B é válida. O que o estágio e o produtor devem fazer na próxima borda?

Avance apenas em uma transferência

Um produtor ativa valid quando seu item atual está disponível. Um consumidor ativa ready quando pode aceitar esse item. Em uma borda de subida com ambos ativos, ocorre uma transferência. Avance as coordenadas do pixel, o estado do buffer de linha e a entrada de acumulação associada apenas nesse momento. Avançar apenas com valid perde dados durante uma pausa do consumidor; avançar apenas com ready conta entradas inexistentes.

Enquanto valid estiver alto e ready baixo, mantenha os mesmos dados e valid. Para continuar aceitando entradas enquanto a saída está bloqueada, forneça armazenamento e derive a prontidão de sua capacidade restante. O RTL de exemplo é um estágio de um item: ele aceita um novo item quando está vazio ou quando o item atual pode sair.

Sequência de transferências resolvida

Para os ciclos zero a quatro, valid=[0,1,1,1,1] e ready=[0,1,0,1,1] dão fire=[0,1,0,1,1]. Cinco clocks aceitam três pixels. O item em pausa no ciclo dois permanece até o ciclo três. Um contador de linha de largura quatro ainda não completou sua primeira linha. Contar clocks em vez de transferências desloca todas as coordenadas posteriores de janelas.

Se o estágio mantiver A com out_valid alto e out_ready baixo, in_ready estará baixo e A continuará armazenado. Quando out_ready ficar alto, ele poderá enviar A e aceitar B na mesma borda. Sem entrada de substituição, ele desativa o valid da saída. Documente se a substituição simultânea é permitida e qual latência está implícita.

Reset limpa a validade além dos dados. Um novo quadro precisa de reset definido das coordenadas e da validade das janelas. Receber a última entrada difere de consumir a última saída; ativar done cedo demais pode permitir que um novo quadro sobrescreva trabalho pendente.

O código é um estágio de transferência, não um mecanismo completo de convolução. Se o fluxo instalado suportar edição e simulação de SystemVerilog, crie manualmente um arquivo e teste a estabilidade sob pausa e a substituição simultânea. Nenhuma execução de simulador RTL é afirmada aqui. O diagrama ilustra fire; não é um rastreamento capturado do 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
Transferências aceitas durante uma pausa
Ver os dados da forma de onda
Dados da forma de onda: cada caractere é um intervalo; um ponto mantém o estado anterior; p representa um ciclo de clock.
SinalForma de ondaValores do barramento
clockp....
valid01111
ready01011
fire01011

Experimente

O estágio de saída mantém A com out_ready=0 enquanto a entrada B é válida. O que o estágio e o produtor devem fazer na próxima borda?

Ler a explicação

O estágio coloca in_ready baixo e mantém A com out_valid. O produtor mantém B com in_valid. Itens estáveis podem depois ser transferidos exatamente uma vez.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.