Fonctionnement d'un ordinateur/Les mémoires RAM dynamiques (DRAM)
Après avoir vu les mémoires statiques (SRAM), il est temps de passer aux mémoires RAM dynamiques, aussi appelées mémoires DRAM. Pour rappel, les DRAM dynamiques ont pour défaut que leurss données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes . En conséquence, il faut réécrire chaque bit de la mémoire régulièrement pour éviter qu'il ne s'efface. On dit qu'on doit effectuer régulièrement un rafraîchissement mémoire. Et celui-ci rend les DRAM très différentes des SRAM.
Les DRAM des PC ont beaucoup évolués dans le temps. Les toutes premières mémoires DRAM étaient des mémoires asynchrones, mais elles ont été remplacées par des modèles synchrones. Les modèles asynchrones ont été très nombreux. Après l'apparition des premières DRAM, les mémoires Fast Page Mode sont apparues, suivies par les mémoires Extended Data Out, puis les EDO en mode rafale. Elles ont été utilisées jusque dans la moitié des années 90, pour ensuite être supplantées par les mémoires SDRAM. Les mémoires DDR actuelles sont des améliorations des mémoires SDRAM actuelles.
Le fait est que les DRAM sont des mémoires électroniques comme les autres, qui se présentent sous la forme de circuits intégrés, à savoir que ce sont des petits boitiers noirs avec des broches. Il est possible de souder ces boitiers sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais il est aussi possible de regrouper plusieurs boitiers sur une barrette de RAM séparée. Dans ce qui suit, nous les appellerons des chips mémoire, ou encore, des puces mémoires.

Dans ce qui suit, nous allons étudier ces chips de DRAM, avant de voir comment ils sont regroupés sur une barrette de RAM. Puis, nous allons voire chaque type de mémoire, FPM, EDO, SDRAM, DDR, ... ; un par un.
L'interface des DRAM et le contrôleur mémoire
[modifier | modifier le wikicode]L'interface d'une mémoire DRAM est plus compliquée que l'interface d'une SRAM basique. Et c'est suffisant pour qu'on ait besoin d'un intermédiaire pour faire la conversion entre processeur et DRAM. Les DRAM modernes ne sont pas connectées directement au processeur, mais le sont par l'intermédiaire d'un contrôleur mémoire externe. Il ne faut pas le confondre avec le contrôleur mémoire interne, placé dans la mémoire RAM, et qui contient notamment le décodeur. Les deux sont totalement différents, bien que leur nom soit similaire. Pour éviter toute confusion, j'utiliserais le terme de contrôleur de DRAM, plus parlant.
Le contrôleur de DRAM gère le bus mémoire et tout ce qui est envoyé dessus. Il envoie des commandes aux barrettes de mémoire, commandes qui peuvent être des lectures, des écritures, ou des demandes de rafraichissement, parfois d'autres commandes. La mémoire répond à ces commandes par l'action adéquate : lire la donnée et la placer sur le bus de données pour une commande de lecture, par exemple. Le rôle du contrôleur de DRAM varie grandement suivant le contrôleur en question, ainsi que selon le type de DRAM.
Le bus d'adresse des DRAM est multiplexé
[modifier | modifier le wikicode]Un point important pour le contrôleur de DRAM est de transformer les adresses mémoires fournies par le processeur, en adresses utilisables par la DRAM. Car les DRAM ont une interface assez spécifique. Les DRAM ont ce qui s'appelle un bus d'adresse multiplexé. Avec de tels bus, l'adresse est envoyée en deux fois. Les bits de poids fort sont envoyés avant les bits de poids faible. On peut ainsi envoyer une adresse de 32 bits sur un bus d'adresse de 16 bits, par exemple. Le bus d'adresse contient alors environ moitié moins de fils que la normale.
Pour rappel, l'avantage de cette méthode est qu'elle permet de limiter le nombre de fils du bus d'adresse, ce qui très intéressant sur les mémoires de grande capacité. Les mémoires DRAM étant utilisées comme mémoire principale d'un ordinateur, elles devaient avoir une grande capacité. Cependant, avoir un petit nombre de broches sur les barrettes de mémoire est clairement important, ce qui impose d'utiliser des stratagèmes. Envoyer l'adresse en deux fois répond parfaitement à ce problème : cela permet d'avoir des adresses larges et donc des mémoires de forte capacité, avec une performance acceptable et peu de fils sur le bus d'adresse.
Les bus multiplexés se marient bien avec le fait que les DRAM sont des mémoires à adressage par coïncidence ou à tampon de ligne. Sur ces mémoires, l'adresse est découpée en deux : une adresse haute pour sélectionner la ligne, et une adresse basse qui sélectionne la colonne. L'adresse est envoyée en deux fois : la ligne, puis la colonne. Pour savoir si une donnée envoyée sur le bus d'adresse est une adresse de ligne ou de colonne, le bus de commande de ces mémoires contenait deux fils bien particuliers : les RAS et le CAS. Pour simplifier, le signal RAS permettait de sélectionner une ligne, et le signal CAS permettait de sélectionner une colonne.

Si on a deux bits RAS et CAS, c'est parce que la mémoire prend en compte les signaux RAS et CAS quand ils passent de 1 à 0. C'est à ce moment là que la ligne ou colonne dont l'adresse est sur le bus sera sélectionnée. Tant que des signaux sont à zéro, la ligne ou colonne reste sélectionnée : on peut changer l'adresse sur le bus, cela ne désélectionnera pas la ligne ou la colonne et la valeur présente lors du front descendant est conservée.

Le rafraichissement mémoire
[modifier | modifier le wikicode]La spécificité des DRAM est qu'elles doivent être rafraichies régulièrement, sans quoi leurs cellules perdent leurs données. Le rafraichissement est basiquement une lecture camouflée. Elle lit les cellules mémoires, mais n'envoie pas le contenu lu sur le bus de données. Rappelons que la lecture sur une DRAM est destructive, à savoir qu'elle vide la cellule mémoire, mais que le système d'amplification de lecture régénère le contenu de la cellule automatiquement. La cellule est donc rafraichie automatiquement lors d'une lecture.
La quasi-totalité des DRAM supporte des commandes de rafraichissement, séparées des lectures et écritures classiques. Une commande de rafraichissement ordonne de rafraichir une adresse, voire une ligne complète. Les commandes de rafraichissement sont générées par le contrôleur de DRAM, dans la grosse majorité des cas. Il est aussi possible que ce soit le processeur qui les génère, mais c'est beaucoup plus rare.
Il est aussi possible d'envoyer des commandes de rafraichissement vides, qui ne précisent ni adresse ni numéro de ligne. Pour les gérer, la mémoire contient un compteur, qui pointe sur la prochaine ligne à rafraichir, qui est incrémenté à chaque commande de rafraichissement. Une commande de rafraichissement indique à la mémoire d'utiliser l'adresse dans ce compteur pour savoir quelle adresse/ligne rafraichir.

Il existe des mémoires qui sont des intermédiaires entre les mémoires SRAM et DRAM. Il s'agit des mémoires pseudo-statiques, qui sont techniquement des mémoires DRAM, utilisant des transistors et des condensateurs, mais qui gèrent leur rafraichissement mémoire toutes seules. Le rafraichissement mémoire est alors totalement automatique, ni le processeur, ni le contrôleur de DRAM ne devant s'en charger. Le rafraichissement est purement le fait des circuits de la mémoire RAM et devient une simple opération de maintenance interne, gérée par la RAM elle-même.
L'envoi des commandes de rafraichissement peuvent se faire de deux manières : soit on les envoie toutes en même temps, soit on les disperse le plus possible. Le premier cas est un rafraichissement en rafale, le second un rafraichissement étalé. Le rafraichissement en rafale n'est pas utilisé dans les PC, car il bloque la mémoire pendant un temps assez long. Mais les anciennes consoles de jeu gagnaient parfois à utiliser eu rafraichissement en rafale. En effet, la mémoire était souvent effacée entre l'affichage de deux images, pour éviter certains problèmes dont on ne parlera pas ici. Le rafraichissement de la mémoire était effectué à ce moment là : l'effacement rafraichissait la mémoire.
Le temps mis pour rafraichir la mémoire est le temps mis pour parcourir toute la mémoire. Il s'agit du temps de balayage vu dans le chapitre sur les performances d'un ordinateur. Pour les mémoires FPM et EDO, il est défini en divisant la capacité de la mémoire par son débit binaire. C'est le temps nécessaire pour lire ou réécrire tout le contenu de la mémoire. Sur les SDRAM, les choses sont un peu différentes, pour une raison qu'on expliquera plus bas.
Les rangées : l'arrangement horizontal et vertical
[modifier | modifier le wikicode]Il est rare d'utiliser un chip mémoire seul, car ceux-ci n'ont pas une capacité suffisante. Pour donner quelques chiffres, à l'heure où j'écris ces lignes, la norme pour un ordinateur est d'avoir entre 8 et 64 gibioctets de RAM. Mais les chips mémoire font entre 1 et 4 gibioctets, rarement plus. La raison est que les ordinateurs combinent ensemble plusieurs chips mémoire pour additionner leurs capacités.
La concaténation de plusieurs chips mémoire peut se faire de deux manières différentes, appelées l'arrangement horizontal et l'arrangement vertical. Les deux additionnent la capacité des chips mémoire, mais se distinguent sur un point : ce qui arrive respectivement au bus de données, et au nombre d'adresses. Intuitivement, on se dit que doubler la capacité mémoire implique de doubler le nombre d'adresses mémoire. C'est effectivement ce qui se passe avec l'arrangement vertical. Mais avec l'arrangement horizontal, le nombre d'adresse ne varie pas. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul.
L'arrangement vertical : cumuler des adresses mémoire
[modifier | modifier le wikicode]Introduisons l'arrangement vertical par un exemple. Imaginez que je souhaite obtenir de 4 mébioctets de RAM, en combinant 4 chips mémoires de 1 mébioctet chacun. L'idée est que le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. Des adresses consécutives se trouvent ainsi dans le même chip mémoire, sauf pour quelques adresses où on passe d'un chip à l'autre. Avec cette organisation, le bus de donnée fait un octet, et les chips mémoire ont aussi un bus de données d'un octet. Je peux alors combiner les capacités de plusieurs chips mémoire, sans toucher au bus de données.

Pour sélectionner le chip mémoire adéquat, il faut que chaque chip mémoire dispose d'une entrée Chip Select, qui permet de l'activer ou de le désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Les signaux Chip Select sont générés par le contrôleur de DRAM, à partir de l'adresse. On dit qu'il y a un décodage d'adresse.
Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Les adresses mémoire sont alors découpées comme suit :
| Adresse de banque | Adresse dans la banque |
|---|---|
| Quelques bits de poids fort | Reste de l'adresse |
L'arrangement horizontal : élargir le bus de données
[modifier | modifier le wikicode]L'arrangement horizontal permet lui aussi d'additionner les capacités mémoire de plusieurs chips mémoire. Cependant, il les combine d'une autre manière. Le nombre d'adresses mémoire n'est pas changé en utilisant plusieurs chips, mais le bus de données est élargi. Le mieux pour comprendre l'idée est de partir d'un exemple, et nous allons prendre celui d'une mémoire SDRAM.
Les ordinateurs actuels ont un bus de données de 64 bits (on met de côté le cas du double ou triple canal). Cependant, il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM/DDR ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. L'arrangement horizontal résout ce problème en combinant plusieurs chips mémoire de manière à ce que leurs bus de données s'"additionnent", se concatènent. Par exemple, on peut regrouper 8 chips mémoires de 8 bits, obtenir un bus mémoire de 64 bits. Il est aussi possible d'obtenir ces 64 bits avec des puces de 16 chips mémoire de 4 bits, ou 4 chips mémoire de 16 bits.

Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse. Vu que les chips mémoires contiennent tous une partie de la donnée demandée, ils doivent tous être activés en même temps. Pour cela, l'adresse à lire est envoyée à tous les chips mémoire d'un même rank, idem pour les signaux de commande. Un ensemble de N chips reliés de cette manière forme une rangée (le terme anglais est rank).

L'arrangement horizontal et vertical combinés
[modifier | modifier le wikicode]Nous venons de voir l'arrangement vertical et horizontal, pour ce qui est des barrettes de mémoire. Précisons que ce qui vient d'être dit marche aussi bien pour les barrettes de RAM que pour la mémoire soudée sur la carte mère. Du moment qu'on combine plusieurs chips mémoire ensemble, ces concepts restent valides. Et il en est de même pour la suite, encore que ce soit nettement moins fréquent avec de la mémoire soudée.
Il est possible de combiner à la fois l'arrangement vertical et l'arrangement horizontal. Rien de plus simple : il suffit d'utiliser un arrangement vertical entre plusieurs rangées, chacun composée de plusieurs chips mémoire. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 rangées, rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux rangées de 64 bits chacun, chaque rangée regroupant 8 chips.

Le choix entre la première ou la seconde rangée se fait en configurant les bits Chip Select de chaque rangée. Il faut noter que les bits de Chip Select sont générés par le contrôleur mémoire, et envoyés sur le bus de commande.

Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un contrôleur de DRAM supportant maximum 8 rangées. Avec 4 barrettes contenant 4 rangées chacune, la limite est dépassée.
- Il faut noter que tout ce qui vient d'être dit vaut aussi pour les mémoires ROM et SRAM. Mais en pratique, les arrangements verticaux et horizontaux sont surtout utilisés sur les mémoires DRAM. Il faut dire que de tels arrangements servent à augmenter la capacité mémoire, ce qui colle plus avec des DRAM que des SRAM ou des ROM.
Les barrettes de mémoire DRAM
[modifier | modifier le wikicode]
Il est possible de souder plusieurs boitiers de DRAM sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais dans les PC fixes, les puces de DRAM sont regroupées sur des barrettes mémoires'. Les barrettes de mémoire se fixent à la carte mère sur un connecteur standardisé, appelé slot mémoire. Le dessin ci-contre montre une barrette de mémoire, celui-ci ci-dessous est celui d'un slot mémoire.

Sur le schéma de droite, on remarque facilement les boitiers de DRAM, rectangulaires, de couleur sombre. Chaque barrette combine ces puces de manière à additionner leurs capacités : on peut ainsi créer une mémoire de 8 gibioctets à partir de 8 puces d'un gibioctet, par exemple. Ils sont soudés sur un PCB en plastique vert sur lequel sont gravés des connexions métalliques.
Les trucs dorés situés en bas des barrettes de mémoire sont des broches qui connectent la barrette au bus mémoire. Les barrettes des mémoires FPM/EDO/SDRAM/DDR n'ont pas le même nombre de broches, pour des raisons de compatibilité.
| Type de barrette | Type de mémoire | Nombre de broches |
|---|---|---|
| SIMM | FPM/EDO | 30 |
| 72 | ||
| DIMM | SDRAM | 168 |
| DDR | 184 | |
| DDR2 | 214, 240 ou 244, suivant la barrette ou la carte mère. | |
| DDR3 | 204 ou 240, suivant la barrette ou la carte mère. |
Le format des barrettes de mémoire
[modifier | modifier le wikicode]Certaines barrettes ont des puces mémoire d'un seul côté alors que d'autres en ont sur les deux faces. Cela permet de distinguer les barrettes SIMM et DIMM.
- Les barrettes SIMM ont des puces sur une seule face de la barrette. Elles étaient utilisées pour les mémoires FPM et EDO-RAM.
- Les barrettes DIMM ont des puces sur les deux côtés. Elles sont utilisées sur les SDRAM et les DDR.
- Les modules DIMM tendent à avoir plus de rangées que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux rangées, contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux.
Les barrettes SO-DIMM, pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM. La raison est qu'il n'y a pas beaucoup de place à l'intérieur d'un PC portable, ce qui demande de diminuer la taille des barrettes.
Les barrettes de Rambus ont parfois été appelées des barrettes RB-DIMM, mais ce sont en réalité des DIMM comme les autres. La différence principale est que la position des broches n'était pas la même que celle des formats DIMM normaux, sans compter que le connecteur Rambus n'était pas compatible avec les connecteurs SDR/DDR normaux.
Les interconnexions à l'intérieur d'une barrette de mémoire
[modifier | modifier le wikicode]Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces d'une même rangée sont connectées aux bus d'adresse et de commande. Et les chips d'une même rangée reçoivent exactement les mêmes signaux de commande/adresses, ce qui permet d'envoyer la même adresse/commande à toutes les puces en même temps. La manière dont ces puces sont reliées au bus de commande dépend selon la mémoire utilisée.
Les DDR1 et 2 utilisent ce qu'on appelle une topologie en T, illustrée ci-dessous. On voit que le bus de commande forme une sorte d'arbre, dont chaque extrémité est connectée à une puce. La topologie en T permet d'égaliser le délai de transmission des commandes à travers le bus : la commande transmise arrive en même temps sur toutes les puces. Mais elle a de nombreux défauts, à savoir : elle fonctionne mal à haute fréquence, elle est difficile à router en raisons des embranchements.

En comparaison, les DDR3 utilisent une topologie fly-by, où les puces sont connectées en série sur le bus de commande/adresse. La topologie fly-by n'a pas les problèmes de la topologie en T : elle est simple à router et fonctionne très bien à haute fréquence.

Les barrettes tamponnées (à registres)
[modifier | modifier le wikicode]Certaines barrettes intègrent un registre tampon, qui fait l'interface entre le bus et la barrette de RAM. L'utilité est d'améliorer la transmission du signal sur le bus mémoire. Sans ce registre, les signaux électriques doivent traverser le bus, puis traverser les connexions à l'intérieur de la barrette, jusqu'aux puces de mémoire. Avec un registre tampon, les signaux traversent le bus, sont mémorisés dans le registre et c'est tout. Le registre envoie les commandes/données jusqu'aux puces mémoire, mais le signal a été régénéré par le registre. Le signal transmis est donc de meilleure qualité, ce qui augmente la fiabilité du système mémoire. Le défaut est que la présence de ce registre fait que les barrettes ont un temps de latence est plus important que celui des barrettes normales, du fait de la latence du registre.
Les barrettes de ce genre sont appelées des barrettes RIMM. Il en existe deux types :
- Avec les barrettes RDIMM, le registre fait l'interface pour le bus d'adresse et le bus de commande, mais pas pour le bus de données.
- Avec les barrettes LRDIMM (Load Reduced DIMMs), le registre fait tampon pour tous les bus, y compris le bus de données.

Le Serial Presence Detect
[modifier | modifier le wikicode]
Toute barrette de mémoire assez récente contient une petite mémoire ROM qui stocke les différentes informations sur la mémoire : délais mémoire, capacité, marque, etc. Cette mémoire s'appelle le Serial Presence Detect, aussi communément appelé le SPD. Ce SPD contient non seulement les timings de la mémoire RAM, mais aussi diverses informations, comme le numéro de série de la barrette, sa marque, et diverses informations. Le SPD est lu au démarrage de l'ordinateur par le BIOS, afin de pourvoir configurer ce qu'il faut.
Le contenu de ce fameux SPD est standardisé par un organisme nommé le JEDEC, qui s'est chargé de standardiser le contenu de cette mémoire, ainsi que les fréquences, timings, tensions et autres paramètres des mémoires SDRAM et DDR. Pour les curieux, vous pouvez lire la page wikipédia sur le SPD, qui donne son contenu pour les mémoires SDR et DDR : Serial Presence Detect.
Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM
[modifier | modifier le wikicode]Avant l'invention des mémoires SDRAM et DDR, il exista un grand nombre de mémoires différentes, les plus connues étant les mémoires fast page mode et EDO-RAM. Ces mémoires n'étaient pas synchronisées par un signal d'horloge, c'était des mémoires asynchrones. Quand ces mémoires ont été créées, cela ne posait aucun problème : les accès mémoire étaient très rapides et le processeur était certain que la mémoire aurait déjà fini sa lecture ou écriture au cycle suivant. Les mémoires asynchrones les plus connues étaient les mémoires FPM et mémoires EDO.
Pour ce qui est de leur interface, il faut signaler qu'elles n'ont pas d'entrée Chip Select ou d'entrée Output Enable. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de Chip Select, le bit CAS fait office d'Output Enable.
Les mémoires FPM
[modifier | modifier le wikicode]Les mémoires FPM (Fast Page Mode) possédaient une petite amélioration, qui rendait l'adressage plus simple. Avec elles, il n'y a pas besoin de préciser deux fois la ligne si celle-ci ne changeait pas lors de deux accès consécutifs : on pouvait garder la ligne sélectionnée durant plusieurs accès. Par contre, il faut quand même préciser les adresses de colonnes à chaque changement d'adresse.
Il existe une petite différence entre les mémoire Page Mode et les mémoires Fast-Page Mode proprement dit. Sur les premières, le signal CAS est censé passer à 0 avant qu'on fournisse l'adresse de colonne. Avec les Fast-Page Mode, l'adresse de colonne pouvait être fournie avant que l'on configure le signal CAS. Cela faisait gagner un petit peu de temps, en réduisant quelque peu le temps d'accès total.

Avec les mémoires en mode quartet, il est possible de lire quatre octets consécutifs sans avoir à préciser la ligne ou la colonne à chaque accès. On envoie l'adresse de ligne et l'adresse de colonne pour le premier accès, mais les accès suivants sont fait automatiquement. La seule contrainte est que l'on doit générer un front descendant sur le signal CAS pour passer à l'adresse suivante. Vous aurez noté la ressemblance avec le mode rafale vu il y a quelques chapitres, mais il y a une différence notable : le mode rafale vrai n'aurait pas besoin qu'on précise quand passer à l'adresse suivante avec le signal CAS.

Les mémoires FPM à colonne statique se passent même du signal CAS. Le changement de l'adresse de colonne est détecté automatiquement par la mémoire et suffit pour passer à la colonne suivante. Dans ces conditions, un délai supplémentaire a fait son apparition : le temps minimum entre deux sélections de deux colonnes différentes, appelé tCAS-to-CAS.

Les mémoires EDO-RAM
[modifier | modifier le wikicode]L'EDO-RAM a été inventée quelques années après la mémoire FPM. Elle a été déclinée en deux versions : la EDO simple, et la EDO en rafale. L'EDO simple ajoutait une entrée Ouput Enable à une mémoire FPM. Pour rappel, l'entrée Ouput Enable permet de connecter/déconnecter la DRAM du bus de données. S'il est mis à 0, les lectures et écritures sont empêchées.
Pour ajouter cette entrée, il a fallu rajouter un registre sur la sortie de donnée, celle qui sert pour les lectures. Et l'ajout de ce registre a introduit une capacité dite de pipelining, sur le même modèle que pour les mémoires SRAM synchrones. La donnée pouvait être maintenue sur le bus de données durant un certain temps, même après la remontée du signal CAS. Le registre de sortie maintenait la donnée lu tant que le signal RAS restait à 0, et tant qu'un nouveau signal CAS n'a pas été envoyé. Faire remonter le signal CAS à 1 n'invalidait pas la donnée en sortie.
La conséquence est qu'on pouvait démarrer une nouvelle lecture alors que la donnée de l'accès précédent était encore présent sur le bus de données. Le pipeline obtenu avait deux étages : un où on présentait l'adresse et sélectionnait la colonne, un autre où la donnée était lue depuis le registre de sortie. Les mémoires EDO étaient donc plus rapides.

Cependant, cela marchait surtout pour les lectures, pas pour les écritures. Une écriture ne démarre que quand la lecture ou écriture précédente est totalement terminée. De même, on ne peut pas démarrer un nouvel accès mémoire tant qu'une écriture est en cours.
Les mémoires EDO-RAM avec mode rafale
[modifier | modifier le wikicode]Les EDO en rafale effectuent les accès à 4 octets consécutifs automatiquement : il suffit d'adresser le premier octet à lire. Les 4 octets étaient envoyés sur le bus les uns après les autres, au rythme d'un par cycle d’horloge : ce genre d'accès mémoire s'appelle un accès en rafale.

Implémenter cette technique nécessite d'ajouter un compteur, capable de faire passer d'une colonne à une autre quand on lui demande, et quelques circuits annexes pour commander le tout.

Le rafraichissement mémoire
[modifier | modifier le wikicode]Les mémoires FPM et EDO doivent être rafraichies régulièrement. Au début, le rafraichissement se faisait ligne par ligne. Le rafraichissement avait lieu quand le RAS passait à l'état haut, alors que le CAS restait à l'état bas. Le processeur, ou le contrôleur mémoire, sélectionnait la ligne à rafraichir en fournissant son adresse mémoire. D'où le nom de rafraichissement par adresse qui est donné à cette méthode de commande du rafraichissement mémoire.
Divers processeurs implémentaient de quoi faciliter le rafraichissement par adresse. Par exemple, le Zilog Z80 contenait un compteur de ligne, un registre qui contenait le numéro de la prochaine ligne à rafraichir. Il était incrémenté à chaque rafraichissement mémoire, automatiquement, par le processeur lui-même. Un timer interne permettait de savoir quand rafraichir la mémoire : quand ce timer atteignait 0, une commande de rafraichissement était envoyée à la mémoire, et le timer était reset.

Par la suite, certaines mémoires ont implémenté un compteur interne d'adresse, pour déterminer la prochaine adresse à rafraichir sans la préciser sur le bus d'adresse. Le déclenchement du rafraichissement se faisait toujours par une commande externe, provenant du contrôleur de DRAM ou du processeur. Cette commande faisait passer le CAS à 0 avant le RAS. Cette méthode de rafraichissement se nomme rafraichissement interne.

On peut noter qu'il est possible de déclencher plusieurs rafraichissements à la suite en laissant le signal CAS dans le même état. Ce genre de choses pouvait avoir lieu après une lecture : on pouvait profiter du fait que le CAS soit mis à zéro par la lecture ou l'écriture pour ensuite effectuer des rafraichissements en touchant au signal RAS. Dans cette situation, la donnée lue était maintenue sur la sortie durant les différents rafraichissements.

Les mémoires SDRAM
[modifier | modifier le wikicode]Dans les années 90, les mémoires asynchrones ont laissé la place aux mémoires SDRAM, qui sont synchronisées avec le bus par une horloge. L'utilisation d'une horloge a comme avantage des temps d'accès fixes : le processeur sait qu'un accès mémoire prendra un nombre déterminé de cycles d'horloge. Avec les mémoires asynchrones, le processeur ne pouvait pas prévoir quand la donnée serait disponible et ne faisait rien tant que la mémoire n'avait pas répondu : il exécutait ce qu'on appelle des wait states en attendant que la mémoire ait fini.
Les mémoires SDRAM sont standardisées par un organisme international, le JEDEC. Le standard SDRAM impose des spécifications électriques bien précise pour les barrettes de mémoire et le bus mémoire, décrit le protocole utilisé pour communiquer avec les barrettes de mémoire, et bien d'autres choses encore. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous :
| Nom standard | Fréquence | Bande passante |
|---|---|---|
| PC66 | 66 mhz | 528 Mio/s |
| PC66 | 100 mhz | 800 Mio/s |
| PC66 | 133 mhz | 1064 Mio/s |
| PC66 | 150 mhz | 1200 Mio/s |
Les banques internes aux chips mémoires SDRAM
[modifier | modifier le wikicode]L'intérieur d'une mémoire SDRAM contient plusieurs banques, aussi appelées des banc mémoire. Concrètement, une banque est... une mémoire. Ou plutôt, une sorte de mini-mémoire miniature. Chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré.

Un point important est que chaque banque a son propre tampon de ligne. Il est donc possible d'ouvrir plusieurs lignes en même temps, chacune dans une banque différente. Par exemple, on peut ouvrir une ligne dans la banque numéro 1, et une autre ligne dans la banque numéro 2. Et c'est une source d'optimisations très intéressantes. La première optimisation est liée au rafraichissement mémoire. Au lieu de rafraichir chaque adresse une par une, il est possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques. C'est ce que je sous-entendais plus haut quand je disais que le temps de rafraichissement n'est pas égal au temps de balayage sur les SDRAM, alors que c'est le cas sur les DRAM FPM et EDO.
De plus, et sans rentrer dans les détails, cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur, car cette histoire d'accès simultanés a plus sa place dans le chapitre sur le parallélisme mémoire. Pour le moment, nous ne pouvons pas expliquer pourquoi ni comment un processeur pourrait émettre plusieurs accès mémoire simultanés. Un processeur est censé travailler une instruction à la fois, à ce stade du cours, il ne peut pas en faire plusieurs en même temps.
Mais nous allons cependant mentionner un cas où cette possibilité est intéressante : une mémoire SDRAM partagée entre un processeur et une carte graphique. Les deux accèdent à des données séparées, qui sont dans des banques différentes. On suppose que la carte graphique accède plus fréquemment à la mémoire que le processeur. Le contrôleur mémoire reçoit les accès mémoire du CPU et du GPU et il tente d'intercaler des accès CPU entre deux accès de la carte graphique. Vu qu'ils tombent dans des banques différentes, un accès CPU et un accès carte graphique peuvent se faire presque en même temps. La seule contrainte est que si on lance plusieurs accès mémoire simultanés, ceux-ci ne peuvent pas utiliser le bus de données en même temps.
| Cycle 1 | Cycle 2 | Cycle 3 | Cycle 4 | Cycle 5 | Cycle 6 | Cycle 7 | Cycle 8 | Cycle 9 | Cycle 10 | Cycle 11 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Banque Numéro 1 | |||||||||||
| Banque Numéro 2 | Accès CPU | Accès CPU | |||||||||
| Banque Numéro 3 | |||||||||||
| Banque Numéro 4 | Accès carte graphique | Accès carte graphique | |||||||||
Le mode rafale des SDRAM
[modifier | modifier le wikicode]Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Elles utilisent aussi un tampon de ligne, avec la possibilité de lire plusieurs colonnes à la suite sans avoir à préciser l'adresse de ligne à chaque fois. Mais surtout, elles gèrent nativement le mode rafale.
les paramètres qui ont trait au mode rafale sont configurables. Il est possible de configurer la SDRAM pour activer les accès sans rafale, ou les désactiver. Il y a aussi la possibilité de configurer le nombre d'octets consécutifs à lire ou écrire en mode rafale. On peut ainsi accéder à 1, 2, 4, ou 8 octets en une seule fois, alors que les EDO ne permettaient que des accès à 4 octets consécutifs. Enfin, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé.
La configuration de la SDRAM est mémorisée dans un registre de 10 bits, le registre de mode. Il faisait 10 bits sur les mémoires SDRAM, mais a été étendu à 13 bits sur la DDR2. Voici les 10 bits originels de ce registre :
| Bit n°9 | Type d'accès : en rafale ou normal |
|---|---|
| Bit n°8 et 7 | Doivent valoir 00, sont réservés pour une utilisation ultérieur dans de futurs standards. |
| Bit n°6, 5, et 4 | Latence CAS (voir plus bas) |
| Bit n°3 | Type de rafale : linéaire ou entrelacée |
| Bit n°2, 3, et 0 | Longueur de la rafale : indique le nombre d'octets à lire/écrire lors d'une rafale. |
L'interface d'une mémoire SDRAM
[modifier | modifier le wikicode]Le bus de commandes d'une SDRAM contient au moins 18 fils, dont celui pour le signal d'horloge. L'interface d'une SDRAM contient tous les bits présents sur une mémoire DRAM classique : une entrée RAS, une entrée CAS, une entrée R/W, et un bus d'adresse. A cela, il faut cependant ajouter une entrée Chip Select (CS), qui permet d'activer/désactiver la mémoire SDRAM. Je rappelle que le bit CS a été introduit sur les mémoires SDRAM, il n'était pas présent sur les mémoires FPM/EDO.
Deux autres bits de commande sont vraiment spécifiques des mémoires SDRAM. Il s'agit des bits CKE et DQM. Le bit CKE est l'abréviation de Clock Enable, qui qui trahit sa fonction. Lorsque ce signal est à 0, le chip de SDRAM voit son signal d'horloge gelè. S'il est à 0, le contrôleur de DRAM peut envoyer ce qu'il veut sur le bus de commande ou d'adresse, la SDRAM ne réagira pas du tout, il ne se passera rien.
Le bit DQM est une sorte de bit Output Enable, avec une nuance importante. Le terme DQM est l'abréviation de Data Mask, ce qui trahit encore une fois sa fonction. Il y a un bit DQM pour chaque octet du bus de données. Une SDRAM ayant un bus de 64 bits, cela fait 8 bits DQM par mémoire SDRAM. Lorsque le bit DQM est à 1, l'octet en question n'est simplement pas lu ou écrit, le bus de donnée est déconnecté pour cet octet.
Le bus d'adresse est particulier, car il tient compte de la présence de banques mémoires. Le bus d'adresse est découpé en deux portions : une portion pour sélectionner la banque, une autre pour sélectionner l'adresse à l'intérieur d'une banque. L'interface de la SDRAM fait ainsi la différence entre une adresse de banque et une adresse intra-banque. L'adresse de banque est codée sur quelques bits, généralement deux ou trois suivant la SDRAM. Le reste de l'adresse est codé sur 11 bits sur les SDRAM, mais cela a augmenté avec les DDR 1, 2, 3, 4, 5.
Le bus de données d'une SDRAM fait 4, 8, ou 16 bits. Je précise bien qu'il s'agit là des puces de SDRAM, les barrettes de SDRAM combinent plusieurs puces SDRAM avec un arrangement horizontal, qui peut combiner plusieurs puces de 8 bits pour alimenter un bus de données de 64 bits. La taille des puces utilisées souvent indiquée sur la barrette de RAM, avec une mention x4, x8 ou x16. Les puces de SDRAM les plus courantes ont une interface de 8 bits pour les données. Les SDRAM de 4 bits sont surtout utilisées pour les serveurs, c'est lié au support de l'ECC. les puces x16 sont moins utilisées car elles ont généralement moins de banques que les autres.
Les commandes SDRAM
[modifier | modifier le wikicode]Le bus de commande permet d'envoyer des commandes à la mémoire, chaque commande étant précisée par une combinaison précise des bits CS, RAS, CAS, R/W, et autres. Les commandes en question sont des demandes de lecture, d'écriture, de préchargement et autres. Elles sont codées par une valeur bien précise qui est envoyée sur les 18 fils du bus de commande. Ces commandes sont nommées READ, READA, WRITE, WRITEA, PRECHARGE, ACT, ...
Les plus importantes sont les commandes PRECHARGE, ACT et READ/WRITE. La commande ACT sélectionne une ligne : elle met le bit RAS à zéro et présente une adresse de ligne. Les commandes READ et WRITE sélectionnent une colonne, et déclenchent respectivement une lecture ou une écriture. Elles précisent une adresse de colonne, mettent le bit CAS à 0 et le bit RAS à 1, et précise la valeur du bit R/W. Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes, ce qui permet d'implémenter les optimisations des mémoires FPM.
La commande PRECHARGE ferme la ligne courante et prépare l'ouverture de la suivante. Elle précharge les lignes de bit de la RAM, d'où son nom. Il est nécessaire d'en envoyer une avant d'envoyer une commande ACT. Notons que la commande PRECHARGE agit sur une banque, dont l'adresse est indiquée dans la commande PRECHARGE. Il existe une commande PRECHARGE ALL, qui agit sur toutes les banques de la SDRAM à la fois. Elle est souvent utilisée de concert avec la commande de rafraichissement, car le rafraichissement mémoire rafraichit une ligne dans toutes les banques à la fois. Il faut donc fermer toutes les lignes ouvertes, dans chaque banque, ce que fait la commande PRECHARGE ALL.
Les commandes READA et WRITEA fusionnent une commande READ/WRITE avec une commande PRECHARGE. Elles permettent d'éviter d'avoir à envoyer une commande PRECHARGE pour fermer la ligne courante. Au lieu d'envoyer une commande READ ou WRITE, puis une commande PRECHARGE pour fermer la ligne, on envoie une seule commande READA/WRITEA. Il s'agit d'une petite optimisation, qui permet de réduire le nombre de commandes envoyées sur le bus.
Les commandes sont encodées comme indiquées dans ce tableau. Une commande est tout simplement encodée en précisant une adresse si nécessaire, et une combinaison des bits CS, RAS, CAS et R/W. La seule subtilité est que le bit numéro 10 du bus d'adresse sert à commander les opérations de PRECHARGE, y compris celles implicites dans les opérations READA et WRITEA.
| Bit CS | Bit RAS | Bit CAS | Bit WE | Bits de sélection de banque (2 bits) | Bit du bus d'adresse A10 | Reste du bus d'adresse | Nom de la commande : Description |
|---|---|---|---|---|---|---|---|
| 1 | X | Absence de commandes. | |||||
| 0 | 1 | 1 | 1 | X | No Operation : Pas d'opération | ||
| 0 | 1 | 1 | 0 | X | Burst Terminante : Stoppe un accès en rafale (en cours). | ||
| 0 | 1 | 0 | 1 | Adresse de la banque | 0 | Adresse de la colonne | READ : lit une donnée depuis la ligne active. |
| 0 | 1 | 0 | 1 | Adresse de la banque | 1 | Adresse de la colonne | READA : lit une donnée depuis la ligne active, puis ferme la ligne. |
| 0 | 1 | 0 | 0 | Adresse de la banque | 0 | Adresse de la colonne | WRITE : écrit une donnée dans la ligne active. |
| 0 | 1 | 0 | 0 | Adresse de la banque | 1 | Adresse de la colonne | WRITEA : écrit une donnée dans la ligne active, puis ferme la ligne. |
| 0 | 0 | 1 | 1 | Adresse de la banque | Adresse de la ligne | ACT : charge une ligne dans le tampon de ligne. | |
| 0 | 0 | 1 | 0 | Adresse de la banque | 0 | X | PRECHARGE : précharge le tampon de ligne dans la banque voulue. |
| 0 | 0 | 1 | 0 | Adresse de la X | 1 | X | PRECHARGE ALL : précharge le tampon de ligne dans toutes les banques. |
| 0 | 0 | 0 | 1 | X | Auto refresh : Demande de rafraichissement, gérée par la SDRAM. | ||
| 0 | 0 | 0 | 0 | 00 | Nouveau contenu du registre de mode | LOAD MODE REGISTER : configure le registre de mode. | |
Les commandes ACT se font à partir de l'état de repos, l'état où toutes les banques sont préchargées. Par contre, les commandes MODE REGISTER SET et AUTO REFRESH ne peuvent se faire que si toutes les banques sont désactivées.
Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme :

Les délais mémoires
[modifier | modifier le wikicode]Les mémoires SDRAM n'étant pas infiniment rapides, il y a toujours un certain délais à respecter entre deux commandes. Par exemple, quand on envoie une commande ACT pour activer une ligne, on ne peut pas envoyer une commande READ/WRITE au cycle suivant. La plupart des SDRAM ne sont pas assez rapides pour ça. Il faut respecter un délai de quelques cycles, qui dépend de la mémoire. Et il n'y a pas que ce délai entre une commande ACT et la commande suivante. Une SDRAM doit gérer d'autres temps d'attente, appelés des délais mémoires, ou encore des timings mémoire.
Les délais mémoire le plus importants sont résumés ci-dessous :
| Timing | Description |
|---|---|
| Délais primaires | |
| tRP | Temps entre une commande PRECHARGE et une commande ACT |
| tRCD | Temps entre une commande ACT et une commande READ/WRITE. |
| tCL | Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données. |
| tDQSS | Temps entre une commande WRITE et l'écriture de la donnée. |
| tCAS-to-CAS | Temps minimum entre deux commandes READ. |
| Délais secondaires | |
| tWTR | Temps entre une lecture et une écriture consécutives. |
| tRAS | Temps entre une commande ACT et une commande PRECHARGE. |
Les délais/timings mémoire ne sont pas les mêmes suivant la barrette de mémoire que vous achetez. Certaines mémoires sont ainsi conçues pour avoir des timings assez bas et sont donc plus rapides, et surtout : beaucoup plus chères que les autres. Le gain en performances dépend beaucoup du processeur utilisé et est assez minime comparé au prix de ces barrettes. Les délais mémoires d'une barrette sont mémorisés dans le Serial Presence Detect de la barrette et sont lus par le BIOS au démarrage de l'ordinateur, et sont ensuite utilisés pour configurer le contrôleur de DRAM.
Il y a cependant quelques régularités qui reviennent souvent, d'une SDRAM à l'autre. La plus importante est que les délais ne sont pas les mêmes quand on alterne des lectures et écritures. Les délais les plus courts sont observés quand on a des lectures successives, ou des écritures successives. Par contre, les délais s'allongent quand on doit passer d'une lecture à une écriture ou inversement. Les SDRAM préférent qu'on regroupe les lectures avec d'autres lectures, les écritures avec d'autres écritures.
Les commandes anticipées
[modifier | modifier le wikicode]Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Concrètement, pendant que la commande précédente envoie sa dernière donnée sur le bus de données, on peut envoyer la commande suivante avec quelques cycles d'avance. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au neuvième cycle, alors qu'une rafale est en cours.
| Cycle 1 | Cycle 2 | Cycle 3 | Cycle 4 | Cycle 5 | Cycle 6 | Cycle 7 | Cycle 8 | Cycle 9 | Cycle 10 | Cycle 11 | Cycle 12 | Cycle 13 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Bus de commande/adresse | ACT | READ (1) | READ (2) | ||||||||||
| Bus de données | READ 1 | READ 1 | READ 1 | READ 1 | READ 2 | READ 2 | READ 2 | READ 2 | |
Il s'agit d'une forme très limitée de pipeline, tellement limitée qu'on peut légitimement douter que c'est un vrai pipeline. Dans ce qui suit, j'ai décidé d'appeler cette possibilité sous le terme de commandes SDRAM anticipées. La possibilité est très limitée, car il faut tenir compte des délais mémoire. Elle améliore un peu les performances dans certaines circonstances où la RAM doit traiter plusieurs accès mémoire consécutifs, très rapprochés. L'exemple typique est celui du transfert d'un bloc de données entre mémoire cache et mémoire RAM, qui dépasse la taille d'une rafale. Le cache envoie alors plusieurs accès mémoire d'un seul coup au contrôleur mémoire. Mais d'autres exemples sont possibles, on ne peut juste pas les expliquer à ce stade du cours.
Les commandes SDRAM anticipées sont possibles car les SDRAM sont formées en entourant une RAM asynchrone de registres, exactement comme les SRAM synchrones. Il est possible d'écrire dans les registres de données/commandes, pendant qu'un autre accès mémoire accède au cœur asynchrone. Les délais mémoire sont conçus pour éviter qu'une commande accède au cœur asynchrone en même temps que la suivante ou la précédente, idem pour l'usage des registres. C'est pour cela que les délais mémoire sont assez différents entre écritures et lectures, d'ailleurs.
| Cycle 1 | Cycle 2 | Cycle 3 | Cycle 4 | Cycle 5 | Cycle 6 | Cycle 7 | Cycle 8 | Cycle 9 | Cycle 10 | Cycle 11 | Cycle 12 | Cycle 13 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Enregistrement de la commande dans le registre d'adresse/commande | READ (1) | READ (2) | |||||||||||
| Accès au cœur asynchrone | READ (1) | READ (1) | READ (1) | READ (2) | READ (2) | READ (2) | |||||||
| Lecture/écriture du registre de données | READ 1 | READ 1 | READ 1 | READ 1 | READ 2 | READ 2 | READ 2 | READ 2 | |
Les DDR2 et 3 vont encore plus loin avec l'optimisation des CAS postés. L'idée est que le contrôleur mémoire peut envoyer une commande READ/WRITE sans se soucier des timings. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur mémoire peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les timings mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur mémoire.
Les mémoires DDR
[modifier | modifier le wikicode]Les mémoires SDRAM récentes sont des mémoires de type dual data rate, ce qui fait qu'elles portent le nom de mémoires DDR. Pour rappel, les mémoires dual data rate ont un plan mémoire deux fois plus large que le bus mémoire, avec un bus mémoire allant à une fréquence double. Par double, on veut dire que les transferts sur le bus mémoire ont lieu sur les fronts montants et descendants de l'horloge. Il y a donc deux transferts de données sur le bus pour chaque cycle d'horloge, ce qui permet de doubler le débit sans toucher à la fréquence du plan mémoire lui-même.
Les mémoires DDR sont standardisées par un organisme international, le JEDEC, et ont été déclinées en plusieurs générations : DDR1, DDR2, DDR3, et DDR4. La différence entre ces modèles sont très nombreuses, mais les plus évidentes sont la fréquence de la mémoire et du bus mémoire. D'autres différences mineures existent entre les SDRAM et les mémoires DDR. Par exemple, la tension d'alimentation des mémoires DDR est plus faible que pour les SDRAM. ET elle a diminué dans le temps, d'une génération de DDR à l'autre. Avec les mémoires DDR2,la tension d'alimentation est passée de 2,5/2,6 Volts à 1,8 Volts. Avec les mémoires DDR3, la tension d'alimentation est notamment passée à 1,5 Volts.
Les performances des mémoires DDR
[modifier | modifier le wikicode]Les mémoires SDRAM ont évolué dans le temps, mais leur temps d'accès/fréquence n'a pas beaucoup changé. Il valait environ 10 nanosecondes pour les SDRAM, approximativement 5 ns pour la DDR-400, il a peu évolué pendant la génération DDR et DDR3, avant d'augmenter pendant les générations DDR4 et de stagner à nouveau pour la génération DDR5. L'usage du DDR, puis du QDR, visait à augmenter les performances malgré la stagnation des temps d'accès. En conséquence, la fréquence du bus a augmenté plus vite que celle des puces mémoire pour compenser.
| Année | Type de mémoire | Fréquence de la mémoire (haut de gamme) | Fréquence du bus | Coefficient multiplicateur entre les deux fréquences |
|---|---|---|---|---|
| 1998 | DDR 1 | 100 - 200 MHz | 200 - 400 MHz | 2 |
| 2003 | DDR 2 | 100 - 266 MHz | 400 - 1066 MHz | 4 |
| 2007 | DDR 3 | 100 - 266 MHz | 800 - 2133 MHz | 8 |
| 2014 | DDR 4 | 200 - 400 MHz | 1600 - 3200 MHz | 8 |
| 2020 | DDR 5 | 200 - 450 MHz | 3200 - 7200 MHz | 8 à 16 |
Une conséquence est que la latence CAS, exprimée en nombre de cycles, a augmenté avec le temps. Si vous comparez des mémoires DDR2 avec une DDR4, par exemple, vous allez voir que la latence CAS est plus élevée pour la DDR4. Mais c'est parce que la latence est exprimée en nombre de cycles d'horloge, et que la fréquence a augmentée. En comparant les temps d'accès exprimés en secondes, on voit une amélioration.
Les commandes des mémoires DDR
[modifier | modifier le wikicode]Les commandes des mémoires DDR sont globalement les mêmes que celles des mémoires SDRAM, vues plus haut. Les modifications entre SDRAM, DDR1, DDR2, DDR3, DDR4, et DDR5 sont assez mineures. Les seules différences sont l'addition de bits pour la transmission des adresses, des bits en plus pour la sélection des banques, etc. En clair, une simple augmentation quantitative.
Le registre de mode a été un peu modifié. Il est passé de 10 bits pour les SDRAM et DDR1, à 13 bits sur la DDR 2 et les suivantes. Les DDR ont aussi ajouté le support de plusieurs registres de mode, qui sont sélectionnés en réutilisant l'adresse de banque. Dans une commande LOAD MODE REGISTER, l'adresse de banque indique quel registre de mode il faut altérer.
Avant la DDR4, les modifications des commandes sont mineures. La DDR2 supprime la commande Burst Terminate, la DDR3 et la DDR4 utilisent le bit A12 pour préciser s'il faut faire une rafale complète, ou une rafale de moitié moins de données. Une optimisation des DDR2 et 3 est celle des CAS postés. L'idée est que le contrôleur de DRAM peut envoyer une commande ACT et une commande READ/WRITE sans se soucier des timings nécessaires entre les deux. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur de DRAM peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les timings mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur de DRAM.
Mais avec la DDR4, les choses changent, notamment au niveau de la commande ACT. Avec l'augmentation de la capacité des barrettes mémoires, la taille des adresses est devenue trop importante. Pour éviter de rajouter des bits d'adresses, les concepteurs du standard DDR4 ont décidé de ruser. Lors d'une commande ACT, les bits RAS, CAS et WE sont utilisés comme bits d'adresse, alors qu'ils ont leur signification normale pour les autres commandes. Pour éviter toute confusion, un nouveau bit ACT est ajouté pour indiquer la présence d'une commande ACT : il est à 1 pour une commande ACT, 0 pour les autres commandes.
| Bit CS | Bit ACT | Bit RAS | Bit CAS | Bit WE | Bits de sélection de banque (4 bits) | Bit du bas d'adresse A10 | Reste du bus d'adresse | Nom de la commande : Description |
|---|---|---|---|---|---|---|---|---|
| 1 | X | Absence de commandes. | ||||||
| 0 | 0 | 1 | 1 | 1 | X | No Operation : Pas d'opération | ||
| 0 | 0 | 1 | 1 | 0 | X | Burst Terminante : Arrêt d'un accès en rafale en cours. | ||
| 0 | 0 | 1 | 0 | 1 | Adresse de la banque | 0 | Adresse de la colonne | READ : lire une donnée depuis la ligne active. |
| 0 | 0 | 1 | 0 | 1 | Adresse de la banque | 1 | Adresse de la colonne | READA : lire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |
| 0 | 0 | 1 | 0 | 0 | Adresse de la banque | 0 | Adresse de la colonne | WRITE : écrire une donnée depuis la ligne active. |
| 0 | 0 | 1 | 0 | 0 | Adresse de la banque | 1 | Adresse de la colonne | WRITEA : écrire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |
| 0 | 1 | Adresse de la ligne (bits de poids forts) | Adresse de la banque | Adresse de la ligne (bits de poids faible) | ACT : charge une ligne dans le tampon de ligne. | |||
| 0 | 0 | 0 | 1 | 0 | Adresse de la banque | 0 | X | PRECHARGE : précharge le tampon de ligne dans la banque voulue. |
| 0 | 0 | 0 | 1 | 0 | Adresse de la X | 1 | X | PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques. |
| 0 | 0 | 0 | 0 | 1 | X | Auto refresh : Demande de rafraichissement, gérée par la SDRAM. | ||
| 0 | 0 | 0 | 0 | 0 | Numéro de registre de mode | Nouveau contenu du registre de mode | LOAD MODE REGISTER : configure le registre de mode. | |
Les SDRAM basse consommation : les LPDDR
[modifier | modifier le wikicode]Il existe des variantes de mémoire DDR qui sont optimisées pour consommer le moins d'énergie possible. Elles s'appelle les mémoires LP-DDR, abréviation de Low Power DDR. Elles sont utilisées dans les ordinateurs portables, les smartphones et autres équipements de ce type, pour lesquels l'autonomie de la batterie est très importante. Pour économiser de l'énergie, elles disposent de plusieurs armes, dont les principales sont les suivantes : une tension d'alimentation réduite, des mode de mise en veille optimisés, des modes de rafraichissement mémoire optimisés, des caractéristiques électriques spécifiques.
Une différence importante est qu'elles ont une tension d'alimentation réduite comparé à une SDRAM/DDR de même génération, ce qui réduit drastiquement la consommation d'énergie. De plus, elles disposent de modes de mise en veille profonde, où seule une partie de la SDRAM est rafraichie;, par exemple moitié ou le quart de la mémoire. L'avantage est que seule la partie de la RAM contenant effectivement des données est rafraichie. Enfin, elles intègrent un rafraichissement dépendant de la température, où les rafraichissements sont d'autant plus fréquents que la température de la LPDDR est élevée. L’avantage est que cela permet de réduire la fréquence de rafraichissement quand l'ordinateur est en veille et chauffe peu.
Elles ne se présentent pas souvent sous la forme de barrettes de RAM, comme les DDR normales. A la place, elles sont soudées sur la carte mère, dans le cas le plus fréquent. Les barrettes de LPDDR sont très rares. Le fait de souder les puces sur la carte mère a de nombreux avantages : ça prend moins de place, consomme moins, permet de garder des performances optimales, etc. Un autre détail, lié au précédent, est qu'elles utilisent souvent des bus plus petits. Là où les barrettes de SDRAM/DDR usuelles ont un bus de 64 bits, les LPDDR peuvent utiliser des bus de 16 ou 32 bits.
Les LPDDR sont nommées comme les DDR, avec des LPDDR 1, 2, 3, etc. La LPDDR 1 est une DDR 1 ayant subit des modifications assez mineures. La tension d'alimentation passe de 2,5 V à seulement 1,8 V, des modes de rafraichissement ont été ajouté, de même qu'un mode de mise en veille profonde. Par contre, les LPDDR 2/3/4/5 se démarquent fortement des DDR 2/3/4/5 équivalentes. Par exemple, la LPDDR 2 ne correspond pas du tout à de la DDR2 modifiée. Elles se différencient des DDR normales sur de nombreux points, afin de consommer le moins possible. Notamment, les commandes DDR sont modifiées, au point qu'une LPDDR et une DDR sont incompatibles entre elles.
Un point important est que les commandes sont envoyées en deux fois. Sur les LPDDR 2, 3 et 5, l'envoi se fait en un seul cycle d'horloge : la première moitié lors d'un front montant de l'horloge, l'autre moitié lors du front descendant. Les LPDDR 1 et 4 envoient les commandes en deux cycles d'horloge. Une conséquence est que le bus de commande est quasiment divisé par deux comparé à une SDRAM/DDR équivalente. Il est de 10 bits sur les LPDDR 1, 2 et 3 ; de 6 bits sur les LPDDR4, de 7 bits sur les LPDDR 5, et de 4 bits sur les LPDDR6. Les commandes varient d'une LPDDR à l'autre, mais restent similaires aux commandes DDR/SDR classiques, si ce n'est que quelques bits d'adresse sont retirés. Par exemple, sur les LPDDR 2, le bit de poids faible de l'adresse CA0 n'est pas transmis, ce qui fait que les lectures/écritures se font toujours à des adresses paires.
A partir de la LPDDR 2, les registres de mode ont été élargit, afin de mémoriser des informations de configuration. Les nouveaux registres de mode ont pour but de remplacer le Serial Presence Detect, afin de faire quelques économies sur la carte mère.
Les VRAM des cartes vidéo
[modifier | modifier le wikicode]Les cartes graphiques ont des besoins légèrement différents des DRAM des processeurs, ce qui fait qu'il existe des mémoires DRAM qui leur sont dédiées. Elles sont appelés des Graphics RAM (GRAM). La plupart incorporent des fonctionnalités utiles uniquement pour les mémoires vidéos, comme des fonctionnalités de masquage (appliquer un masque aux données lue ou à écrire), ou le remplissage d'un bloc de mémoire avec une donnée unique.
Les anciennes cartes graphiques et les anciennes consoles utilisaient de la DRAM normale, faute de mieux. La première GRAM utilisée était la NEC μPD481850, qui a été utilisée sur la console de jeu PlayStation, à partir de son modèle SCPH-5000. D'autres modèles de GRAM ont rapidement suivi. Les anciennes consoles de jeu, mais aussi des cartes graphiquesn utilisaient des GRAM spécifiques.
Les mémoires vidéo double port
[modifier | modifier le wikicode]Sur les premières consoles de jeu et les premières cartes graphiques, le framebuffer était mémorisé dans une mémoire vidéo spécialisée appelée une mémoire vidéo double port. Le premier port était connecté au processeur ou à la carte graphique, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le port CPU/GPU et l'autre sera appelé le port CRT. Le premier port était utilisé pour enregistrer l'image à calculer et faire les calculs, alors que le second port était utilisé pour envoyer à l'écran l'image à afficher. Le port CPU/GPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit.
De telles mémoires étaient des mémoires à tampon de ligne, dont le support de mémorisation était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement.
Pour cela, les mémoires vidéo double port incorporaient un tampon de ligne spécialisé pour le port lié à l'écran. Ce tampon de ligne n'était autre qu'un registre à décalage, contrairement au tampon de ligne normal. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre.
Les mémoires SGRAM et GDDR
[modifier | modifier le wikicode]De nos jours, les cartes graphiques n'utilisent plus de mémoires double port, mais des mémoires simple port. Les mémoires graphiques actuelles sont des SDRAM modifiées pour fonctionner en tant que Graphic RAM. Les plus connues sont les mémoires GDDR, pour graphics double data rate, utilisées presque exclusivement sur les cartes graphiques. Il en existe plusieurs types pendant que j'écris ce tutoriel : GDDR, GDDR2, GDDR3, GDDR4, et GDDR5. Mais attention, il y a des différences avec les DDR normales. Par exemple, les GDDR ont une fréquence plus élevée que les DDR normales, avec des temps d'accès plus élevés (sauf pour le tCAS). De plus, elles sont capables de laisser ouvertes deux lignes en même temps. Par contre, ce sont des mémoires simple port.
Les mémoires SLDRAM, RDRAM et associées
[modifier | modifier le wikicode]Les mémoires précédentes sont généralement associées à des bus larges. Les mémoires SDRAM et DDR modernes ont des bus de données de 64 bits de large, avec des d'adresse et de commande de largeur similaire. Le nombre de fils du bus mémoire dépasse facilement la centaine de fils, avec autant de broches sur les barrettes de mémoire. Largeur de ces bus pose de problèmes problèmes électriques, dont la résolution n'est pas triviale. En conséquence, la fréquence du bus mémoire est généralement moins performantes comparé à ce qu'on aurait avec un bus moins large.
Mais d'autres mémoires DRAM ont exploré une solution alternative : avoir un bus peu large mais de haute fréquence, sur lequel on envoie les commandes/données en plusieurs fois. Elles sont regroupées sous le nom de DRAM à commutation par paquets. Elles utilisent des bus spéciaux, où les commandes/adresses/données sont transmises par paquets, par trames, en plusieurs fois. En théorie, ce qu'on a dit sur le codage des trames dans le chapitre sur le bus devrait s'appliquer à de telles mémoires. En pratique, les protocoles de transmission sur le bus mémoire sont simplifiés, pour gérer le fonctionnement à haute fréquence. Le processeur envoie des paquets de commandes, les mémoires répondent avec des paquets de données ou des accusés de réception.
Les mémoires à commutation par paquets sont peu nombreuses. Les plus connues sont les mémoires conçues par la société Rambus, à savoir la RDRAM (Rambus DRAM) et ses deux successeurs XDR RAM et XDR RAM 2. La Synchronous-link DRAM (SLDRAM) est un format concurrent conçu par un consortium de plusieurs concepteurs de mémoire.
La SLDRAM (Synchronous-link DRAM)
[modifier | modifier le wikicode]Les mémoires SLDRAM avaient un bus de données de 64 bits allant à 200-400 Hz, avec technologie DDR, ce qui était dans la norme de l'époque pour la fréquence (début des années 2000). Elle utilisait un bus de commande de 11 bits, qui était utilisé pour transmettre des commandes de 40 bits, transmises en quatre cycles d'horloge consécutifs (en réalité, quatre fronts d'horloge donc deux cycles en DDR). Le bus de données était de 18 bits, mais les transferts de donnée se faisaient par paquets de 4 à 8 octets (32-65 bits). Pour résumer, données et commandes sont chacunes transmises en plusieurs cycles consécutifs, sur un bus de commande/données plus court que les données/commandes elle-mêmes.
Là où les SDRAM sélectionnent la bonne barrette grâce à des signaux de commande dédiés, ce n'est pas le cas avec la SLDRAM. À la place, chaque barrette de mémoire reçoit un identifiant, un numéro codé sur 7-8 bits. Les commandes de lecture/écriture précisent l'identifiant dans la commande. Toutes les barrettes reçoivent la commande, elles vérifient si l'identifiant de la commande est le leur, et elles la prennent en compte seulement si c'est le cas.
Voici le format d'une commande SLDRAM. Elle contient l'adresse, qui regroupe le numéro de banque, le numéro de ligne et le numéro de colonne. On trouve aussi un code commande qui indique s'il faut faire une lecture ou une écriture, et qui configure l'accès mémoire. Il configure notamment le mode rafale, en indiquant s'il faut lire/écrire 4 ou 8 octets. Enfin, il indique s'il faut fermer la ligne accédée une fois l'accès terminé, ou s'il faut la laisser ouverte. Le code commande peut aussi préciser que la commande est un rafraichissement ou non, effectuer des opérations de configuration, etc. L'identifiant de barrette mémoire est envoyé en premier, histoire que les barrettes sachent précocement si l'accès les concerne ou non.
| FLAG | CA9 | CA8 | CA7 | CA6 | CA5 | CA4 | CA3 | CA2 | CA1 | CA0 |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Identifiant de barrette mémoire | Code de commande | ||||||||
| 0 | Code de commande | Banque | Ligne | |||||||
| 0 | Ligne | 0 | ||||||||
| 0 | 0 | 0 | 0 | Colonne | ||||||
Les mémoires Rambus
[modifier | modifier le wikicode]Les mémoires conçues par la société Rambus regroupent la RDRAM (Rambus DRAM) et ses deux successeurs XDR RAM et XDR RAM 2.
Les toutes premières étaient les mémoires RDRAM, où le bus permettait de transmettre soit des commandes (adresse inclue), soit des données, avec un multiplexage total. Le processeur envoie un paquet contenant commandes et adresse à la mémoire, qui répond avec un paquet d'acquittement. Lors d'une lecture, le paquet d'acquittement contient la donnée lue. Lors d'une écriture, le paquet d'acquittement est réduit au strict minimum. Le bus de commandes est réduit au strict minimum, à savoir l'horloge et quelques bits absolument essentiels, les bits RW est transmis dans un paquet et n'ont pas de ligne dédiée, pareil pour le bit OE. Toutes les barrettes de mémoire doivent vérifier toutes les transmissions et déterminer si elles sont concernées en analysant l'adresse transmise dans la trame.
Elles ont été utilisées dans des PC ou d'anciennes consoles de jeu. Par exemple, la Nintendo 64 incorporait 4 mébioctets de mémoire RDRAM en tant que mémoire principale. La RDRAM de la Nintendo 64 était cadencée à 500 MHz, utilisait un bus de 9 bits, et avait un débit binaire maximal théorique de 500 MB/s. La Playstation 2 contenait quant à elle 32 mébioctets de RDRAM en dual-channel, pour un débit binaire de 3.2 Gibioctets par seconde. Les processeurs Pentium 3 pouvaient être associés à de la RDRAM sur certaines mères. Les Pentium 4 étaient eux aussi associés à la de RDRAM, mais les cartes mères ne géraient que ce genre de mémoire. La Playstation 3 contenait quant à elle de la XDR RAM.
Les eDRAM : des DRAM adaptées aux chiplets
[modifier | modifier le wikicode]Les mémoires eDRAM, pour embedded DRAM, sont des mémoires RAM qui sont destinées à être intégrée au processeur. Pour comparer, les DRAM normales sont placées sur des barrettes de RAM ou soudées à la carte mère. Dans la quasi-totalité des cas, l'eDRAM est utilisée pour implémenter une mémoire cache, elle ne sert pas de mémoire principale (cache L4, le plus proche de la mémoire sur ces puces). De ce fait, elles sont conçues pour être très rapides, avoir une grande bande passante, au détriment de leur capacité mémoire.
Pour être plus précis, l'eDRAM est une puce de DRAM conçue pour être intégrée dans un chiplet, , à savoir des circuits imprimés qui regroupent plusieurs puces électroniques distinctes, regroupées sur le même PCB. Typiquement, un processeur de type chiplet avec de l'eDRAM comprend deux puces séparées : une pour le processeur, une autre pour une puce de communication avec la RAM. Avec la mémoire eDRAM, les deux puces sont complétées par une troisième puce spécialisée qui incorpore l'eDRAM.
Elle a été utilisée sur quelques processeurs, mais aussi dans des consoles de jeu vidéo, pour la carte graphique des consoles suivantes : la PlayStation 2, la PlayStation Portable, la GameCube, la Wii, la Wii U, et la XBOX 360. Sur ces consoles, la RAM de la carte graphique était intégrée avec le processeur graphique dans le même circuit. La fameuse mémoire vidéo et le GPU n'étaient qu'une seule et même puce électronique, un seul circuit intégré. Ce n'est pas le cas sur une carte graphique moderne : regardez votre carte graphique avec attention et vous verrez que le GPU est une puce carrée située sous les ventilateurs, alors que les puces mémoires sont situées juste autour et soudées sur le PCB de la carte.
Les processeurs Intel Core de microarchitecture Broadwell disposaient d'un cache L4 de 128 mébioctets, intégralement implémenté avec de la mémoire eDRAM. Quelques processeurs de la microarchitecture précédente (Haswell), disposaient aussi de ce cache. Le cache L4 eDRAM était implémenté sur un chiplet à part, à savoir que le processeur était composé de trois puces séparées : une pour le processeur, une autre pour la gestion des entrées-sorties, et une autre pour le cache L4. La puce pour le cache L4, appelée Crystal Well, était gravée en 22nm, ce qui était une finesse de gravure plus élevée que celle des processeurs associés.
Crystal Well était très optimisé pour l'époque. Par exemple, elle disposait de bus séparées pour la lecture et l'écriture, chose qu'on retrouve fréquemment sur les SRAM mais qui est absent sur les mémoires DRAM actuelles. Pour le reste, elle ressemblait beaucoup aux mémoires DDR de l'époque (système de double data rate, entres autres), mais elle allait à une fréquence plus élevée que les DRAM de l'époque et avait un débit bien plus élevé, pour une consommation moindre. Crystal Well consommait entre 1 à 5 watts (1 watt en veille, 5 à pleine utilisation), pour un débit binaire de 102 GB/s et fonctionnait à 3.2 GHz.



