Altifigence Academy

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.

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.

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

En 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.

FlancoSolicitud aceptadaEfecto
2addr=3,tag=7Capturar el valor anterior mem[3]=42
3addr=4,tag=8Consumir 42,7 y capturar el siguiente valor
4Ninguna solicitudBorrar 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.

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.