Altifigence Academy

14 / 24 · Conceito

Projete um registrador elástico de uma posição

Aceite dados em uma posição vazia ou substitua um item consumido simultaneamente.

Derive ready do armazenamento disponível

Um buffer de uma posição contém um bit full e um registrador de conteúdo. Quando vazio, pode aceitar uma entrada mesmo que o destino esteja em pausa. Quando cheio, pode aceitar uma substituição se o destino consumir a saída existente nessa borda. Assim, input-ready é !full OR output-ready, e output-valid é full. Este buffer registrado não permite passagem combinacional direta dos dados.

Se input-ready estiver alto, o próximo full será igual a input-valid. Capture o conteúdo quando houver uma entrada; caso contrário, esvazie a posição. Se input-ready estiver baixo, preserve full e o conteúdo. Limpar full simplesmente porque uma saída foi transferida perde uma substituição simultânea. Capturar apenas com base em input-valid sobrescreve uma posição cheia em pausa.

SystemVerilog
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 anteriorout-readyin-validAção
001Armazenar a entrada
101Rejeitar a entrada e manter a saída
111Entregar o item anterior e armazenar a substituição
110Entregar o item anterior e esvaziar a posição

Armazene tag0,y9 na borda 0. Pause na borda 1. Na borda 2, consuma tag0 e armazene tag1,y12; a posição permanece cheia. Na borda 3, consuma tag1 e esvazie a posição se não houver entrada. A substituição permite uma transação por ciclo.

Conectar muitos estágios cria um caminho combinacional de ready no sentido inverso. Registrar ready exige armazenamento adicional para as chegadas anteriores ao efeito da notificação de pausa. Verifique separadamente quaisquer restrições de caminhos combinacionais específicas do barramento. Independentemente da largura do conteúdo, armazene os dados e todos os campos acompanhantes sob a mesma condição e verifique os quatro casos de atualização.

Experimente

Em uma borda com full=1, out-ready=1 e in-valid=1, consuma tag7 e ofereça tag8. Quais serão o próximo full e out-tag? O que dará errado se full for sempre limpo no consumo?

Ler a explicação

Input-ready está alto, portanto armazene tag8 e mantenha full=1. Out-tag torna-se 8. Limpar full sempre perde tag8 depois de aceitá-la.

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