Altifigence Academy

7 / 24 · Conceito

Contratos de temporização para solicitações e respostas de memória

Distinga leituras síncronas, etiquetas atrasadas e colisões no mesmo endereço.

Uma memória é mais do que um grande banco de registradores

Uma interface de memória precisa de um contrato de temporização além de capacidade. Uma leitura assíncrona altera a saída combinacional quando seu endereço muda. Uma leitura síncrona amostra um endereço em uma borda e altera a saída depois dela. Esses modelos exigem cronogramas diferentes. A inferência de um recurso de memória do dispositivo também depende do estilo de codificação e da ferramenta de destino. Aqui, especificamos dezesseis posições de oito bits com leitura síncrona.

Amostre o endereço e a etiqueta na borda k. Os dados correspondentes e a etiqueta atrasada aparecem após essa borda; sua primeira oportunidade de consumo é a borda k+1. Uma leitura de um ciclo não significa uma resposta combinacional imediata. O valid da resposta deve acompanhar o mesmo atraso. Combinar um valor atrasado com a etiqueta da entrada atual quebra solicitações sucessivas.

SystemVerilog
logic [7:0] mem [0:15];
logic [7:0] rd_data;
logic [3:0] rd_tag;
logic rd_valid;
always_ff @(posedge clk) begin
  if (wr_en) mem[wr_addr] <= wr_data;
  rd_valid <= req_valid;
  if (req_valid) begin
    rd_data <= mem[req_addr];
    rd_tag <= req_tag;
  end
  if (rst) rd_valid <= 1'b0;
end

Neste modelo comportamental, ler e escrever simultaneamente um endereço retorna o valor anterior, porque as atribuições não bloqueantes leem o estado anterior. Primitivas reais de memória têm modos explícitos de colisão e restrições; veja os modos de leitura/escrita do AMD UG901 e confira o modo pretendido no destino e no resultado da síntese. Reinicializar valid não inicializa o banco de memória.

BordaSolicitação aceitaEfeito
2addr=3,tag=7Capturar o valor anterior mem[3]=42
3addr=4,tag=8Consumir 42,7 e capturar o próximo valor
4Nenhuma solicitaçãoDesativar valid da resposta

Este cronograma pressupõe que o consumidor nunca pause. Se ele pausar na borda 3, a próxima resposta poderá sobrescrever rd_data. Adicione armazenamento de respostas ou limite as solicitações pela capacidade disponível, incluindo respostas já em trânsito. Inicialize explicitamente a memória de teste antes de verificar os valores. Verifique a correspondência entre endereço e etiqueta, além dos dados da resposta; um valor correto associado à solicitação errada ainda é uma falha.

Experimente

Com mem[3]=42, leia o endereço 3 e escreva 99 nele na mesma borda. O que este modelo coloca em rd_data e qual é o novo valor da memória? O que é necessário para pausas na saída?

Ler a explicação

rd_data torna-se 42, enquanto mem[3] torna-se 99. Ambas as atribuições leem o estado anterior. As pausas exigem armazenamento de respostas e controle de admissão que conte as respostas em trânsito. Verifique separadamente o modo de colisão da memória real de destino.

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