Encaminhamento entre Leitura e Escrita
Parte da seção Design e Verificação RTL do Journey de Verilog da Coddy. Lição 24 de 38.
Uma interface de memória deve definir o comportamento de leitura/escrita no mesmo endereço. O encaminhamento seleciona explicitamente os dados de escrita de entrada para uma colisão, produzindo o comportamento de dados novos. Sem esse bypass, o template anterior de leitura nonblocking captura dados antigos. Os modos de memória do dispositivo diferem, então a semântica de simulação sozinha não garante um mapeamento de primitiva específico.
Trecho relevante; as declarações e conexões ao redor são fornecidas no desafio.
if(re) begin
if(we && waddr==raddr) q <= data;
else q <= mem[raddr];
endO bypass seleciona a palavra de entrada somente para uma colisão real de endereços.
Defina explicitamente o comportamento de colisão e verifique-o em relação ao modo de memória do hardware escolhido.
Desafio
MédioImplemente uma memória de quatro palavras com leitura registrada e encaminhamento de dados novos. As regras de escrita e de reset/habilitação de leitura correspondem às da lição anterior. Em uma leitura habilitada que colida com uma escrita habilitada no mesmo endereço, q captura os dados recebidos em vez da palavra antiga. Para as outras leituras, ele captura mem[raddr]. Colunas de saída: q. Todos os controles e dados permanecem estáveis antes de cada borda de subida do clock; os resultados são observados depois dela.
Conclua design.v e preserve os nomes e as portas de seu módulo. O testbench.v bloqueado fornece as alterações de entrada e imprime as saídas depois que elas se estabilizam. Ele escolhe um cenário usando um argumento do simulador, como +CASE=1; não é necessária entrada padrão. Não adicione impressão, atrasos ou encerramento da simulação ao design. A saída esperada é uma linha de valores decimais por observação, separados por um espaço e terminando com uma nova linha.
Experimente você mesmo
module dut (input clk, input rst, input we, input re, input [1:0] waddr, input [1:0] raddr, input [7:0] data, output reg [7:0] q);
// Substitua este placeholder pelo seu design.
initial q = 0;
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Design e Verificação RTL
1RTL Combinacional Confiável
Valores padrão evitam latchesCodificadores de prioridadeValidação One-HotDecodificação segura de caseRecapitulação - Roteador de requisições4RTL Sequencial Controlado
Prioridade de Reset e EnableContadores SaturantesPipeline de Dados e ValidDetecção de Bordas AmostradasRecapitulação - Contador de Eventos7Projeto - Monitor de Amostras
Acumular AmostrasAceitar Amostras Habilitadas2Larguras e Aritmética com Sinal
Preservando Bits de CarryComparações com SinalDeslocamentos Aritméticos à DireitaOverflow e SaturaçãoRecapitulação — Diferença com Sinal5Memória e Tabelas de Consulta
Tabelas ROM CombinacionaisArmazenamento em Matriz de RegistradoresPortas de Leitura RegistradasEncaminhamento entre Leitura e EscritaRecapitulação — Banco com Duas LeiturasPratique por conta própria: Compilador de Verilog online