lunes, 28 de mayo de 2007

Explicación de tiempos de latencia y funcionamiento de la memoria RAM

Explicación de tiempos de latencia y funcionamiento de la memoria RAM

Si nos referimos al diccionario nos dice q latencia es la cualidad o facultad de latente, y latente es algo oculto y escondido, que existe sin manifestarse (carajo Asustado )..

En informática los tiempos de latencia se refieren a tiempos de espera.
Para saber qué es la latencia de la memoria primero hay q ver cómo funciona..


imagen obtenida desde: http://www.legitreviews.com/article.php?aid=53

En primer lugar la ram se organiza en forma de matriz de filas "rows" y columnas "columns", q a su vez se agrupan en bancos "banks".. es decir es una matriz de 3 dimensiones, de filas y columnas dentro de bancos..

Cuando se solicita un dato dentro de la memoria hay q darle la dirección donde se contiene, se hará especificando el banco. Dentro de él la fila, y a su vez la columna dentro de la fila..

Una vez que se llega al principio de la lectura (todo lo q digo es análogo para escritura) se leen los datos en forma de ráfagas "bursts"

Es decir no se lee solo una posición sino ráfagas enteras, para ello se mantiene fija la fila y el banco y se va cambiando de columna para ir avanzando (si se llegase al final de fila, habría q cambiar a la siguiente, si se llegase al final de banco tb. habría q cambiar al siguiente).
Así hasta finalizar la lectura del "burst" de datos q interesa..

EL direccionamiento ser realiza mediante varias señales:

-Señal "ACTIVE": establece un banco de memoria como activo, tiene una duración mínima en ciclos.
Hasta q no concluyan los ciclos mínimos de la señal ACTIVE, no puede lanzarse una señal PRECHARGE para cerrar ese banco.
Hay q tener en cuenta q mientras un banco permanece activo está "bloqueado" para esa lectura/escritura, antes de poder volver a utilizarlo en otra lectura/escritura diferente hay q cerrarlo.

-Señal "RAS": Row Access Strobe, establece una fila dentro de un banco activo como seleccionada, esta señal consume varios ciclos para localizar la fila necesaria.

-Señal "CAS": Column Access Strobe, establece una columna dentro de una fila como seleccionada, esta señal consume varios ciclos para localizar la columna necesaria.

-Señal "PRECHARGE": cierra un banco de memoria activo, dejándolo libre para realizar sobre él otra lectura/escritura (lanzando otra señal ACTIVE

Pues bien.. las latencias aparecen del siguiente modo:

Se lanza una señal ACTIVE q activa el banco dentro del cual está la posición de memoria, "bloqueando" ese banco para otras lecturas/escrituras. Durará un mínimo de Ax ciclos.

Se lanza una señal RAS para localizar la fila dentro del banco, esta señal tardará Rx ciclos en completarse.

Un vez encontrada la fila, se lanza una señal CAS, esta señal tardará Cx

Una vez completos los ciclos de las señales el dato está disponible en el bus, pero hay q seguir leyendo para completar el número de posiciones q completan el "burst" de datos q se lee

Con lo cual se vuelve a activar una señal CAS para avanzar a la siguiente columna dentro de la fila, y se añade una nueva latencia de Cx ciclos para completar la señal..

Habrá n señales CAS para completar la lectura del "burst" da datos, por tanto la latencia de la señal CAS será n*Cx

Un vez completada la lectura/escritura del "burst" se lanza una señal PRECHARGE para cerrar el banco activo y dejarlo libre para otra lectura/escritura, consumiendo esta señal Px ciclos.

NOTA: si no se hubiesen consumido los ciclos de la señal ACTIVE"burst", habría q esperar hasta q concluyesen.

NOTA2: mientras esta señal esta activa puede haber señales ACTIVE a otros bancos, con lo cual, solo añade latencia si se quisiese acceder a ese banco en concreto mientras se está cerrando.

La latencia total de la lectura/escritura será del siguiente modo:
Ax>= Rx + n*Cx
T = Rx + n*Cx + Px

Se deduce de lo anterior q el banco debe estar activo un mínimo de tiempo (q podrá ser mayor o igual al tiempo de la lectura del "burst", mayor si el burst no consume los ciclos mínimos de la Señal ACTIVE, igual si los supera)

En la latencia total es "peso" de las distintas señales es diferente..

Se da una señal RAS, por n señales CAS..

La señal ACTIVE puede solaparse temporalmente con las anteriores llegando a no tener ninguna influencia sobre la latencia total

La señal PRECHARGE solo añadirá latencia real si se solicita otra señal ACTIVE sobre el mismo banco mientras sucede la señal PRECHARGE

Por tanto se deduce q a la hora de obtener el tiempo total, la señal que más "pesa" es la señal CAS, q es la q suelen dar los fabricantes cuando se consulta las características sobre módulos de memoria.
Por ej. Kingstong DDR400 VALUERAM CL 2,5 --> CL = CAS Latency

Hasta ahora me he referido siempre a las latencias de memoria como los ciclos q tarda en completarse una señal..

Hay q tener en cuenta q una memoria DDR333 tiene 166 millones de ciclos por segundo (166*2=333), en cambio una DDR400 200 millones por segundo.

1/133*10^6 = 7,5 nanoSegs (10^-9)
1/166*10^6 = 6 nanoSegs
1/200*10^6 = 5 nanoSegs

Por tanto si tenemos una memoria con unas duraciones:
ACTIVE: 6
RAS: 3
CAS: 2,5
PRECHARGE: 3

Las latencias para esa Memoria serían:

/**
* NOTA: aquí calculo la suma de todas las señales de forma ideal,
* hay que tener en cuenta que esta suma solo es orientativa.
* Para averiguar la latencia real de una lectura o escritura,
* habría q tener en cuenta las consideraciones anteriores.
* ACTIVE, puede solaparse, y mientras sucede PRECHARGE solo
* habrá latencia si se quiere lazar otra ACTIVE sobe el mismo banco.
*
* Además considero que todos los datos del burst están en la misma fila
* por tanto solo ocurre RAS una vez (pero podría ser necesario cambiar
* de fila dándose la señal RAS m veces (típicamente m<>