Puertos de lectura registrados
Parte de la sección Diseño y verificación RTL del Journey de Verilog de Coddy. Lección 23 de 38.
Una lectura registrada captura datos de memoria en un flanco de reloj y mantiene ese valor después. Una habilitación de lectura puede preservar la salida anterior en ciclos deshabilitados. Restablecer el registro de lectura no requiere borrar cada palabra de memoria. Con asignaciones de lectura y escritura no bloqueantes, la expresión de lectura ve la palabra previa al flanco.
Fragmento relevante; las declaraciones y conexiones circundantes se proporcionan en el desafío.
always @(posedge clk) begin
if(we) mem[waddr] <= data;
if(rst) q <= 0;
else if(re) q <= mem[raddr];
endEl registro de salida se actualiza únicamente en el flanco especificado y en la ruta habilitada.
Latencia de lectura de documentos, comportamiento de lectura deshabilitada y qué restablecimiento de estado realmente borra.
Desafío
IntermedioImplementa una memoria de cuatro palabras de 8 bits con escritura síncrona y lectura registrada q. we escribe en los flancos ascendentes. rst borra síncronamente solo q; de lo contrario, re carga q desde mem[raddr] antes del flanco; re=0 mantiene q. La memoria no se reinicia y las escrituras son independientes de rst. Si la lectura y la escritura comparten una dirección en un flanco, q recibe la palabra antigua. Las pruebas inicializan las palabras antes de las lecturas habilitadas. Columnas de salida: q. Todos los controles y datos permanecen estables antes de cada flanco ascendente del reloj; los resultados se observan después.
Completa design.v y conserva los nombres de sus módulos y puertos. El testbench.v bloqueado proporciona los cambios de entrada e imprime las salidas después de que se estabilizan. Elige un escenario mediante un argumento del simulador como +CASE=1; no se requiere entrada estándar. No añadas impresiones, retardos ni terminación de la simulación al diseño. La salida esperada es una fila de valores decimales por observación, separados por un espacio y terminada con un salto de línea.
Pruébalo tú mismo
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);
// Reemplaza este marcador de posición con tu diseño.
initial q = 0;
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Diseño y verificación RTL
1RTL combinacional confiable
Los valores predeterminados evitan los latchesCodificadores de prioridadValidación one-hotDecodificación segura de caseRepaso: enrutador de solicitudes4RTL secuencial controlado
Prioridad de reinicio y habilitaciónContadores con saturaciónPipeline de datos y validaciónDetección de flancos muestreadosRepaso: contador de eventos7Proyecto - Monitor de muestras
Acumular muestrasAceptar muestras habilitadas2Anchos y aritmética con signo
Conservar los bits de acarreoComparaciones con signoDesplazamientos aritméticos a la derechaDesbordamiento y saturaciónRepaso: diferencia con signo5Memoria y tablas de consulta
Tablas ROM combinacionalesAlmacenamiento en matriz de registrosPuertos de lectura registradosReenvío de lectura-escrituraRepaso: banco de doble lecturaPractica por tu cuenta: Compilador de Verilog online