La guida che segue nasce dall'esigenza personale di fugare i dubbi sul funzionamento delle RAM di tipo SDRAM DDR e DDR2 (che sono quelle attualmente utilizzate) e dei principali timings associati.

La guida cerca di spiegare il funzionamento delle DDR SDRAM (anche per le DDR2 valgono tutti i ragionamenti fatti) e dei principali timings che si trovano nei bios delle schede madri più evolute (per es. DFI).

1. Introduzione

Lo scopo del presente tutorial è quello di comprendere i timings che regolano il funzionamento delle moderne memorie DDR SDRAM. Per raggiungere questo scopo è necessario capire le modalità di funzionamento della memoria e in particolare come sono effettuate le operazioni elementari come la lettura e la scrittura dei dati.
Saranno presi in considerazione dei modelli semplificati di funzionamento che sono adatti a descrivere compiutamente i timings delle memorie. Verrà utilizzato un linguaggio che sia il più semplice possibile e dei modelli semplificati che se da una parte consentiranno ad un numero maggiore di persone di comprendere gli argomenti trattati, dall’altra faranno storcere il naso agli utenti maggiormente esperti e a quelli più puristi: mi scuso anticipatamente con questi utenti.
Tutte le considerazione fatte sui timings sono valide anche per le memorie DDR2 SDRAM visto che la loro architettura interna è comunque quella di una memoria SDRAM. L’unica differenza tra DDR e DDR2 consiste nella banda di uscita e verrà chiarita meglio nel seguito.


2. Indirizzamento in un modulo di memoria DDR SDRAM

Logicamente i chip che costituiscono le memorie sono organizzati come degli array bidimensionali (matrici) che vengono acceduti specificando un indirizzo di riga ed un indirizzo di colonna. Ciascun elemento della matrice contiene una cella elementare di memorizzazione.
Pertanto per accedere un dato contenuto in una data cella di memoria bisogna fornire due indirizzi uno di riga ed uno di colonna, e quindi se suppongo di avere una memoria che è composta da un array bidimensionale (matrice) di 8192 righe e 1024 colonne avrò bisogno di:
• 2^13=8192 di un indirizzo di13 bit per indirizzare ciascuna delle righe presenti nella matrice
• 2^10=1024 un indirizzo di 10 bit per indirizzare ciascuna delle colonne presenti nella matrice
In totale avrò bisogno di un indirizzo composto da 13+10=23 bit per indirizzare correttamente il contenuto di una cella di memoria.
In altre parole questo significa che dovrei fornire al chip di memoria 23 linee che consentano di trasportare l’indirizzo con cui si individua una cella elementare di memoria.



Primo espediente che viene utilizzato nelle moderne memorie DDR SDRAM invece di utilizzare 23 linee che consentano di trasportare l’indirizzo, se ne utilizzeranno solo 13 che rappresentano le linee necessarie per poter indirizzare le righe. Per indirizzare le colonne utilizzerò le stesse linee ma in tempi diversi: prima sarà trasferito l’indirizzo della riga da cui si vuole leggere il dato e subito dopo sarà trasferito l’indirizzo della colonna utilizzando (nell’esempio fatto) solo 10 delle 13 linee di indirizzo disponibili.
Ecco il motivo per cui ho bisogno il segnale di RAS (Row Address Select) e il segnale di CAS (Column Address select), questi segnali servono per far capire al controller della memoria che quello che sto passando è un indirizzo di riga oppure di colonna. Pertanto qualsiasi accesso alla memoria per fare una qualsiasi operazione prevede in sequenza il segnale di RAS seguito dall’indirizzo di riga ed il segnale di CAS seguito dall’indirizzo di colonna.
Ma perché si è complicato il meccanismo di indirizzamento della memoria passando l’indirizzo completo in due tempi? La spiegazione è molto più semplice di quanto si creda: si vogliono risparmiare delle linee di indirizzo per consentire una miniaturizzazione più spinta e quindi per consentire di avere maggiori quantità di memoria in parità di spazio. Nella microelettronica quando si deve portare qualche linea elettrica al di fuori del chip sorgono sempre grossi problemi, infatti questo costituisce uno dei maggiori impedimenti da superare nella progettazione di un qualsiasi chip miniaturizzato.
A questo punto facciamo un accenno alla metodologia utilizzata per memorizzare i dati all’interno di una cella di memoria. Sostanzialmente viene utilizzato un circuito elettrico che può essere schematizzato come un condensatore che può essere caricato o scaricato, attribuendo ai due stati elettrici del condensatore i valori binari 0 ed 1 ecco fatto che avrò un circuito in grado di memorizzare dei dati al proprio interno. Il tutto può essere schematizzato nel seguente modo:



Questo circuito rappresenta un buon risultato dal punto di vista della miniaturizzazione perchè utilizza un numero minimo di componenti, però ha un inconveniente che è quello di tutti i condensatori e cioè che passato un certo tempo tende a perdere la sua carica elettrica di fatto perdendo il contenuto informativo contenuto in esso.
Per ovviare a questo inconveniente si ricorre al refresh che consiste nell’accedere (dando quindi tensione alla cella elementare), ad intervalli di tempo regolari (refresh time), il contenuto di ogni cella mantenendo inalterati i dati originali. Così è possibile mantenere i dati all'interno della DRAM per un tempo indeterminato.
Il refresh viene anche effettuato in corrispondenza di ciascuna operazione di lettura/scrittura in memoria.

3. Densità e banchi in un chip di memoria

I chip di memoria più diffusi sono quelli da 4, 8, e 16 bit (più raramente 32 bit). Quindi un chip di 512 Mbit di memoria può essere composto fino a 128M con celle a 4 bit, 64M con celle a 8 bit, oppure 32M con celle a 16 bit, le corrispondenti notazioni sono 128M × 4, 64M × 8, e 32M × 16.
La prima cifra è chiamata depth (profondità) di un chip di memoria ed è una quantità adimensionale, la seconda è chiamata width (ampiezza) ed è espressa in bit. Ciascun chip di memoria è caratterizzato da una densità (profondità × ampiezza) ed è organizzato in banchi (di solito 4 e più raramente 2).
Quindi la densità indica la quantità di celle elementari memoria presenti in un chip e le linee dati in uscita (I/O) del chip, per esempio:
• 64 Mbit × 8 significa che il chip di memoria è da 512 Mbit (densità) e che in uscita vengono utilizzate linee dati di I/O con ampiezza di 8 bit ;
• 32 Mbit × 16 significa che il chip di memoria è da 512 Mbit (come prima) e che in uscita vengono utilizzate linee dati di I/O con ampiezza di 16 bit;
Se il chip è organizzato in 4 banchi avrò all’interno del chip 4 matrici di 128 Mbit ciascuna ovvero utilizzando gli stessi esempi di prima:
• avrò 4 matrici di 8192 × 1024 × 16
• avrò 4 matrici di 8192 × 512 × 32
Dagli esempi fatti si nota che se l’uscita del chip è di n bit allora ogni elemento delle matrici di memoria conterrà 2 × n bit, questo è dovuto al fatto che l’architettura delle memorie DDR SDRAM utilizza un’architettura del tipo Double Data Rate (DDR appunto), che è essenzialmente un’architettura con un tipo d’interfaccia progettata per trasferire due data words per ogni ciclo di clock nei pin di I/O. In una memoria DDR SDRAM un singolo accesso in lettura/scrittura consiste effettivamente di un trasferimento interno al chip di un singolo dato che contiene 2n-bit per ciascun ciclo di clock, e corrisponde sui pin di I/O a due dati che contengono ciascuno n-bit, in cui ciascun dato viene trasferito ogni mezzo ciclo di clock (un dato viene trasferito sul fronte di salita del clock e un altro dato sul fronte di discesa).
In altre parole con un unico ciclo di clock vengono accedute e rese disponibili due data words, mentre nelle vecchia memorie SDRAM con un ciclo di clock veniva acceduto e reso disponibile un solo data word, quindi in generale a parità di frequenza di clock la banda delle DDR SDRAM è doppia rispetto a quella delle normali SDRAM.
L’organizzazione in banchi implica che avrò bisogno di ulteriori bit di indirizzo per indirizzare uno dei quattro banchi presenti in ciascun chip, che vengono chiamati segnali di Bank Address (BA). Per riassumere quanto detto si può considerare il seguente schema logico di un chip di memoria:



Nella realtà le cose sono molto più complicate, però questo schema riassume i concetti principali che concorrono alla lettura/scrittura di valori all’interno di un chip di memoria. Sono presenti i seguenti elementi:
1) i segnali di indirizzamento:
a) i segnali di Bank Address BA0 e BA1 che servono a indirizzare uno dei 4 banchi di memoria presenti all’interno del chip;
b) i segnali di Address da A0 a A12 che consentono di indirizzare le celle di memoria all’interno di ciascun banco.
2) i segnali di controllo:
a) CS (Chip Select) che serve a selezionare/deselezionare il chip di memoria;
b) WE (Write Enabled) che serve ad abilitare/disabilitare la scrittura in questo chip di memoria;
c) CAS (Columns Address Select) che è il segnale che precede gli indirizzi di colonna;
d) RAS (Row Address Select) che è il segnale che precede gli indirizzi di riga.
3) DQ0-DQ7 che sono le linee di I/O del chip di memoria.

L’organizzazione di un array di memoria SDRAM in banchi è stato introdotto principalmente per aumentare le performance, anzi per essere più precisi, per minimizzare le latenze del sistema. Infatti, il fatto di avere più banchi può consentire, per esempio, di accedere una riga in un banco mentre contemporaneamente si sta eseguendo un refresh un’altra riga in un altro banco. Oppure di organizzare i dati nella memoria in modo tale che il prossimo dato che sarà acceduto sarà nell’altro banco e nella riga di memoria che è stata appena refreshata ed è pronta per essere letta/scritta, risparmiando un ciclo di refresh (ricordiamo che tutte le operazioni di lettura/scrittura sono associate ad un ciclo di refresh). Questo metodo di accesso è detto bank interleaving.
Per i più puristi e quelli più esperti riporto di seguito come nella realtà è l’architettura di un chip di memoria da 512 Mbit con densità 64 Mbit × 8:



Lo schema è tratto da un data sheet di un chip di memoria commerciale di un noto produttore, chi vuole può divertirsi a capirlo in dettaglio. Comunque i concetti fondamentali sono quelli descritti nello schema semplificato prima presentato.

4. Granularità in un modulo di memoria

Il concetto di granularità si riferisce al fatto che più chip di memoria con una qualsiasi densità possono essere collegati assieme in un layout di un PCB per formare un modulo di memoria di una capacità qualsiasi.
Come già visto l’ampiezza di un chip è la capacità della sua interfaccia con il bus dati di I/O (un chip 64 Mbit × 8 ha ampiezza di 8 ovvero è capace a veicolare in I/O 8 bit alla volta). Considerando che i moderni controller di memoria hanno bus dati a 64 bit, bisogna assemblare assieme tanti chip di memoria tali che l’ampiezza totale veicolata in I/O corrisponda a quella dell’ampiezza del bus dati del controller. Quindi la composizione di un banco SDRAM di 64 bit richiede 16 chip con ampiezza × 4, 8 chip con ampiezza × 8, 4 chip con ampiezza × 16 cioè viene fatta riempiendo il bus dati del controller.
Il rimanente parametro di capacità che è la profondità viene utilizzato per determinare la capacità totale del modulo fisico di memoria SDRAM. Per esempio un tipico modulo di 1GB di SDR/DDR/DDR2 SDRAM ha profondità di 1GB × 8 (bit/byte) / 64 bits = 128M. Quindi in questo caso il modulo è denotato come 128M × 64.
C’è da dire che in un banco fisico di memoria posso ottenere la stessa capacità utilizzando chip che hanno profondità che è la metà di quella massima utilizzabile, così per esempio posso ottenere un modulo di 1GB utilizzando 8 chip 64M × 16 oppure utilizzando 16 chip 64M × 8. Nel primo caso si parla di memoria singl-bank (o single-rank), nel secondo caso di memoria dual-bank (o dual-rank). Le memorie dual-bank sono rappresentate con configurazioni che utilizzano 16 chip con ampiezza × 8, docve il primo banco è formato dai primi otto chip nel lato frontale del modulo e gli altri otto chip nel lato posteriore nel modulo di memoria. Naturalmente i moduli di memoria dual-bank di solito hanno maggiori latenze di accesso rispetto a quelli single-bank.
Per i più esperti di seguito viene riportato un diagramma funzionale a blocchi di un layout PCB standard, preso da un datasheet di un noto costruttore, che rende l’idea di come i chip di memoria a 66 pin vengono collegati assieme per ottenere un modulo di memoria DDR SDRAM da 1 GB unbuffered a 184 pin:



Notate come le linee dati di I/O sono 64 e il segnale di chip select consente di selezionare 8 banchi per volta.

5. Comandi impartiti ad un chip di RAM e timings associati

Un chip di memoria RAM può ricevere un set di comandi elementari che vengono impartiti utilizzando i segnali che arrivano al chip di memoria. Più precisamente l’invio combinato di questi segnali si traduce in un comando che viene impartito al chip di memoria. Il tutto è riassunto nella tabella seguente:



Nelle righe della tabella sono riportati i comandi ed i corrispondenti segnali di controllo che bisogna “alzare” (H sta per High ed L sta per Low) per eseguire il comando stesso. Tenendo conto che il segnale si attiva nella transizione del fronte di clock da alto a basso Low corrisponde a segnale attivato.
Per indirizzare una riga dovrò impartire un comando di ACTIVE che corrisponde al segnale di CS (Chip Select) e di RAS (Row Address Select) attivi seguiti dagli indirizzi di banco e di riga. Per leggere il contenuto di una riga precedentemente attivata dovrò “alzare” i segnali di CS e CAS (Column Address Select).
Una volta capito come vengono impartiti i comandi ad un chip di memoria è facile capire come avviene un ciclo di lettura e di scrittura sulla memoria e quali siano i timings associati.

5.1. Attivazione di una riga di memoria

Facendo riferimento al modello semplificato di chip di memoria già riportato precedentemente proviamo ad immaginare le operazioni elementari che vanno fatte per leggere e scrivere un elemento all’interno delle celle elementari presenti in un chip di memoria.



Prima di fare una qualsiasi operazione sui dati immagazzinati in una riga di memoria, è necessario attivare la riga corrispondente nel banco di memoria. A questo scopo viene utilizzato il comando ACTIVE associato ad un indirizzo di banco presente sui pin BA0-BA1 e un indirizzo di riga presente sui pin A0-A12 del chip di memoria (fare riferimento al modello di chip semplificato presentato precedentemente).
La riga attivata rimane disponibile per operazioni susseguenti alla prima fino a quando non viene inviato un comando di PRECHARGE che disattiva la riga e la rende indisponibile a successive operazioni (fino ad un nuovo comando di ACTIVE). Il periodo minimo di disponibilità della riga dalla sua attivazione fino al segnale di precharge è determinato dal Row Active Time (tRAS).
Altro concetto è che è impossibile attivare un’altra riga nello stesso banco di memoria fino a quando la riga precedente nello stesso banco di memoria è disponibile. Questo è dovuto al fatto che tutta l’architettura fisica e il principio di funzionamento all’interno dello stesso chip è condiviso per tutte le righe contenute nello stesso banco di memoria. Per esempio all’interno dello stesso chip di memoria è presente lo stesso buffer di dati per ciascun banco, se si attivasse un’altra riga prima di avere disattivato quella attivata precedentemente, si otterrebbe la riscrittura dei dati nel buffer con quelli dell’ultima riga attivata. Quindi, il minimo periodo di tempo tra l’attivazione di due righe nello stesso banco di memoria di un chip è determinato dal Row Cycle Time (tRC).
Inoltre dopo aver attivato una riga prima di dare il successivo comando che indirizza la colonna bisogna attendere un sempre un tempo che è il RAS to CAS Delay (tRCD).
Contemporaneamente, essendo attiva una riga in un dato banco, è possibile attivare un‘altra riga in un altro banco del chip (questo è uno dei vantaggi di suddividere la memoria in più banchi) al successivo ciclo di clock, riducendo l’overhead totale legato all’accesso delle righe. Il minimo intervallo di tempo tra due accessi successivi su due differenti banchi è chiamato Row-to-Row Delay (tRRD). La ragione per introdurre questa ulteriore latenza non ha nulla a che vedere con le operazioni fatte sul chip di memoria, ma viene introdotta solamente per limitare i consumi elettrici indotti dalla frequente esecuzione di questo comando, la cui troppo frequente esecuzione potrebbe portare a effetti non desiderabili di eccessivo carico elettrico.
Di seguito un diagramma che spiega il significato del tRCD e del tRRD:



5.2. Lettura in memoria

Per quanto detto i passi necessari per leggere un elemento all’interno del chip di memoria sono i seguenti:
1) L’indirizzo di riga è inviato sui pin di indirizzo A0-A12 attraverso l’address bus;
2) Il pin che trasporta il segnale di RAS è attivato cosicché viene individuata la riga di memoria da cui leggere il valore.
3) La riga è copiata nel buffer interno al chip.
4) Il segnale di Write Enable è disattivato cosicché non sarà possibile scrivere un dato sulla stessa riga mentre questa viene letta.
5) L’indirizzo di colonna è inviato sui pin di indirizzo A0-A10 attraverso l’address bus.
6) E’ individuata nel buffer interno la cella elementare di memoria da mandare in output.
7) Il segnale di CAS abilità l’output cosicché il valore letto è propagato sui pin di I/O DQ0-DQ7 e quindi può viaggiare sul data bus verso il sistema.
8) I segnali di RAS e CAS sono disattivati così il ciclo può ricominciare.

Pertanto seguendo lo schema logico precedente, dopo aver attivato una riga in un banco di memoria bisogna inviare l’indirizzo di colonna. Tra l’invio dell’indirizzo di riga e l’indirizzo di colonna è necessario aspettare un tempo minimo chiamato RAS#-to-CAS# Delay (tRCD). Questo tempo è uno dei parametri di funzionamento della memoria fissati dal costruttore e che dipende strettamente dalla qualità del processo costruttivo e dalla qualità dei materiali impiegati.
Pertanto dopo un tempo tRCD è inviato al chip di memoria il comando di READ che contiene l’indirizzo di colonna e di banco. La lettura nelle memorie DDR SDRAM avviene in burst mode nel senso che con un unico comando di READ in effetti vengono lette più celle elementari di memoria (2, 4 oppure 8). Tra parametri impostabili per il funzionamento della memoria esiste un parametro detto Burst Lenght (nel bios DFI questo parametro è chiamato 32 byte granularity) che specifica proprio la lunghezza del burst da leggere.
C’è da dire che esistono due tipi di comandi di lettura:
• READ che consente di leggere da una riga di memoria lasciandola disponibile per successive operazioni;
• READ+AP (Auto Precharge) che alla fine dell’operazione di lettura, dopo che il burst di dati è stato trasferito, “chiude” la riga di memoria non consentendo di effettuare si di essa successive operazioni.
Dopo il commando di READ ( o READ+AP) la prima porzione di dati (detta anche chunk di dati) non è immediatamente disponibile sui pin di uscita del chip di memoria (DQ0-DQ7), ma diventa disponibile dopo un certo intervallo di tempo che è chiamato CAS# Latency (tCL). Pertanto il ritardo tra il comando di READ e la disponibilità della prima porzione dei dati è la CAS# Latency (tCL), le porzioni di dati successive alla prima sono disponibili in uscita senza ulteriori latenze.
Lo schema successivo rappresenta la sequenza temporale delle operazioni:



Dopo l’attivazione della riga (che non è mostrata nel diagramma) viene inviato il comando di READ con l’indirizzo di banco e di colonna (BA a, COL n), si aspettano 2.5 cicli di clock (= CAS Latency) dopodiché il burst di dati (4 porzioni o chunk presi dal banco a colonna n DOa-n) comincia ad essere disponibile sulle linee di uscita DQ. Sul diagramma è da notare che il burst di dati in uscita è sincronizzato con un altro segnale che viene detto DQS che serve a sincronizzare l’I/O di dati dal chip di memoria con il controller della memoria esterno. Più precisamente i dati in uscita (letti dalla memoria) sono allineati con i fronti (di salita e discesa) di questo segnale di clock, i dati in ingresso (scritti sulla memoria) sono centrati rispetto al segnale. Per i dati in uscita questo segnale è usato per “catturare” i dati.
Il tempo che intercorre tra il comando di READ e il primo fronte di salita del segnale DQS, corrispondente all’output del primo chunk del burst di dati in ingresso, è detto read preamble time (tDQSCK). In questo caso il read preable time è inglobato nella CAS latency e quindi non ha ulteriore impatto sull’operazione di lettura.


5.3. Scrittura in memoria

Per quanto detto i passi necessari per scrivere un elemento all’interno del chip di memoria sono i seguenti:
1) L’indirizzo di riga è inviato sui pin di indirizzo A0-A12 attraverso l’address bus;
2) Il pin che trasporta il segnale di RAS è attivato cosicché viene individuata la riga di memoria su cui scrivere il valore.
3) La riga è copiata nel buffer interno al chip.
4) Il segnale di Write Enable è attivato cosicché non sarà possibile leggere un dato sulla stessa riga mentre questa viene scritta.
5) L’indirizzo di colonna è inviato sui pin di indirizzo A0-A10 attraverso l’address bus.
6) E’ individuata nel buffer interno la cella elementare di memoria da scrivere.
7) Il segnale di CAS abilità l’input cosicché il valore presente sui pin di I/O DQ0-DQ7 viene scritto e quindi può aggiornare il contenuto della memoria.
8) I segnali di RAS e CAS sono disattivati così il ciclo può ricominciare.
Analogamente alla scrittura, seguendo lo schema logico precedente, dopo aver attivato una riga in un banco di memoria bisogna inviare l’indirizzo di colonna. Tra l’invio dell’indirizzo di riga e l’indirizzo di colonna è necessario aspettare il tempo minimo chiamato RAS#-to-CAS# Delay (tRCD). Pertanto dopo un tempo tRCD è inviato al chip di memoria il comando di WRITE che contiene l’indirizzo di colonna e di banco sul quale scrivere. Anche la scrittura nelle memorie DDR SDRAM avviene in burst mode nel senso che con un unico comando di WRITE vengono scritte più celle elementari di memoria (2, 4 oppure 8). Tra parametri impostabili per il funzionamento della memoria esiste un parametro detto Burst Lenght che specifica proprio la lunghezza del burst da scrivere.
Anche in questo caso esistono due comandi di scrittura:
• WRITE che consente di leggere da una riga di memoria lasciandola disponibile per successive operazioni;
• WRITE+AP (Auto Precharge) che alla fine dell’operazione di scrittura, dopo che il burst di dati è stato trasferito, “chiude” la riga di memoria non consentendo di effettuare si di essa successive operazioni.
Ci sono due differenze tra le operazioni di READ e WRITE:
• la prima porzione del dato da scrivere dovrà essere fornita contemporaneamente al comando di WRITE/WRITE+AP, al numero di banco e all’indirizzo di colonna. La successiva porzione di dato sarà inviata al successivo ciclo di clock e così via fino all’ultima porzione di dato il cui numero è specificato nel burst lenght;
• in questo caso, diventa di fondamentale importanza il Write Recovery Time (tWR), invcece della CAS# Latency (tCL). Questo valore rappresenta il minimo intervallo di tempo tra la ricezione dell’ultima porzione di dati da scrivere e la disponibilità della riga indirizzata ad essere “chiusa” con il comando di PRECHARGE. Ma qualora fosse necessario leggere dei dati dalla stessa riga “aperta” invece di chiuderla allora interviene un’altra latenza che è il tempo di Write-to-Read Delay (tWTR).
Lo schema successivo rappresenta la sequenza temporale delle operazioni che avvengono durante una scrittura in memoria. In particolare il diagramma si riferisce ad una scrittura seguita da una lettura sulla stessa riga di memoria ma su colonne diverse:



Dopo l’attivazione della riga (che non è mostrata in questo diagramma), viene dato il comando di WRITE assieme all’indirizzo del banco di memoria BAa e della colonna COLb. A questo punto al contrario della lettura che bisognava aspettare un tempo pari alla CAS Latency, bisogna aspettare il tempo necessario affinché il segnale DQS che sincronizza l’input sia nel fronte di salita. Il tempo che intercorre tra il comando di WRITE e il primo fronte di salita del segnale DQS, corrispondente all’input del primo chunk del burst di dati in ingresso, è detto write preamble time (tDQSS). Dopo aver aspettato questo tempo il burst di dati presente sui pin DQ (4 chunk nell’esempio) comincia ad essere scritto in memoria. Nel diagramma dei tempi si vede anche la presenza di un segnale DM che è detto Data Mask che nella scrittura è sincrono con il DQ.
Nel diagramma dei tempi si vede che dopo avere scritto i dati nella memoria prima di fare qualsiasi altre operazione sulla stessa riga di memoria bisogna attendere un tempo pari al Write-to-Read Delay (tWTR). Subito dopo nel diagramma di esempio è fatta un’operazione di READ sul banco BAa e sulla colonna COLn.

6. Latenze associate alle operazioni di interfaccia e alle operazioni di funzionamento

Le operazioni precedentemente viste si possono susseguire in un ordine qualsiasi durante il normale funzionamento di un computer e sono necessari per accedere la memoria e fare delle operazioni di lettura e di scrittura. Ci sono alcune operazioni che vengono fatte in memoria che non riguardano direttamente la lettura o la scrittura di un dato, ma riguardano operazioni necessarie per garantire il corretto funzionamento della RAM e per consentire ad essa di interfacciarsi con il controller che è il mezzo attraverso il quale la memoria comunica con il resto del sistema.
Il diagramma seguente riassume in maniera sintetica quelle che sono i possibili stati in cui si può trovare un modulo di memoria:



Per esempio è possibile specificare il Command Rate che può valere 1T oppure 2T e indica se i comandi vengono impartiti alla memoria ogni ciclo di clock oppure ogni due cicli di clock.
Inoltre come già visto la memoria SDRAM per conservare i dati memorizzati ha bisogno di un’operazione di refresh,tipicamente l’intera DRAM deve avere ogni riga refreshata almeno una volta ogni 64 ms (pena la perdita dei dati in essa memorizzati). Entrano in gioco due timings:
• Il Row Refresh Cycle Time (tRFC) (anche detto (Auto-Refresh-to-Active/Auto-Refresh Command Period) che rappresenta il tempo tra due successive comandi di auto refresh oppure self refresh. Dipende dalla dimensione del chip di memoria e dalla sua frequenza di funzionamento (per esempio valori tipici a 200 MhZ di frequenza sono 70 ns ovvero 14 colpi di clock per chip a 512Mbit o più piccoli e 120 ns ovvero 24 colpi di clock per chip a 1 Gbit).
• Il Refresh Period (tREF) che rappresenta il tempo medio tra due refresh sulla stessa riga di memoria che dipende dal numero di righe totali presenti nella memoria e sulla frequenza di clock. Tipicamente l’intero modulo di memoria deve avere ogni riga refreshata al massimo ogni 64 ms. Quindi per memorie aventi pagine di 4k il tREF è pari a 64ms/4096=15.6 µs medi per refreshare ciascuna riga, per memorie con pagine di 8k è richiesto un tempo medio di refresh delle righe di 7.8 µs, e per memorie con pagine 16k è richiesto un tempo medio di refresh delle righe di 3.9 µs.
Un altro tempo che impatta sulla banda della memoria è la Maximum Asynchronous Latency che va settata in funzione del round trip loop time tra il processore e la DIMM più lontana. Il round trip loop è influenzato dalla lunghezza delle tracce del circuito del bus utilizzate per raggiungere la DIMM, dal carico della memoria e dalla frequenza di funzionamento del bus. Quindi si capisce ce questo è una latenza che riguarda i diversi ritardi di propagazione dei segnali dovuti proprio ala geometria e alla progettazione della motherboard, dei moduli di memoria. Questo diverso ritardo di propagazione dei segnali si traduce in un non perfetto sincronismo tra il clock della memoria e il FSB, con tale parametro si imposta il massimo asincronismo tollerabile.
Sono presenti tutta una serie di settaggi che agiscono sul segnale DQS che come abbiamo visto è quello che sincronizza l’I/O dei dati del chip di memoria. Potrebbero nascere dei problemi quando si crea un ritardo tra il segnale DQS e il segnale vero e proprio di input/output dei dati DQ. Il fenomeno è ben descritto dal seguente schema:



Nel disegno soprastante si vede che c’e’ un piccolo slittamento tra il segnale DQ (che porta i dati di input(output) ed il segnale DQS. Questo ritardo è detto DQ-DQS Skew ed i parametri di funzionamento che consentono di correggerlo sono:
• il DQS Skew Control che specifica se attivare o meno al correzione di questo errore e se bisogna incrementare o decrementare il ritardo;
• il DQS Skew Value che specifica il valore entro il quale ricondurre la correzione.
Nel disegno sottostante si vede una situazione in cui il ritardo è stato corretto e i due segnali sono perfettamente sincronizzati. Il parametro DQ-DQS Skew è un parametro di funzionamento dei chip di memoria e viene specificato dal costruttore qual’è la massima deriva sopportabile dal chip di memoria (valori tipici sono 0,40-0,80 ns), in funzione della frequenza di lavoro e della qualità del processo produttivo e dei materiali impiegati. E’ ovvio che se tale deriva supera quella massima prevista per il chip di memoria in fase di progettazione allora ci potrebbero essere dei problemi.
Esistono altri due parametri che consentono di intervenire sui segnali DQ (linee dati in I/O dal chip di memoria) e DQS che è il segnale che serve a sincronizzare l’I/O con il bus dati del controller. In particolare questi parametri intervengono sull’intensità del segnale elettrico con il quale vengono generati questi segnali e sono i seguenti:
DRAM Drive Strength che permette di controllare la potenza del segnale DQS;
DRAM Data Drive Strength che permette di controllare la Potenza del segnale DQ.
Altri timings che riguardano il funzionamento del controller o meglio come il controller si inteerfaccia con i moduli di memoria sono:
Read/Write Queue Bypass Count che specifica il numero di volte che la più vecchia operazione accodata nel DCI (Device Control Interface) può essere bypassata prima che venga forzata la sua esecuzione.
Bypass Max specifica il numero di volte che la più vecchia operazione presente nel DCQ può essere bypassata prima che venga forzata la sua esecuzione.
Idle Cycle Limit specifica il numero Massimo di cicli di clock che passeranno prima di chiudere forzatamente una riga di memoria aperta.
Dynamic Idle Cycle Counter Enable quando settato ad 1 indica che ogni entry nella riga di memoria aggiusta dinamicamente l’Idle Cicle Limit secondo l’agoritmo basato sul Page Conflict/Page Miss. Cioè il contatore viene incrementato in corrispondenza di un evento di PM (Page Miss) ovvero quando viene richiesta una riga di memoria non aperta, e decrementato in corrispondenza di un evento di PC (Page Conflict) ovvero quando viene richiesta una riga che è in uno stato di idle (non aperta).


7. Osservazioni pratiche sui timings di memoria

Nei paragrafi precedenti abbiamo visto che il tempo minimo di disponibilità di una riga di memoria una volta attivata è dato dal tRAS, e tenendo conto che per leggere un valore devo aspettare un tempo minimo tRCD tra l’indirizzo di riga e colonna, un altro tempo minimo tCL tra l’indirizzo di colonna e la disponibilità della prima porzione di dati, avrò che

tRAS > tRCD + tCL
Inoltre visto che l’intero ciclo per leggere un burst di dati è dato dal tempo tRC e che il tempo necessario dall’attivazione all’uscita del primo chunk di dati è pari al massimo a tRAS e che per disattivare la riga avrò bisogno di un tempo pari al precharge tRP avrò che:
tRC= tRAS+ tRP
E’ da notare che di solito i tempi tRAS e tRC sono impostabili separatamente da BIOS allora potrebbe risultare qualche violazione delle equazioni prima descritte, e tuttavia non sarebbenulla di grave perché il controller di memoria aggiusterebbe autonomamente i valori tRAS e tRC per soddisfare le equazioni prima descritte.
Altra considerazione che si potrebbe fare è sul Refresh Period (tREF),infatti si è visto che dipende sostanzialmente dall’architettura dei chip di memoria e dalla frequenza di funzionamento, e quindi se si possiedono memorie che utilizzano dei chip di memoria che hanno un’architettura interna con 4 banchi di memoria e che funzionano a 200 MhZ, il valore del refresh andrebbe settato a 15.6 µs.

Sul settaggio dei vari timings di memoria si troverà materiale abbondante sui vari forum che parlano dell’argomento, lo scopo di questo tutorial era quello di cercare di far capire e applicare questi timings in maniera più “scientifica” e non affidandosi completamente a dei concetti spiegati senza capirne i motivi, o addirittura solamente accennati, quando addirittura non vengano inventati sulla base delle impressioni pratiche di funzionamento.