7 / 24 · Concepto
Contratos temporales para solicitudes y respuestas de memoria
Distingue las lecturas síncronas, las etiquetas retardadas y las colisiones en una misma dirección.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Una memoria es más que un gran conjunto de registros
Una interfaz de memoria necesita un contrato temporal además de capacidad. Una lectura asíncrona cambia la salida combinacional al cambiar su dirección. Una lectura síncrona muestrea una dirección en un flanco y cambia la salida después. Estos modelos requieren planificaciones diferentes. La inferencia de un recurso de memoria del dispositivo también depende del estilo de código y de la herramienta de destino. Aquí especificamos dieciséis entradas de ocho bits con lectura síncrona.
Muestrea la dirección y la etiqueta en el flanco k. Los datos correspondientes y la etiqueta retardada aparecen después de ese flanco; su primera oportunidad de consumo es el flanco k+1. Una lectura de un ciclo no significa una respuesta combinacional inmediata. La validez de respuesta debe seguir el mismo retardo. Combinar un valor retardado con la etiqueta de entrada actual rompe la correspondencia de las solicitudes sucesivas.
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;
endEn este modelo de comportamiento, leer y escribir simultáneamente una dirección devuelve el valor anterior porque las asignaciones no bloqueantes leen el estado anterior. Las primitivas reales de memoria tienen modos de colisión y restricciones explícitos; consulta los modos de lectura y escritura de AMD UG901 y verifica el modo previsto frente al destino y al resultado de síntesis. Reiniciar valid no inicializa el conjunto de memoria.
| Flanco | Solicitud aceptada | Efecto |
|---|---|---|
| 2 | addr=3,tag=7 | Capturar el valor anterior mem[3]=42 |
| 3 | addr=4,tag=8 | Consumir 42,7 y capturar el siguiente valor |
| 4 | Ninguna solicitud | Borrar la validez de respuesta |
Esta planificación supone que el consumidor nunca se detiene. Si se detiene en el flanco 3, la respuesta siguiente puede sobrescribir rd_data. Añade almacenamiento de respuestas o limita las solicitudes según la capacidad disponible, contando también las respuestas ya en curso. Inicializa explícitamente la memoria de prueba antes de comprobar los valores. Verifica la correspondencia entre direcciones y etiquetas, además de los datos de respuesta; un valor correcto asociado a la solicitud equivocada sigue siendo un fallo.
Inténtalo tú
Con mem[3]=42, lee la dirección 3 y escribe 99 en ella en el mismo flanco. ¿Qué coloca este modelo en rd_data y cuál es el nuevo valor de memoria? ¿Qué hace falta para las detenciones de salida?
Leer la explicación
rd_data pasa a valer 42, mientras que mem[3] pasa a valer 99. Ambas asignaciones leen el estado anterior. Las detenciones requieren almacenamiento de respuestas y control de admisión que cuente las respuestas en curso. Verifica por separado el modo de colisión de la memoria real de destino.