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.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
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.
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;
endNeste 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.
| Borda | Solicitação aceita | Efeito |
|---|---|---|
| 2 | addr=3,tag=7 | Capturar o valor anterior mem[3]=42 |
| 3 | addr=4,tag=8 | Consumir 42,7 e capturar o próximo valor |
| 4 | Nenhuma solicitação | Desativar 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.